Git命令非主流札记

来源:互联网 发布:php crypt 编辑:程序博客网 时间:2024/04/29 09:33

        使用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合并
 

原创粉丝点击