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

Ben*_*ueg 75 git git-merge git-rebase

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

Git历史

我想把紫色的提交压成一个.我不希望在我的提交日志中再次看到它们.

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

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

Sch*_*eis 85

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

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

  • 删除提交导致失去合并的所有修改.但我做了一次软复位,我已经能够得到一些我想要的东西(订单与最初的期望不符). (4认同)
  • 相当确定您不想“删除”提交。'remove' 不是 rebase 中的一个选项,但 delete 是。如果您删除一个提交,您将失去它引入的更改。你想压缩提交。 (3认同)
  • 即使我在分支发散之前选择了sha,我也会看到紫色分支的所有提交-_- (2认同)
  • 这个答案在细节上是不完整的,哪个分支做yu启动rebase? (2认同)

All*_*uce 51

从原始状态的回购开始

原始回购历史

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

压缩提交,没有合并提交

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

git checkout 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git rebase HEAD master
Run Code Online (Sandbox Code Playgroud)

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

Slenashed提交,保留合并提交

使用这些命令(将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
Run Code Online (Sandbox Code Playgroud)

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

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

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

git rebase 5 master
Run Code Online (Sandbox Code Playgroud)

最后,完全删除分支

分支完全删除

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

git rebase --onto C D~ master
Run Code Online (Sandbox Code Playgroud)

  • 该命令采用“master”与“5”没有共同点的提交,并将它们放在“5”之上。“C”处的提交不是“5”沿袭的一部分,它是第一个移到“5”之上的提交。 (3认同)
  • 如果你想以"ABC 1 2 3 4 5 D ......"结束,你可以这样做:`git rebase C 5; git rebase 5 master` (2认同)

pre*_*rem 14

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

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

git revert -m 1 <SHA of merge>
Run Code Online (Sandbox Code Playgroud)

-m 1 指定要选择的父行

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


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

git rebase -i <SHA before branching out>
Run Code Online (Sandbox Code Playgroud)

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

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


War*_*ren 10

要删除合并提交

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

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

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

  • 在所有答案中,我发现这是最直接且最容易做到的。谢谢。 (3认同)

小智 10

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

git rebase -i -r