我的Git历史记录如下:
我想把紫色的东西压成一个。我不想在我的提交日志中再次看到它们。
我尝试做一个git rebase -i 1
,但是即使1
在蓝色分支上(参见图片),我仍然看到紫色分支上的每个提交。
如何完全删除紫色分支(从提交日志中)?
我的Git历史记录如下:
我想把紫色的东西压成一个。我不想在我的提交日志中再次看到它们。
我尝试做一个git rebase -i 1
,但是即使1
在蓝色分支上(参见图片),我仍然看到紫色分支上的每个提交。
如何完全删除紫色分支(从提交日志中)?
Answers:
这样做git rebase -i <sha before the branches diverged>
将允许您删除合并提交,并且日志将是您希望的一行。您也可以删除不需要的任何提交。变基无法正常工作的原因是您回退的幅度不够。
警告:您正在重写历史记录。使用已推送到远程存储库的更改来执行此操作将导致问题。我建议仅使用本地提交来执行此操作。
git rebase
中将其删除,它们将被删除。
从原始状态的仓库开始
删除合并提交并将分支压入主线中的单个提交
使用以下命令(用相应提交的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 ...”的订单?
master
没有共同之处的提交,并5
在之上将其抓取5
。的提交C
不属于的沿袭5
,它是第一个移至之上的提交5
。
git rebase C 5; git rebase 5 master
有两种方法可以根据您的需要进行处理:
解决方案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
,因此,您将留下不需要的更改。