页面

2012-01-05

git cheatsheet

参考书:Pro Git
关于如何写日志:A Note About Git Commit Messages
  1. 三级内容:working tree,index,repository。index好似一个中间缓冲区,add指令把相关内容由working tree送到index,commit指令把index中需要提交的内容提交到repository。注意:log不属于index,而属于repository。
  2. tree类似于directory,blob类似于普通file;tag类似于书签。各种object之间的关系如下图所示:
  3. 在当前分支中检出到某次提交(会更新index):
    $ git checkout rev3141592 make.py
  4. 显示树形日志:
    $ git log --graph --all
    这个更美观:
    $ git log --graph --full-history --all --color --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s"
    这个命令太复杂了,可以保存到配置文件(.gitconfig)中:
    [alias]
    gr = log --graph --full-history --all --color --pretty=tformat:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s%x20%x1b[33m(%an)%x1b[0m"
    可以使用图形工具giggle显示git项目。
  5. 撤销到某次提交,会增加一条回退记录,更新working tree。撤销上次提交:
    $git revert HEAD make.py
  6. 撤销上上次提交:
    $git revert HEAD^ make.py
    撤销上上上次(倒数第三次)提交:
    $git revert HEAD~2 make.py
  7. 项目根目录增加.gitignore来忽略文件
  8. 用reset移动头(HEAD)指针以重置到某次提交。更新或不更新index和working tree,详见https://www.kernel.org/pub/software/scm/git/docs/git-reset.html。注意要区分“重置(reset)”和“检出(checkout)”:后者在涉及branch切换的情况下更新index,否则一般只更新working tree;而且前者只是对提交进行操作,无法重置单个文件。
  9. Search key words and display the line number:
    $ git grep -n office report.tex
  10. B push到A后,A的working tree中不能显示B的内容,得:
    $ git reset --hard cccccc
  11. 对branch做注释(1.7.9以后的功能):
    $ git branch --edit-description
  12. 把另一分支中的某个文件更新到本地,最好通过手工复制的途径;另外,可以考虑使用rebase直接移动分支到某次提交;第三,下面通过检出来更新单个文件,可能会损失日志记录:
    $ git checkout source_branch foo.txt
  13. rebase:一个常规用例是,在项目开发中,旁路分支开始于主分支主干接口确立的时刻;经一段时间开发后,主分支(upstream)的主干接口被丰盈,此时要将主分支中的主干接口改变应用到旁路分支中,使用rebase对旁路分支在主分支上进行整体推进;rebase后,旁路分支的分叉点在主分支的倒数第二次提交处。
  14. 制作补丁:把提交R1到R2的差异导出为补丁,然后将补丁打到当前分支头部:
    $ git format-patch -k --stdout R1..R2 | git am -3 -k
  15. 删除远程分支:
    $ git push remotefoo :branchbar

没有评论: