我的Git历史看起来像这样:
我想把紫色的提交压成一个。我不希望在我的提交日志中再次看到它们。
我试图做一个git rebase -i 1
,但即使1
在蓝色分支(参见图片),我仍然看到我的紫色分支上的每个提交。
如何完全删除紫色分支(来自提交日志)?
执行git rebase -i <sha before the branches diverged>
这将允许您删除合并提交,日志将是您想要的单行。您还可以删除任何不再需要的提交。你的rebase不起作用的原因是你没有回到足够远的地方。
警告:您正在重写历史记录。使用已推送到远程仓库的更改执行此操作将导致问题。我建议只对本地提交执行此操作。
从原始状态的回购开始
删除合并提交并将分支压缩到主线中的单个提交
使用这些命令(将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
删除合并提交并将其替换为分支中的单个提交
做(用相应提交的SHA替换5):
git rebase 5 master
最后,完全删除分支
使用此命令(将C和D替换为相应提交的SHA):
git rebase --onto C D~ master
根据您的需要,有两种方法可以解决这个问题:
解决方案1:删除紫色提交,保留历史记录(如果您想要回滚)
git revert -m 1 <SHA of merge>
-m 1
指定选择哪一个父行
紫色提交仍将在历史中存在,但由于您已经恢复,您将不会看到来自这些提交的代码。
解决方案2:完全删除紫色提交(如果共享repo,则会发生破坏性更改)
git rebase -i <SHA before branching out>
并删除与紫色提交相对应的(删除行)。
如果在合并后没有提交,那么这将不那么棘手。额外的提交增加了revert/rebase
冲突的可能性。
如果您要做的就是删除合并提交(2)以便它从未发生过,那么命令就是如下
git rebase --onto <sha of 1> <sha of 2> <blue branch>
现在紫色分支根本不在蓝色的提交日志中,你又有两个独立的分支。然后你可以独立地挤压紫色并做任何你想要的其他操作,而不需要合并提交。