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


97

我的Git历史记录如下:

git历史

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

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

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


您的存储库是否已被其他人撤出的任何地方?
Schleis

这两个分支都是纯本地的。
Benjamin Toueg

Answers:


100

这样做git rebase -i <sha before the branches diverged>将允许您删除合并提交,并且日志将是您希望的一行。您也可以删除不需要的任何提交。变基无法正常工作的原因是您回退的幅度不够。

警告:您正在重写历史记录。使用已推送到远程存储库的更改来执行此操作将导致问题。我建议仅使用本地提交来执行此操作。


4
即使我在树枝分开之前选择了一个sha,我
也会

1
是的,然后在附带的编辑器git rebase中将其删除,它们将被删除。
Schleis

4
删除提交会导致丢失所有合并修改。但是我做了一个软复位,我已经能够得到一些我想要的东西(顺序与最初的期望不符)。
本杰明·图埃格2013年

2
这个答案在细节上是不完整的,您是从哪个分支发起重新设置的?
grgry '16

3
完全确定您不想“删除”提交。'remove'不是重新设置的选项,但可以删除。如果删除提交,则将丢失其所做的更改。您要压缩提交。
thecoshman

69

从原始状态的仓库开始

原始回购记录

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

压缩提交,无合并提交

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

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

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

分支移至主线,无合并提交

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

git rebase 5 master

最后,完全删除分支

分支完全删除

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

git rebase --onto C D~ master

git rebase 5 master情况下,为什么它不是“ABC 1 2 3 4 5 d ...”的订单?
罗伊

1
该命令采用与提交master没有共同之处的提交,并5在之上将其抓取5。的提交C不属于的沿袭5,它是第一个移至之上的提交5
艾伦·卢斯

2
如果您想结束“ ABC 1 2 3 4 5 D ...”的操作,可以执行以下操作:git rebase C 5; git rebase 5 master
艾伦·卢斯

16

有两种方法可以根据您的需要进行处理:

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

git revert -m 1 <SHA of merge>

-m 1 指定要选择的父行

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


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

git rebase -i <SHA before branching out>

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

如果合并后未提交提交,则将不会那么棘手。额外的提交增加了冲突的机会revert/rebase


这听起来不对。抛开一个事实就很难说清楚最初的海报想要对紫色提交进行什么操作,如果您还原合并,那就很好了,它将对来自该提交的更改进行反向修补并将其添加为再次提交,取消紫色提交。就像1 - 1 = 0。但是,如果您随后以紫色提交为基准,则您将留下已还原的补丁,除非您也以该基准为基础。如果不这样做,那就像是应用-1到您的历史记录,而不是0,因此,您将留下不需要的更改。

@Cupcake,提供了两个单独的答案。我修改了答案,以减少混乱:P
2013年

AFAIK这不是OP所要求的。他想保留更改,但要消除日志中的噪音。为此,他需要压缩提交,删除将删除更改。
thecoshman

是的,看起来原来的问题已被改写。此答案不适用于OP问题。

16

仅删除合并提交

如果您要做的只是删除合并提交(2),以使其从未发生过,则命令如下所示

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

现在,紫色分支根本不在蓝色的提交日志中,并且您又有两个单独的分支。然后,您可以独立地挤压紫色,并进行其他所需的操作,而无需进行合并提交。


在所有答案中,我发现这既最简单也最容易做到。谢谢。
Roshambo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.