【问题标题】:Merge did not introduce merged changes合并没有引入合并的更改
【发布时间】:2021-04-02 03:19:56
【问题描述】:

我有一个分支,它是从分支 main 的提交 A 合并而来的。我做了一些更改,结果是这样的:

A-B-C-D

然后我将分支合并回main,引入了合并提交。快进合并就足够了,但我们的策略是创建合并提交。我注意到合并的提交消息中有拼写错误,并使用git commit --amend 进行更正。历史现在看起来是这样的。其中E 是合并提交。

A-B-C-D-E

E 的父母被 git log 显示为Merge: A D

现在的问题是 main 不再包含提交 B、C 或 D 的更改。

  • 例如,C 更改了文件 foo/bar,但在打开 E 之后的文件时,文件处于“A”状态。
  • git log -- foo/bar 也没有列出提交 C。
  • 执行git diff A Egit show E 一样显示空差异。

这是我的参考日志中的相应部分:

E HEAD@{93}: commit (amend): Finish Hotfix
Z HEAD@{94}: commit (merge): Finsh Hotfix
A HEAD@{95}: checkout: moving from hotfix to main
D HEAD@{96}: commit: Changes
C HEAD@{97}: commit: Changes
B HEAD@{98}: commit: Changes
A HEAD@{99}: checkout: moving from main to hotfix

当我尝试再次合并更改时 (git merge D) git 状态为 Already up to date.

  • 我怎么会变成这样?导致修改问题?
  • 在不过多混淆历史记录的情况下解决此问题的最佳选择是什么?分支前几天已经推送了,不能再重写了。

【问题讨论】:

  • "git log -- foo/bar does not list commit C" 这并不能证明你认为它证明了什么,因为默认情况下这个命令不会分支到合并的第二个父节点。跨度>
  • @matt 好的,感谢您指出这一点。然而,该文件不包含提交 C 对其所做的更改
  • 嗯,发生了一些你没有告诉我们的事情。如果您真正合并,合并提交,然后立即进行提交修改,那么(如您所说)A 和 D 仍然是修改后提交的父级(它是合并提交)并且两个分支中的更改都存在在修改后的合并提交中。所以要么你做了一些你没有告诉我们的其他事情,要么你测试“变化是否存在”的方法是错误的。
  • 例如,您说“尽管如此文件不包含更改”。好的,所以它可能不包含 now 的更改。但这将是由于稍后完成的。我们在 HEAD 负 93;那里有 92 次后来的提交可以扭转这些变化。
  • 追踪 D、C 和 B 中发生的事情,git checkout E(分离,只是暂时的)然后说git show HEAD^2,然后是git show HEAD^2~1,然后是git show HEAD^2~2

标签: git merge git-merge


【解决方案1】:

我仍然不确定最初是什么导致了问题,但似乎我在合并过程中犯了一个错误。

但是,git show E 没有显示任何更改,这让我感到困惑。这是由于我对git show 工作原理的误解造成的。 this answer 详细解释了它的工作原理。所以执行git show -m E 显示了合并提交如何恢复BCD 的所有更改。
在理解了这一点之后,我认为 revert commit 它是解决问题的最优雅的解决方案。那就是执行git revert -m2 E

【讨论】:

    【解决方案2】:

    修改合并提交,就其本身而言,不会以某种方式神奇地撤消合并的效果。因此,人们不得不得出结论,这个故事有问题。要么是您用于调查所发生事件的测试本身存在缺陷,因此您无法了解真实情况,要么是您没有告诉我们的更多事情发生。

    虽然这对这种情况没有多大帮助,但我将按照您描述的那样制定场景,以证明修改后的提交不会否定合并。

    构建历史:

    $ git init
    $ echo a > a; git add .; git commit -m'a' 
    $ git branch hotfix
    $ git checkout hotfix
    $ echo b > b; git add .; git commit -m'b'
    $ echo c > c; git add .; git commit -m'c'
    $ echo d > d; git add .; git commit -m'd'
    $ git checkout master
    $ git merge --no-ff hotfix # write commit message in editor
    

    检查合并后我们得到了什么:

    $ ls
    a   b   c   d
    $ git log --oneline --graph
    *   2eb6b68 (HEAD -> master) Merge branch 'hotfix'
    |\  
    | * ec24fa1 (hotfix) d
    | * 052560f c
    | * 74d6f9a b
    |/  
    * 220dd03 a
    

    修改合并提交并检查我们得到了什么:

    $ git commit --amend # write new commit message in editor
    $ ls
    a   b   c   d
    $ git log --oneline --graph
    *   7a7d731 (HEAD -> master) Improved merge branch 'hotfix'
    |\  
    | * ec24fa1 (hotfix) d
    | * 052560f c
    | * 74d6f9a b
    |/  
    * 220dd03 a
    

    如您所见,修改后的合并提交只是换成了原始合并提交,而不会破坏历史记录或结果。

    【讨论】:

      猜你喜欢
      • 2020-12-23
      • 2015-02-19
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      相关资源
      最近更新 更多