Git 合并未引入合并的更改

Git 合并未引入合并的更改,git,merge,git-merge,Git,Merge,Git Merge,我有一个分支,它是从分支main的commita合并而来的。我做了一些改变,结果是: A-B-C-D 然后我将分支合并回main,引入合并提交。快进合并就足够了,但我们的策略是创建合并提交。我注意到合并的提交消息中有一个拼写错误,于是做了一个git commit--amend来纠正它。历史现在是这样的。其中E是合并提交 A-B-C-D-E git日志将E的父项显示为Merge:A D 现在的问题是main不再包含提交B、C或D的更改 例如,C更改了文件foo/bar,但从E开始打开文件时,

我有一个分支,它是从分支
main
的commit
a
合并而来的。我做了一些改变,结果是:

A-B-C-D
然后我将分支合并回
main
,引入合并提交。快进合并就足够了,但我们的策略是创建合并提交。我注意到合并的提交消息中有一个拼写错误,于是做了一个
git commit--amend
来纠正它。历史现在是这样的。其中
E
是合并提交

A-B-C-D-E
git日志将E的父项显示为
Merge:A D

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

  • 例如,C更改了文件
    foo/bar
    ,但从
    E
    开始打开文件时,文件处于“A”状态
  • 另外,
    git日志--foo/bar
    没有列出commit C
  • 执行
    git diff A E
    会显示一个空的diff,就像执行
    git show E
    一样
这是我的reflog中的相应部分:

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声明
已经是最新的。

  • 我怎么会变成这样?问题出在哪里
  • 我最好的选择是什么来解决这个问题,而不让历史变得太混乱?分支在几天前已经被推送,不能再重写了

    • 修改合并提交本身并不能神奇地撤销合并的效果。因此,人们不得不得出这样的结论:这个故事有问题。要么你调查所发生事情的测试本身有缺陷,因此你没有得到真实的情况,要么你没有告诉我们更多的事情

      虽然这对情况没有多大帮助,但我将按照您所描述的方式执行场景,以证明修改后的commit不会否定合并

      构建历史:

      $ 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
      

      如您所见,修改后的合并提交只是替换为原始的合并提交,而没有打乱历史记录或结果。

      修改合并提交本身并不能神奇地撤销合并的效果。因此,人们不得不得出这样的结论:这个故事有问题。要么你调查所发生事情的测试本身有缺陷,因此你没有得到真实的情况,要么你没有告诉我们更多的事情

      虽然这对情况没有多大帮助,但我将按照您所描述的方式执行场景,以证明修改后的commit不会否定合并

      构建历史:

      $ 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
      

      正如您所看到的,修改后的合并提交只是替换为原始的合并提交,而没有打乱历史记录或结果。

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

      然而,
      gitshowe
      没有显示任何更改,这让我感到困惑。这是因为我对git show的工作原理有误解。详细说明了其工作原理。因此,执行
      git show-me
      显示合并提交如何还原
      B
      C
      D
      的所有更改

      理解了这一点后,我认为恢复提交是解决问题的最优雅的解决方案。这是在执行git revert-m2 E

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

      然而,
      gitshowe
      没有显示任何更改,这让我感到困惑。这是因为我对git show的工作原理有误解。详细说明了其工作原理。因此,执行
      git show-me
      显示合并提交如何还原
      B
      C
      D
      的所有更改

      理解了这一点后,我认为恢复提交是解决问题的最优雅的解决方案。这是在执行
      git revert-m2 E

      “git log--foo/bar不列出commit C”,它不能证明您认为它证明了什么,因为默认情况下,此命令不会分支到合并的第二个父级。@matt Ok,感谢您指出这一点。尽管如此,该文件并不包含commit
      C
      对其所做的更改。好吧,有些事情发生了,您没有告诉我们。如果您使用合并提交进行了真正的合并,然后立即进行了提交修改,那么(正如您所说)a和D仍然是修改后的提交(这是一个合并提交)的父级,并且两个分支中的更改都存在于修改后的合并提交中。因此,要么你做了一些你没有告诉我们的其他事情,要么你测试“更改是否存在”的方法是错误的。例如,你说“但是文件不包含更改”。好吧,也许它现在不包含更改。但那是因为后来做了些什么。我们在头上减去93;其中有92个以后的提交可能会逆转这些更改。要跟踪在D、C和B中发生的情况,
      git checkout E
      (分离,只是暂时的),然后说
      git show HEAD^2
      ,然后
      git show HEAD ^2~1
      ,然后
      git show HEAD ^2~2
      “git log--foo/bar不列出提交C”这并不能证明您认为它证明了什么,因为默认情况下,此命令不会分支到合并的第二个父级。@matt好的,谢谢您指出这一点。尽管如此,该文件并不包含commit
      C
      对其所做的更改。好吧,有些事情发生了,您没有告诉我们。如果你真的合并了