关于git reset和git revert

Git

HEAD

  • 当前分支最近的一个提交

Index

  • index也被称为staging area,暂存区,下个提交的文件集合

Working Copy

  • 正在工作的那个文件集,叫做工作区

Flow

  1. 刚checkout一个分支,HEAD指向最近的一个提交,HEAD和Index(暂存区)和Working Copy(工作区)的文件集是一致的
  2. 修改,会提示git add,此时 Working Copy和Index、HEAD不一样
  3. git add后,working copy和index一样,但是他们和head不一样
  4. git commit后,创建一个新的commit,HEAD指向这个commit,三者又一致了

git reset

  • 总的来说,git reset是用来将当前branch重置到另外一个commit的,这个动作可能会影响index和work tree
  • 与checkout的区别
    比如当前刚checkout到master
    - A - B - C(HEAD, master)
    如果你希望将master指向B,执行git reset B就可以移动HEAD到B
    - A - B (HEAD, master) # - C is still here, but there's no branch pointing to it anymore
    如果刚才运行的是git checkout B
    - A - B(HEAD) - C(master)
    这时候HEAD和master branch就不在一个点上了,你进入了detached HEAD STATE(如果这个commit没有和任何一个branch tip是一致的话),HEAD,work tree和index都指向了B,但是却已经是另外一个分支了,因为master branch依然指向C。
  • Reset
    reset本身做的事情就是重置HEAD到另外一个commit
    比如,我们刚checkout到master,先如果执行git reset HEAD,任何事情都不会发生
    如果git reset HEAD~1,HEAD会指向上一个commit
    • 参数 soft
      HEAD会到另外一个commit上,index会存放所有差别集合,index和working copy一致
    • 参数hard
      HEAD会回到另外一个commit,且index和working copy也是
    • 参数mixed(default)
      默认参数,HEAD会回到另外一个commit,index也会,working copy存放差别集合

git revert

  • 用于反转提交
    revert用一个新的提交来消除一个历史提交所做的任何修改
    revert后本地的代码会回滚到指定的历史版本,且git push既可以把origin代码更新,也不会有reset造成的冲突问题
    git revert xxCommit
    不同于reset,reset 是将HEAD往后移动,revert是往前,只不过是反向提交

参考

http://yijiebuyi.com/blog/8f985d539566d0bf3b804df6be4e0c90.html
http://www.cnblogs.com/kidsitcn/p/4513297.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容