推荐git 的图形化界面
- SourceTree 个人感觉是一个值得推荐的图形化工具
git 相关信息命令
echo `git symbolic-ref --short -q HEAD`
打印分支名echo `git log -1 --decorate=short --oneline`
打印当前分支信息
✗ echo `git log -1 --decorate=short --oneline`
bc085bcda4 (HEAD -> branch, origin/branch) branch_info
echo `git log -1 --format="%ct"`
打印最后一次提交的short commitecho `git log -1 --pretty=format:%H`
打印最后一次提交的 long commit
主要命令
-
git add .
添加,准备提交。 -
git reset commitID
重置 HEAD 的位置 (不建议使用) -
git reset --hard
重置 HEAD 的位置,并清除修改内容 -
git revert [commitId]
重置某次提交,生成新的提交记录 -
git commit -m '[这里是修改的内容]'
修改所有提交的内容,这样git 中就会多一个提交记录。 -
git commit --amend
合并本地的上次提交记录并修改提交信息 -
git push [origin branchName]
将 git 本地的代码 push 到远端 -
git merge master
将 master 分支的代码合并到当前分支, 会生成新的合并节点。 -
git cherry-pick [commitId]
将 commitId 的提交内容提取到当前分支。 -
git cherry-pick (commitId0..commitId1]
批量
PULL
- git pull
git pull = git fetch + git merge FETCH_HEAD
git pull --rebase = git fetch + git rebase FETCH_HEAD
修改分支名
修改本地分支 dev 名为 dev0
git branch -m [dev0]
修改本地分支名git push origin :[dev]
删除远程分支git push origin [dev0]
把分支推送到远端git branch --set-upstream-to=origin/dev dev
重新设置远程跟踪git push --set-upstream origin pb_punch
设置远程跟踪并推向远端(还没有验证,应该可以使用)git branch -vv
查看最终结果
dev0 2360e01 [origin/dev0] 0
REBASE
进行 rebase 操作后记得一定要检查提交记录(确保 rebase 完成提交过程中远端没有新的 commit),并删除远程相关分支
-
pull --no-commit --rebase origin master
当前分支变基到 master 上 -
git rebase master
将当前分支的所有提交记录,逐条提交到 master 的后方(注:提交的 commitId 会有变化) -
git rebase [master] [branchA]
以 master 分支为基准将 branchA 的记录追加到 master 之后。 -
git rebase -i [commitId]
将当前分支指定挑选 commit 记录,修改形成新的分支。(注:这个用命令行操作不太会使用) -
git rebase maseter -i [commitId]
将 master 分支指定挑选 commit 记录,修改形成新的分支。 -
git rebase maseter -i branchA
将 master 分支指定挑选 commit 记录,修改追加到 branchA 分支之后。 -
git rebase branchA master
以 branchA 为基准分支,将 master 的提交记录放在 branchA 之后。 -
git rebase --continue
继续进行 rebase -
git rebase --skip
跳过某个提交记录 -
git rebase --abort
取消本次 rebase 过程 -
git push
将本地代码推送到远端 -
git push -f
当git rebase [branch]
之后本地分支和远程分支记录发生变化时候使用,本地记录强制覆盖远端。(注:不推荐使用,多人公用分支时候可能会覆盖他人代码) -
git push --force-with-lease
比git push -f
安全, 在覆盖远端的时候会检测远端是否有新的提交变化,如果有则强制覆盖失败。 -
git branch -m '[dev0]'
把当前分支名修改为 dev0 -
git branch -m '[dev0] && git push origin [dev0]'
修改分支名以后推送到远端。[注:在rebase完成只有使用该方法或许也是一个避免代码丢失的好方法] -
git rebase [commitId0] [commitId1] --onto [branchname]
将提交区间(commitId0, commitId1] 所有提交记录 rebase 到 branchname 分支上 -
git reset --hard origin/foo
foo根据远程存储库,这将简单地抛弃本地状态以支持其历史记录 -
git checkout -b [branchname]
基于当前分支创建一个新的分支branchname -
git checkout -b [branchname] [develop]
基于develop分支创建一个新的分支branchname -
git checkout -- [filepath]
将缓存区的文件替换工作区的问题件
Rebase 和 Merge 的区别
merge操作会生成一个新的节点,之前的提交分开显示。
而rebase操作不会生成新的节点,是将两个分支融合成一个线性的提交。
- 初始状态
D---E test
/
A---B---C---F--- master
- 在master执行git merge test,然后会得到如下结果:
D--------E
/ \
A---B---C---F----G--- test, master
- 在master执行git rebase test,然后得到如下结果:
A---B---D---E---C'---F'--- test, master
- REBASE 好处
想要更好的提交树,使用rebase操作会更好一点。
这样可以线性的看到每一次提交,并且没有增加提交节点。
merge 操作遇到冲突的时候,当前merge不能继续进行下去。手动修改冲突内容后,add 修改,commit 就可以了。
而rebase 操作的话,会中断rebase,同时会提示去解决冲突。
解决冲突后,将修改add后执行git rebase –continue继续操作,或者git rebase –skip忽略冲突。
忽略文件添加
- 查看哪一行规则导致文件被忽略s使用命令
git check-ignore -v [path/filename]
增加了规则却没有效果
.gitignore 只能作用于 Untracked Files,也就是那些从来没有被 GIT 记录过的文件,如果文件被 GIT 记录过,那么 .gitignore 对它们完全无效!
- 对于已经维 护起来的文件,可以使用如下命令:
git update-index --assume-unchanged <file>
- 使用该命令后,即使我们修改了该文件,GIT 也会默认我们没有修改,可以通过如下命令恢复
git update-index --no-assume-unchanged <file>
- git上传的时候,我们已经将 xxx 文件添加到了.gitignore 中,但是在push 后,远程仓库还是会显示此文件。
- 原因
xxx 文件在前面已经被 git 跟踪,在这之后再添加到 .gitignore 中是无效的。 - 解决方法
在 .gitignore 中添加后,清除一下此文件的 git 缓存,git -rm -r --cached [path/file]
文件名, 然后再进行 commit和 push即可。
添加忽略文件流程
// 添加忽略文件
vi .gitignore
// 删除文件追踪
git rm -r --cached [path/file]
// 提交到远端
git add .
git commit -m 'update .gitignore'
STASH
git add . && git stash
暂存当前提交(暂存是一个栈)git stash list
查看 stash 内容
stash@{0}: WIP on dev: 1da4696 bbb
-
git stash pop stash@{0}
存暂存区取出暂存内容(注:弹出第一条 stash,只可以应用一次后) -
git stash apply stash@{0}
存暂存区取出暂存内容(注:应用一条 stash,可以多次应用) -
git stash save "save message"
: 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。 -
git stash list
:查看stash了哪些存储*) -
git stash show
:显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1} -
git stash show -p
: 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show stash@{$num} -p ,比如第二个:git stash show stash@{1} -p -
git stash apply
:应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1} -
git stash pop
:命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1} -
git stash drop stash@{$num}
:丢弃stash@{$num}存储,从列表中删除这个存储 -
git stash clear
:删除所有缓存的stash -
git fsck --lost-found
stash 不小心clear 找回方法
TAG
-
git tag
查看所有的 tag -
git tag [branch_tag] -m 'describe'
标记标签 v0 -
git tag --delete [branch_tag]
删除本地 tag -
git tag -a [tagName]
添加标签 -
git push origin --tag [tagName]
把标签推送到远端 -
git push origin tag --delete [tagName]
删除远端的tag -
git push origin [tagName]
push单个tag,命令格式为:git push origin [tagname] -
git push origin tag --delete [dev]
删除标签 dev (注:可以避免分支名和标签名重复的情况) -
git push origin v1.0
将本地v1.0的tag推送到远端服务器 -
git push origin tag [tagName]
将本地 tag 的tagName推送到远端服务器 -
git push --tags
或git push origin --tags
本地的 tag 推送到远端 -
git push origin --tag :[tagName]
删除远程标签
辅助重要命令
-
gitk -all
或git log --graph
查看所有提交就的 graph -
git reflog
查看所有 log 包含已将删除的分支日志 -
git shortlog -s -n
查看提交的统计信息 -
git describe branchA
查看当先分支描述(注:小长假后查看分支状态的好帮手) -
git fetch -p
更新本地的追踪日志(注:删除本地远程已经不存在的追踪,这个很有用 fetch 时候强烈建议添加参数 -p) -
git branch -vv
查看本地分支的远程同步状态(注:执行git fetch -p
命令后才可以正常使用),如果发现有本地分支在远程中删除,强烈建议删除本地分支
➜ gitlearning git:(dev) ✗ git branch -vv
* dev 1da4696 bbb
master 1da4696 [origin/master] bbb
git branch --unset-upstream
取消 upstream 流操作 (注:如果发现远程分支被删除执行这条命令,或者直接删除这个本地分支)
分支管理同步
git branch -a
查看本地和远程分支的情况git remote show origin
查看本地和远程跟踪情况,有 stale 标识的为过时分支git remote prune origin
和git fetch -p
为同步远程分支
不建议使用名利(可能个人还没有弄明白使用场景)
git rebase [otherBranch] --rebase
:将某个分支的代码rebase 到当前分支。(没有稳定性,会导致提交顺序为倒序)
其它设置
git config --global pull.rebase true
git config --global rebase.autoStash true
Submodule 常用命令
git submodule add [gitRemoteUrl] [submodule-dir]
添加 submodulegit submodule set-branch --branch [branch-name] [submodule-dir]
修改指定 submodule 的分支名git submodule update --remote
同步 submodule 和远程对应分支的代码git submodule update
同步 submodule 的当前分支和远程分支的代码,如果修改的 submodule 配置的分支则无效git submodule init
git submodule sync
git submodule foreach '[git command]'
问题解决
warning: There are too many unreachable loose objects; run ‘git prune’ to remove them.
原因是因为提交的改动过多,导致本地的缓冲区占用太大。
解决方法: 可以执行以下命令,清理优化本地的 git 项目
git gc --prune=now
您的一举一动都是对我的莫大支持
您的一举一动都是对我的莫大支持
友情链接
推荐练习 git 命令的好工具
- 工具可以练习 初级,中级,高级的命令内容。
- 但是对于开发者来说,这些练习都是初级用法,可不要偷懒哦!!!
工具