git revert
会生成一个新的 commit 来记录此次操作;git reset
是把 HEAD 指针向前挪动一次,会减少一个 commit。
回退用 git revert
回退还是用 git reset
,核心就一点:
是否需要记录这次回退。
如果需要记录这次回退,就用 git revert
,反之用 git reset
。
而是否需要,在遵循 git 基本原则的前提下,也有一些经验之谈。
公共分支的回退一般用 git revert
因为如果用 git reset
, 后面推送到远程仓库需要强制 push 来修改历史提交记录,但是 git 的一般原则是不要破坏公共分支的历史提交记录,故公共分支上的回退一般用 git revert
。还有就是,对公共分支的修改,本来就应该记录 。最后一点就是,如果用 git reset 修改了公共分支的历史提交记录,其他同事都将不得不使用 git reset --hard origin/publicBranch
命令来将远程仓库代码同步到本地,这很蛋疼,因为本地未提交的代码都会被抹除。
非公共分支的回退一般用 git reset
就我平时的开发而言,在个人的分支上回退,git reset
更合适。比如你刚提交完一次代码,突然发现里面有句注释有错别字,你想修改,这个时候就可以直接用 git reset HEAD^
将上一次提交的代码回退到工作区,修改错别字后重新提交。这种情况下就很适合 git reset
,因为没有多余的记录,并且也不需要记录,你以及你的同事都不 care "修改错别字" 这一条记录。