首页 > 解决方案 > git merge --squash 包含额外的消息

问题描述

运行git merge --squash提交消息时,包含我正在压缩的所有提交的提交消息,太好了。但是,由于某种原因,它实际上包含的不仅仅是我要压缩的提交。

这是我的工作流程:

  1. 各种功能分支通常会合并到开发中。
  2. 当一个版本准备就绪时,我会git merge --squash从开发到登台。
  3. 我在暂存中使用版本号进行第二次提交,然后从暂存回到开发中进行正常合并。(我偶尔也会直接在 staging 上针对紧急的一次提交错误进行热修复,并进行从 staging 到 development 的正常合并)

问题是第 2 步。每次我尝试进行 squash 提交时,提交消息都会包含至少半年之前的所有提交(从我将开发分支从 master 分支时),尽管我已经将它们合并到以前的 squash 提交中. 我手动删除了所有相关的,但至少有两次我忘记了这样做,并最终得到了一个荒谬的笨拙的提交消息。

我从文档中看到的似乎暗示git merge --squash不应该这样做,并且应该智能地猜测我正在压缩哪些提交。我无法找到它如何做到这一点的解释,所以我可以弄清楚出了什么问题/如何解决它。

我该如何解决?如果不能直接修复,是否可以使用另一种工作流程,它会给我一个具有完整历史记录的分支和一个具有合并提交的分支,这些提交具有返回到它们来自何处的引用?

添加更多细节:

we'll call common parent 0
feature branch one: 0-A - B - (merge to development, delete branch)
feature branch two: (development from point D) - E- F (merge to development, delete branch)


development: 0-A - B ------------------------------D- E - F-------------
                  |(source, NOT parent)           /(merge from staging) \                            
staging:     0 --- 1st squash merge(C) - D(version tag) -  2nd squash merge(G) - H (version tag)

第二个壁球合并有提交 A、B、C、D、E、F 而不是只记录在其中的 E、F

标签: gitmerge

解决方案


原始答案(见下面的更新):

git merge --squashgit merge进行与没有常规的相同的历史分析--squash。为此,它需要了解历史。但是--squash你过去所做的合并抹去了那段历史的重要部分。

事实上,如果笨拙的提交消息是您唯一的问题,您将非常幸运。我预计在您已合并的不同功能分支所触及的区域中会出现很多合并冲突。

git merge --squash一般来说,除非你知道后果,否则不要使用。它的主要目的(IMO)实际上只是将一系列混乱的提交减少到单个提交。如果您仍然使用功能分支,它完全无法使用(再次 IMO)。只需保持您的功能分支清洁并使用常规git merge.


更新:

我可以用这段历史重现你的观察:

0--A--B--M--E--F  <-- development
 \      /
  C----D--G--H    <-- staging

C是 commit 的 squash-merge ,即和B之间的变化,并且是 commit 的 squash-merge ,即和之间的变化。0BGFDF

让我们D成为 HEAD 提交。此时,当您git merge F(有或没有--squash)时,Git 确定一个合并基础,即D.

现在,如果没有--squash,Git 会发现这是一个快进的情况,并将分支推进到F.

但是既然你请求--squash了,它会在提交之前停止,但在它更新了工作树之后。它还规定了由 的输出组成的提交消息git log F ^HEAD,即所有可从 到达的F提交,但不包括可从 到达的提交HEAD。如图所示,它们是ABMEF;这就解释了为什么您在日志消息中看到这么多“不必要的”提交。

G'一个可能的解决方法是在您位于临时分支时生成 squash-merge MG'然后你选择staging

           G'     <-- temporary
          /
0--A--B--M--E--F  <-- development
 \      /
  C----D--G--H    <-- staging

D这应该对您有用,因为和的树M应该是相同的。


推荐阅读