假设我提交了 A、B 和 C,所有这些都涉及完全不同的代码路径。(因此它们是独立的,并且提交 B 可以在没有 A 的更改的情况下存在,依此类推。)
提交 A 引入了一个错误,而提交 B 和 C 很好。所以我想恢复到提交 A 之前的代码状态,然后提交更改 B 和 C。
最好的方法是什么?一种方法是简单地执行 agit revert <SHA-of-commit-before-A>
然后手动添加提交 B 和 C - 有更好的解决方案吗?
假设我提交了 A、B 和 C,所有这些都涉及完全不同的代码路径。(因此它们是独立的,并且提交 B 可以在没有 A 的更改的情况下存在,依此类推。)
提交 A 引入了一个错误,而提交 B 和 C 很好。所以我想恢复到提交 A 之前的代码状态,然后提交更改 B 和 C。
最好的方法是什么?一种方法是简单地执行 agit revert <SHA-of-commit-before-A>
然后手动添加提交 B 和 C - 有更好的解决方案吗?
您不需要添加回B
和C
:它们已经提交并且不会受到添加新提交的还原的影响(负面形象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,如果其他人已经从你的回购中撤出,这并不总是一个好主意。
在这种情况下,还原仍然是最安全的解决方案。
如果您已经推送了更改(因此对其他人可见),那么正确的做法是git-revert <SHA-of-A>
. 这明确地做出了一个与 A 相反的新提交。如果没有人看到你的树,你可以使用git-rebase -i A^
(这里A^
的意思是“A 的父级”)交互式地重新排序或省略自 A 以来的提交。在这种情况下,你可以删除 A 和它将完全按照您的描述进行(展开到 A 之前,然后仅重新应用 B 和 C)。