使用git做开发的版本管理也有一年半之多了,但是始终都是常用的branch commit status diff push等一些再常用不过的命令,最近闲下来,打算学习一下高端用法,所以就静下心来好好读了一下蒋鑫老师的《Git权威指南》,果然受益匪浅,加上之前搭建过gerrit审核服务器,做过gitiles搭建等,感觉目前来说对于git能算是一个小小的里程碑了,记录一下觉得很有用的命令。
常用篇:
git commit -s 提交信息中会存有Signed-off-by: <user.name> <user.email>信息 git commit -am 添加当前本地修改并写commit信息 如 git commit -am 'test' git log --graph --oneline 简介显示git log,一行,树状图形。 git log -p 显示每个commit的diff信息 git log --stat [-num] 显示每个commit所修改的文件信息,显示最近num次 git tag <tag name> 在当前位置创建tag,加-m参数后可跟描述 git tag -d <tag name> 删除某tag git tag -ln 显示当前的tag及描述列表 git push <remote> <tag> 推送本地tag至远端remote git push <remote> :<tag> 删除远端tag git diff --word-diff 逐词比较 git clone [--bare] [--mirror] repository directory[.git] 不带参数的时候就是将repository 克隆到本地成为工作区,版本库在.git目录下 --bare 是克隆到本地成为git裸版本库,可以对其进行推送(git push) --mirror 是克隆到本地成为git版本库,对上游版本库进行了注册,所以在此版本库中可以执行git fetch操作进行持续更新
进阶篇:
git stash [sava <message>] 将工作区修改暂存 git stash list 查看保存的进度 git stash pop <stash> 将git stash暂存的修改弹出 stash为git stash list的标号 git stash clear 删除所有存储的进度 git stash drop <stash> 删除一个保存的进度,默认是最新的那个 git rev-parse --show-toplevel 显示当前git仓储的绝对路径 git format-patch [-s] <since> <till> 将从since到till的commit转换成patch,-s代表需要签名。 cat *.patch | git am 应用git format-patch生成的patch
BUG篇:
git blame [-L <num>] <file> 文件追溯,如果某个文件(哪行)导致了一个bug,可以通过这个命令快速查看这里是谁提交的,例: git blame -L 6, +10 main.c 看main.c从第六行起后边10行的commit信息。 二分查找 git bisect start [BAD] [GOOD] 开始记录二分查找 git bisect good/bad 把某个commit标记为好/坏的版本 如果有标记错的情况: git bisect log > logfile git bisect reset 编辑logfile将错误的那条删除或#注释,然后 git bisect replay logfile git bisect run [cmd] bisect支持自动搜索,cmd可以是shell命令,shell脚本,其他脚本等等。如: git bisect run make git bisect run ~/test_case.sh git bisect run sh -c 'make' 返回0代表good 返回125代表跳过 返回1~127(除125)代表bad
反悔篇:
git reflog show dev 查看本地分支dev的提交记录,可用于恢复reset的内容 e875f66 dev@{0}: merge e875f66afec3177c69f420e5c23d78887676ae4a: Fast-forward 2923439 dev@{1}: merge 29234390a3b0a65be9c9e751914ecc0d0a175ba3: Fast-forward bc51812 dev@{2}: merge bc51812ad4faf78421cb4ccff4b8bb9d1badab13: Fast-forward git reset --hard dev@{2} 恢复到dev@{2}处,相当于反操作0 1的动作。 git commit --amend [-m <commit message>] 修改已经commit过的commit信息 git checkout [commit/branch/tag...] --path 将本地path文件回复至某个点时的状态,如 git checkout HEAD^ --README git reset --soft HEAD^^ 多步悔棋,恢复到最近两次提交之前,然后git commit。实现多次悔棋。 git commit -C [commit/branch/tag...] 提交的时候 commit信息用某个点的 git checkout master git reset --hard HEAD@{1} 将master分支重置与最新的提交上
变基篇:
git rebase 个人认为最难理解的一个命令,一度想要放弃理解,终于在实践后得到部分理解。故记录。 git rebase --onto <base> <since> <till> 首先会切换至base,相当于 git checkout base 然后cherry-pick since以上(不包括since)直到till(包括till)之间的所有commit 在原git树上的自上到下的结构应该是 till > since > base 执行命令后其实就相当于丢弃了base(不包含)到since(包含)之间的其他commit 如果till就是HEAD,则可省略HEAD,即: git rebase --onto base since PS:since till也可以是别的线上的提交 git rebase -i <commit/tag/...> 交互式编辑,采用修改文件的方式自动变基。后接参数为“基”,修改配置文件的时候需要注意: 从上到下的顺序为最老提交到最新提交,与gitk qgit等顺序相反。 删除/跳过:删除那一行的commit信息 合并: 将自动的pick改为squash,则将与上一个老commit合并