从历史中删除合并提交

我的 Git 历史是这样的:

Git history

我想把紫色的提交压缩成一个单独的提交。我不想再在我的提交日志中看到它们。

我尝试过做一个 git rebase -i 1,但是即使 1在蓝色分支上(参见图片) ,我仍然可以看到紫色分支上的每个提交。

如何完全删除(提交日志中的)紫色分支?

256144 次浏览

执行 git rebase -i <sha before the branches diverged>,这将允许您删除合并提交,日志将是一个单一的行,因为您想要的。您还可以删除任何您不希望再有的提交。你的基地不起作用的原因是你没有回到足够远的地方。

警告: 你这么做是在改写历史。使用推送到远程回购的更改执行此操作将导致问题。我建议只对本地提交执行此操作。

根据你的需要,有两种方法可以解决这个问题:

解决方案1 : 删除紫色提交,保留历史记录(如果您想回滚)

git revert -m 1 <SHA of merge>

-m 1指定要选择的父行

紫色提交将仍然存在于历史中,但是由于您已经恢复,您将不会看到来自这些提交的代码。


解决方案2 : 完全删除紫色提交(如果回购是共享的,会造成破坏性改变)

git rebase -i <SHA before branching out>

并删除(删除行)对应的紫色提交。

如果在合并后没有进行提交,那么这个操作就不那么复杂了。额外的提交会增加 revert/rebase期间发生冲突的几率。

从原始状态的回购开始

Original repo history

删除合并提交并将分支压缩到主线中的单个提交中

Squashed commits, no merge commit

使用以下命令(用相应提交的 SHA 替换5和1) :

git checkout 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git rebase HEAD master

保留合并提交但将分支提交压缩为一个:

Squashed commits, retained merge commit

使用以下命令(用相应提交的 SHA 替换5、1和 C) :

git checkout -b tempbranch 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git checkout C
git merge --no-ff tempbranch
git rebase HEAD master

删除合并提交并将其替换为来自分支的单独提交

Branch moved into mainline, no merge commit

只需执行(将5替换为相应提交的 SHA) :

git rebase 5 master

最后,完全移除树枝

Branch removed entirely

使用这个命令(用相应提交的 SHA 替换 C 和 D) :

git rebase --onto C D~ master

删除合并提交

如果您想要做的只是删除一个合并提交(2) ,这样它就像从来没有发生过一样,那么命令如下所示

git rebase --onto <sha of 1> <sha of 2> <blue branch>

现在紫色分支根本不在蓝色的提交日志中,您又有了两个独立的分支。然后,您可以独立地压缩紫色,并且在没有合并提交的情况下执行任何其他操作。

为了完全控制操作并保留您希望在执行过程中保留的任何合并提交,现代方法是使用

git rebase -i -r