如何在上一次提交之前删除一个提交

3
假设我有两个分支,一个是主分支master,另一个是开发分支devdev分支领先于master分支2次提交,并且这两次提交都没有合并或推送到任何remote上。 dev分支的状态如下:
dev A - B - C - D - E

其中,A是最早的提交,E是最新的提交。

我想达到这种状态:

dev A - B - C - E

基本上我想要撤销倒数第二个提交,就像它从未发生过一样。也不应该有冲突(E不依赖于D的更改)。
我能使用交互式变基吗?

请查看我在https://dev59.com/XoLba4cB1Zd3GeqPjcte#25490288顶部的评论。 - undefined
不要使用“Nuke”,而是将C作为E的父级,而不是D。如果没有任何指向D的引用,它最终会被垃圾回收。 - undefined
1个回答

4
我会使用交互式的rebase表单。当你在dev分支上时(需要有干净的工作副本):
git rebase -i HEAD~~

在您喜欢的文本编辑器中,您会看到最后2次提交的列表。只需注释/删除不需要的提交行即可。
如果HEAD依赖于HEAD~引入的更改,则可能会出现合并冲突,并且在解决它们后,您将失去先前的历史记录(通过reflog 仍然可用,当然)。我通常更喜欢这种方法。 如果您想保留以前的历史记录(和不需要的提交),则应执行:
git checkout HEAD~~         # go to last good commit
git checkout -b new_branch  # create a new branch and forget about the original
git cherry_pick dev         # copy the commit on top of `dev` to `new_branch`

你仍然会遇到冲突,但是你不会修改dev的历史记录。

另一方面,如果不想破坏任何人的构建(build)并且不想删除 master 上的不需要的提交,则可以执行 git revert HEAD~


1
啊,最后我还是避免不了合并冲突。但是我已经解决了两个版本。谢谢。 - undefined
@JanNetherdrake,你可以修改 E 来解决冲突,或者切换到一个新的分支。在回答中进一步展开。顺便说一句,我喜欢 rebase -i - 你可以重新排序、拆分、合并以及重命名等提交记录。 - undefined

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