回滚 Commit
一、认识
在 Git
中,如果你已经合并了多个提交并且需要回滚这些更改,有几种方法可以完成此操作。主要的方法包括使用 git reset
或 git 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
:
-
更改项目的提交历史,可以删除一个或多个提交记录。
-
适用于重写提交历史的操作,但需要谨慎使用,特别是在多人的公共分支上。
-
可以改变当前分支的
HEAD
偏移,当进行hard reset
时,还会重置工作目录和暂存区的内容。
git revert
:
-
保留了原始提交的历史记录,并通过引入新的提交来撤销指定的更改。
-
适用于需要保留整个提交历史记录且在公共分支(如
main
或master
)上工作的场景。 -
会生成新的提交,当双方提交内容冲突时,可能需要手动解决冲突。
总结来说,git revert
是一种更安全、无破坏性的回退方式,适用于大多数需要保留历史记录的场景,而 git reset
则更适合于需要彻底清理或重写历史的时候使用。在实际操作中,应根据具体需求和团队的协作情况选择合适的方法。