132

我的 Git 历史是这样的:

Git 历史

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

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

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

4

5 回答 5

127

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

警告:您这样做是在重写历史。对已推送到远程仓库的更改执行此操作会导致问题。我建议只对本地提交执行此操作。

于 2013-07-10T18:10:18.033 回答
97

从原始状态的 repo 开始

原始回购历史

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

压扁的提交,没有合并提交

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

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

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

压缩提交,保留合并提交

使用这些命令(将 5、1 和 C 替换为相应提交的 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

删除合并提交并将其替换为分支中的单个提交

分支移入主线,没有合并提交

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

git rebase 5 master

最后,完全删除分支

分支完全移除

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

git rebase --onto C D~ master
于 2017-10-24T23:51:22.257 回答
30

仅删除合并提交

如果您要做的只是删除合并提交(2),使其就像从未发生过一样,命令简单如下

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

现在紫色分支根本不在蓝色的提交日志中,并且您再次有两个单独的分支。然后,您可以独立地挤压紫色并执行您想要的任何其他操作,而不会妨碍合并提交。

于 2018-02-04T03:24:31.870 回答
18

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

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

git revert -m 1 <SHA of merge>

-m 1指定要选择的父行

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


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

git rebase -i <SHA before branching out>

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

如果合并后没有提交,这将不那么棘手。额外的提交会增加revert/rebase.

于 2013-07-13T23:00:14.740 回答
2

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

git rebase -i -r

于 2021-04-29T05:56:02.373 回答