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

最新文章

  1. Selenium2+python自动化10-登录案例
  2. NSOperation基本使用
  3. JQuery开发之Galleriffic图片插件介绍
  4. 用GDB排查Python程序故障
  5. 延期(deferred)的承诺(promise) — jq异步编程浅析
  6. sharepoint 2010 列表数据分页控件介绍 pagination UserControl
  7. C编译: makefile基础
  8. OAuth在WebApi
  9. java系列--过滤器
  10. 2.ssh密钥登陆(ssh无密码登陆)
  11. Ant的使用
  12. 利用request和re抓取猫眼电影排行
  13. Solr7.1--- 指定ConfigSets
  14. 清北学堂 清北-Day3-R2-打架 (fight)
  15. Java 8 时间日期
  16. django知识点回顾(上)
  17. 将Sublime Text 添加到鼠标右键菜单的教程方法
  18. 常见XML解析器
  19. NO---20 文件上传
  20. 20155203 实验二《Java面向对象程序设计》实验报告

热门文章

  1. Android中图片处理相关问题
  2. C#主键类型选择
  3. Java中有关日期的一些常见运算与应用(Date,DateFormat,SimpleDateFormat)
  4. php中使用curl两个例子
  5. leetcode 211. Add and Search Word - Data structure design Trie树
  6. HYSBZ 2818 gcd
  7. OC基础教程 C语言中的格式占位符:
  8. C语言之一数三平方
  9. c++ ptrdiff_t 类型
  10. uvalive 2322 Wooden Sticks(贪心)