4

假设我提交了 A、B 和 C,所有这些都涉及完全不同的代码路径。(因此它们是独立的,并且提交 B 可以在没有 A 的更改的情况下存在,依此类推。)

提交 A 引入了一个错误,而提交 B 和 C 很好。所以我想恢复到提交 A 之前的代码状态,然后提交更改 B 和 C。

最好的方法是什么?一种方法是简单地执行 agit revert <SHA-of-commit-before-A>然后手动添加提交 B 和 C - 有更好的解决方案吗?

4

2 回答 2

4

您不需要添加回BC:它们已经提交并且不会受到添加新提交的还原的影响(负面形象A)。

另一种方法是(如果您还没有推送这些提交)进行交互式变基(git rebase -i A^),并重新排序您的提交,完全放弃A
您将在 rebase 中看到以下选项(请参阅git Book

# Commands:
#  p, pick = use commit
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

但同样,这将改变你的历史,并使你成为一个 git push --force,如果其他人已经从你的回购中撤出,这并不总是一个好主意。
在这种情况下,还原仍然是最安全的解决方案。

于 2012-10-10T06:33:40.067 回答
3

如果您已经推送了更改(因此对其他人可见),那么正确的做法是git-revert <SHA-of-A>. 这明确地做出了一个与 A 相反的新提交。如果没有人看到你的树,你可以使用git-rebase -i A^(这里A^的意思是“A 的父级”)交互式地重新排序或省略自 A 以来的提交。在这种情况下,你可以删除 A 和它将完全按照您的描述进行(展开到 A 之前,然后仅重新应用 B 和 C)。

于 2012-10-10T06:32:54.217 回答