git merge --squash 包含额外的消息

标签 git merge

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

这是我的工作流程:

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

问题出在第 2 步。每次我尝试进行挤压提交时,提交消息都会包含至少半年前的所有提交(从我将开发从 master 分支出来时算起),尽管我已经将它们 merge 到其中之前的南瓜提交。我手动删除了除相关之外的所有内容,但至少有两次我忘记这样做,并最终得到了一条荒谬而笨拙的提交消息。

我从文档中看到的内容似乎暗示 git merge --squash 不应该执行此操作,并且应该智能地猜测我正在挤压哪些提交。我无法找到它如何执行此操作的解释,因此我无法找出出了什么问题/如何修复它。

我该如何解决这个问题?如果无法直接修复,是否可以使用另一种工作流程,该工作流程将为我提供一个具有完整历史记录的分支和一个具有 merge 提交的分支,这些提交可以引用回它们的来源?

添加更多详细信息:

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)

第二次挤压 merge 提交了 A、B、C、D、E、F,而不仅仅是 E、F 记录在其中

最佳答案

原始答案(请参阅下面的更新):

git merge --squash 执行与不带 --squash 的常规 git merge 相同的历史分析。要做到这一点,就需要了解历史。但是您过去所做的 --squash merge 删除了该历史的重要部分。

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

一般情况下,不要使用 git merge --squash ,除非您知道后果。它的主要目的(IMO)实际上只是将一系列困惑的提交减少为单个提交。如果您无论如何都使用功能分支,那么它是完全无法使用的(再次在我看来)。只需保持功能分支干净并使用常规的 git merge 即可。


更新:

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

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

C 是提交 B 的压缩 merge ,即 0B 之间的更改,并且G 是提交 F 的压缩 merge ,即 DF 之间的更改。

D 为 HEAD 提交。此时,当您git merge F(有或没有--squash)时,Git 确定 merge 基础,即D

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

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

一个可能的修复方法是当您位于 M 的临时分支上时生成挤压 merge G'。然后您选择 G'staging:

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

这应该适合您,因为 DM 的树应该是相同的。

关于git merge --squash 包含额外的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62381664/

相关文章:

windows - Windows 上的 git http 身份验证问题

merge 之前或之后的 Git 标签?

Mysql通过合并多列创建新列并显示结果

join - 如何通过在hadoop中合并两个文件在hdfs中创建文件

javascript - 将两个选项对象与函数合并

node.js - 如何将 fork 的 lerna 存储库的子包安装为 Node 依赖项?

python - 当 Pipenv 与 git 一起使用时,如何解决 Pipfile 和 Pipfile.lock 中的 git 冲突?

git:接收后 Hook 中的空参数

python - 合并背景音频文件

r - 如何有效地合并两个数据集?