假设我提交了提交A,B和C,所有这些提交完全不同的代码路径。 (所以他们是独立的,并且提交B可以在没有A的变化的情况下存在,依此类推。)
提交A引入了一个错误,而提交B和C都没问题。所以我想在提交A之前恢复到我的代码状态,然后提交更改B和C.
最好的方法是什么?一种方法是简单地执行git revert <SHA-of-commit-before-A>
然后手动添加回提交B和C - 是否有更好的解决方案?
答案 0 :(得分:4)
您无需添加B
和C
:它们已经提交,并且不会受到添加新提交的还原的影响(A
的否定图片)。
另一种方法是(,如果您还没有推动这些提交)来执行交互式rebase(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.
#
但同样,这将改变你的历史,并会让你成为一个强大的推动力 - 如果其他人已经从你的回购中撤出,这并不总是一个好主意。
在这种情况下,还原仍然是最安全的解决方案。
答案 1 :(得分:3)
如果您已经推送了更改(以便其他人可以看到),那么正确的做法是git-revert <SHA-of-A>
。这显然使得新提交与A相反。如果没有人见过您的树,您可以使用git-rebase -i A^
(其中A^
表示&#34; A&#34;的父母)从A开始交互式重新排序或省略提交。在这种情况下,您可以删除A,它将完全按照您的描述执行(在A之前展开,然后仅重新应用B和C)。