ChatGPT解决这个技术问题 Extra ChatGPT

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

我的 Git 历史是这样的:

https://i.stack.imgur.com/67sda.png

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

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

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

您的回购是否被推到其他人从中拉出的任何地方?
这两个分支都是纯本地的。

S
Schleis

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

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


即使我在分支发散之前选择了一个sha,我也看到了紫色分支的所有提交-_-
是的,然后您在带有 git rebase 的编辑器中删除它们,它们将被删除。
删除提交导致丢失合并的所有修改。但我做了一个软重置,我已经能够得到我想要的东西(订单不符合最初的期望)。
这个答案详细不完整,yu从哪个分支启动rebase?
相当确定您不想“删除”提交。 'remove' 不是 rebase 中的选项,但 delete 是。如果您删除一个提交,您将失去它引入的更改。你想压缩提交。
s
sandstrom

从原始状态的 repo 开始

https://i.stack.imgur.com/lAThs.png

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

https://i.stack.imgur.com/fDyIu.png

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

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

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

https://i.stack.imgur.com/PmNZ8.png

使用这些命令(将 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

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

https://i.stack.imgur.com/nL23S.png

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

git rebase 5 master

最后,完全删除分支

https://i.stack.imgur.com/LbYK9.png

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

git rebase --onto C D~ master

git rebase 5 master 的情况下,为什么不是“ABC 1 2 3 4 5 D ...”命令?
该命令采用 master5 没有共同点的提交并将它们放在 5 之上。 C 处的提交不是 5 沿袭的一部分,它是第一个移到 5 之上的提交。
如果您想以“ABC 1 2 3 4 5 D ...”结尾,您可以这样做:git rebase C 5; git rebase 5 master
W
Warren

仅删除合并提交

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

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

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


在所有答案中,我发现这是最直接和最容易做到的。谢谢你。
这是问题的第一步,我同意最简单的方法完全符合要求。第二步是 git merge --squash <purple branch name>
p
prem

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

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

git revert -m 1 <SHA of merge>

-m 1 指定要选择的父行

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

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

git rebase -i <SHA before branching out>

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

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


这听起来不对。撇开最初很难说出原始发布者想要对紫色提交做什么这一事实不谈,如果您恢复合并,那很好,这将对该提交的更改进行反向补丁并将其添加为另一个提交,取消紫色提交。就像 1 - 1 = 0。但是,如果您随后重新调整紫色提交,您就会留下恢复的补丁,除非您也重新调整它。如果您不这样做,这就像将 -1 应用到您的历史记录,而不是 0,因此您将留下您不想要的更改。
@Cupcake,提供了两个单独的答案。我已经修改了答案以减少混乱:P
AFAIK 这不是 OP 所要求的。他想保留更改,但从日志中删除噪音。为此,他需要压缩提交,删除将删除更改。
没错,看起来原来的问题已经改写了。这个答案不适用于 OPs 问题。
s
squall3d

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

git rebase -i -r