跳到主要内容

回滚 Commit

2024年06月27日
柏拉文
越努力,越幸运

一、认识


Git 中,如果你已经合并了多个提交并且需要回滚这些更改,有几种方法可以完成此操作。主要的方法包括使用 git resetgit revert

二、git reset


git reset 会将你的分支指针回滚到一个指定的提交,并且会改变你的工作目录和暂存区。这种方法会修改提交历史,因此在共享分支上使用时需要非常小心。

总结: 请注意,这样会永久地丢失这些提交,因此在没有备份的情况下需要小心使用。如果这些更改已经推送到共享的远程存储库,则这种方法可能不合适。

2.1 确定回滚的 commit

通过 git log --oneline 来查看提交历史

git log --oneline 

2.2 回滚到指定的 commit

git reset --hard <commit-hash>

git push -f

三、git revert


git revert 会为每个被撤销的提交创建一个新的提交,并且不会改变现有提交的历史。这是一个更安全的方式,特别是当这些提交已经被推送到远程存储库时。

总结: 这种方法会生成撤销提交,而不会影响提交历史。因此更适用于你已经将更改推送到远程存储库的情况。

3.1 确定回滚的 commit

通过 git log --oneline 来查看提交历史

git log --oneline 

3.2 对需要回滚的 commit 提交撤销

使用 git revert 命令对每个提交创建一个新的撤销提交。如果需要撤销多个提交,那需要多次并保证顺序执行。

git revert <commit-hash1>

git revert <commit-hash2>

……

四、git reset vs git revert


git reset:

  1. 更改项目的提交历史,可以删除一个或多个提交记录。

  2. 适用于重写提交历史的操作,但需要谨慎使用,特别是在多人的公共分支上。

  3. 可以改变当前分支的 HEAD 偏移,当进行 hard reset 时,还会重置工作目录和暂存区的内容。

git revert:

  1. 保留了原始提交的历史记录,并通过引入新的提交来撤销指定的更改。

  2. 适用于需要保留整个提交历史记录且在公共分支(如 mainmaster)上工作的场景。

  3. 会生成新的提交,当双方提交内容冲突时,可能需要手动解决冲突。

总结来说,git revert 是一种更安全、无破坏性的回退方式,适用于大多数需要保留历史记录的场景,而 git reset 则更适合于需要彻底清理或重写历史的时候使用。在实际操作中,应根据具体需求和团队的协作情况选择合适的方法。