假设我有一个提交列表: A > B > C > D > E
,如何从历史记录中删除在C中所做的更改,使其具有A > B > D > E
?撤消或删除以前的Git提交中的更改
回答
您可以随时恢复更改。
git revert C
如果您想重写历史记录,这是rebase
的用途。您需要:
git rebase -i A
然后从提交列表中删除C.
更详细的解释:
首先选择通过创建一个新的提交这是原来的承诺相反恢复的变化。这样仓库会是什么样子:
A> B> C> d> E> C`
其中C`是C.相反基本上相同patch --reverse
第二个选项改变了历史。 rebase
允许您选择特定的提交,更改提交顺序等等。我建议阅读git-rebase。 -i
标志用于交互模式,它允许用户在重新绑定之前编辑提交列表。
如果您提交的名单中删除C和进行重订,实际输出将
A> B> d>电子
你有C的分支不再历史。
注意:在这两种情况下,您都可能在此过程中发生冲突。 在第一种情况下,因为你申请C`在E,而在第二种情况下,因为你在申请B. d
Tx Igal,你能详细解释一下你的答案吗? – sergiuz
完成。编辑我的答案。 –
你应该提到,如果其他人在他们的历史中也有C提交,就不应该使用rebase。或者如果那些人不得不在重写提交的基础上对他们的工作进行重新布局/重做,那么rebase就可以了,但是不管怎样,您都不会轻易地重新分享共享历史记录。 – 2015-10-13 14:28:36
尝试git revert C
...,最好的也看过man git-revert
你可以不要这样做和得到A > B > D > E
。 你将永远结束了A > B > D' > E'
要取消C引入的变化,你可以在你的情况下使用
git rebase --onto <newbase> <oldbase> <commit/branch>
:
git rebase --onto B C E
这将会把从旧的D..E
引入的更改基地C
到新基地B
(如果你没有碰到任何冲突)导致
A > B > D' > E'
这是重要需要注意的是D
和E
获得导致D'
和E'
所以新沙的ID,如果你已经公布C
,D
或E
使用revert方法(git revert C
),否则可能会搞乱其他国家人民的历史。
所以这个答案有点误导。尽管D和E被重写为具有新的sha ID,但每次提交引入的*更改*仍然是相同的。 – 2015-10-13 14:39:26
嗨..谢谢,试图改写我的答案,以反映仍然可以删除'C'中所做的更改,但不会以'E'的相同sha ID结束。 – mariux
- 1. Git - 删除/撤消提交的方式
- 2. 如何从以前的提交中撤消删除:Gitastrophy
- 3. Git:撤消未提交的更改以重置特定文件
- 4. Git撤消合并但不删除以后提交
- 5. 撤消git的删除
- 6. 撤消在GIT中删除
- 7. Git撤消提交并推送后删除的文件
- 8. Git - 撤消更改
- 9. git撤消更改
- 10. Git的撤销合并是删除未提交的修改
- 11. git分支撤消提交
- 12. Git撤消上次提交
- 13. 需要撤消GIT提交
- 14. 如何撤消提交并将更改提交到Git中的其他分支?
- 15. 提交前撤消'git add' - 需要删除添加的文件夹
- 16. 删除之前在Git中的提交
- 17. Git - 将未提交的更改推送到以前的提交
- 18. 删除以前提交/更改集中的文件
- 19. 撤消Git中的最后更改
- 20. 撤消Git中的行结束更改
- 21. 如何编辑以前的提交,并在不删除git之前的提交?
- 22. 我的同事的更改删除我在git中的提交
- 23. 在Git中删除和撤消
- 24. 暂时撤销以前提交的更改
- 25. Git - 撤消所有更改更改
- 26. 不删除以前的提交并对其进行更改。
- 27. 如何从仓库中删除以前的git提交?
- 28. 如何从git repo中删除以前提交的文件?
- 29. 从以前的所有git提交中删除.idea目录
- 30. 在提交新的更改之前更正以前的提交
您需要明确您是否想将C保存在您的历史记录中,或者如果您只想撤销当前版本代码库中的更改,并且您不关心C是否仍在你的历史。它对你而言甚至重要吗? – 2015-10-13 14:24:46
另请参阅[在Git中撤消特定提交](http://stackoverflow.com/q/2318777/456814)。 – 2015-10-13 14:30:19
在这种情况下,我不关心C提交,我放弃它。 – sergiuz