2026-10-20 18:46:29
上面的演示中,只有两个提交需要 revert ,我们可以一个个回退。但如果有几十个呢?一个个回退肯定效率太低而且容易出错。
(接上面示例)
我们可以使用以下方法进行批量回退:
命令: git revert <commit6> <commit5> <commit4> …
示例:
说明:
我们应该先写 commit-6 ,在写 commit-5 。
我们可以看到,每撤销一个commit提交,都会生成一个新的提交。上面撤销了两个commit,就让你编写两次提交说明信息。
这时,错误的提交 commit-5 和 commit-6 依然保留,将来进行甩锅的时候也有依可循。而且,这样操作的话 HEAD 指针是往后移动的,可以直接使用 git push 命令推送到远程仓库里, 而这种做法,正是企业所鼓励的 。
命令: git revert <commit新>...<commit旧>
(这里就不做演示了,同上)
注意:
(1) -n 参数
作用: git revert 命令移除某几次的提交的修改,但是不要使用还原的更改创建任何提交,还原只是修改工作树和索引。简写 -n ,全称 --no-commit 。
命令: git revert -n <commit新>...<commit旧>
(2) -m 参数
作用: git revert 移除merge(合并)的修改内容。
简写: -m parent-number ,全称: --mainline parent-number 。
命令: git revert [-m parent-number] <commit> 。
说明:
如果我们需要还原的提交的是merge的操作,直接使用 git revert <commit> 的方式是不行的,会提示我们:
因为merge操作有两个分支,而revert不知道要还原哪个分支的提交,就没法进行还原\移除那些提交记录的修改的操作了,所以我们用 -m 1 来告诉 git revert 命令哪个是主线,哪个是非主线。(选择主线就还原非主线,选择非主线就还原主线)
另外,这个主线是1还是2是从哪里看出来的呢?
我们可以使用 git show 命令查看,如果是普通的commit提交,通常会显示这个commit的id、作者、日期、备注、更改文件内容等;如果是merge的记录,则会显示merge 的commit-id,备注、日期和merge的主线和合并过来的id。
例如:
如上第二行, Merge: bc64f61 72032b7 , bc64f61 就是主线的id,编号就是1; 72032b7 就是非主线的id,编号就是2。
此时,我们要把合并过来的分支的修改给还原掉,那么就可以指定1为主线,还原掉2的提交了。
通过以上对比可以发现, git reset 命令与 git revert 命令最大的差别就在于, git reset 命令会失去后面的提交,而 git revert 命令是通过反做的方式重新创建一个新的提交,而保留原有的提交。在企业里,应尽量使用 git revert 命令,能不用 git reset 命令尽量不用。