回滚部分 Git 提交,保留其他提交?

4
假设我进行了三个提交,分别是 A、B 和 C,都是针对完全不同的代码路径的。 (因此它们是独立的,提交 B 可以存在而不需要 A 中的更改,以此类推。)
提交 A 引入了一个错误,而提交 B 和 C 是正常的。 因此,我想恢复到在提交 A 之前的代码状态,然后再提交更改 B 和 C。
最好的方法是什么? 其中一种方法是简单地执行 git revert <SHA-of-commit-before-A>,然后手动将提交 B 和 C 添加回去-是否有更好的解决方案?
2个回答

4
您不需要添加回BC:它们已经提交,不会受到您的还原的影响,这将添加一个新的提交(A的负图像)。
另一种方法是(如果您尚未推送这些提交)进行交互式变基(git rebase -i A^),重新排序您的提交并完全删除A
在您的变基中,您将看到以下选项(请参见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,如果其他人已经从你的存储库中拉取了代码,那么这并不总是一个好主意。
在这种情况下,还原仍然是最安全的解决方案。


3
如果您已经提交了更改(因此其他人可以看到它们),正确的做法是使用git-revert <SHA-of-A>。这将显式地创建一个与A相反的新提交。如果没有人看到您的树,您可以使用git-rebase -i A^(其中A^表示“A”的父级)交互式地重新排序或省略自A以来的提交。在这种情况下,您可以删除A,它将完全执行您所描述的操作(回滚到A之前,然后仅重新应用B和C)。

在我的回答之前,有人在46秒内给出了同样的建议(去掉“更改历史记录”的警告)+1。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接