git从历史记录中删除合并提交

时间:2013-07-10 17:44:31

标签: git git-merge git-rebase

我的Git历史看起来像这样:

Git history

我想将紫色提交压缩成一个。我不希望在提交日志中再次看到它们。

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

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

5 个答案:

答案 0 :(得分:74)

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

警告: 你正在重写这段历史。使用已推送到远程仓库的更改执行此操作将导致问题。我建议只对本地提交执行此操作。

答案 1 :(得分:41)

从处于原始状态的回购开始

the auth section of the docs

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

Original repo history

使用这些命令(将5和1替换为相应提交的SHA):

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

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

Squashed commits, no merge commit

使用这些命令(将5,1和C替换为相应提交的SHA):

git rebase 5 master

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

Squashed commits, retained merge commit

做(用相应提交的SHA替换5):

git rebase --onto C D~ master

最后,完全删除分支

Branch moved into mainline, no merge commit

使用此命令(将C和D替换为相应提交的SHA):

{{1}}

答案 2 :(得分:11)

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

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

git revert -m 1 <SHA of merge>

-m 1指定选择哪个父行

紫色提交仍将保留在历史记录中,但由于您已还原,因此您将看不到这些提交中的代码。


解决方案2 :完全删除紫色提交(如果共享repo则会发生破坏性更改)

git rebase -i <SHA before branching out>

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

如果在合并后没有提交,那么这将不那么棘手。额外提交会增加revert/rebase期间发生冲突的可能性。

答案 3 :(得分:6)

仅删除合并提交

如果您要做的就是删除合并提交(2)以便它从未发生过,那么命令如下:

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

现在紫色分支根本不在蓝色的提交日志中,你又有两个独立的分支。然后你可以独立地挤压紫色,并在没有合并提交的情况下做任何你想要的其他操作。

答案 4 :(得分:2)

为了完全控制操作并保留您想要保留的任何合并提交,现代方法是使用

git rebase -i -r