【问题标题】:Git , Merge Already Up TO date but with diff?Git,合并已经是最新的但有差异?
【发布时间】:2021-12-01 03:36:51
【问题描述】:

我有两个本地分支机构,比如 A 和 B。 我运行以下命令

  1. git checkout A
  2. git merge -X theirs B - “评论”

如果我再次运行命令
git merge B --> 它抛出消息“已经是最新的”

如果我运行以下命令 git diff A..B --> 它返回 4 个文件的差异

所以我用分支 B 的内容“粉碎”分支 A 的内容 如果我再次在分支 A 上运行合并命令,它会返回一切都是最新的 但是如果我在两个分支之间运行“差异”,它会返回四个文件中的差异。

发生了什么?

提前致谢。
最好的问候

【问题讨论】:

    标签: git csv merge diff


    【解决方案1】:

    须知:

    • commits 中的 Git 流量。

    • 每个提交至少有一个父提交,并通过其父链“到达”其他提交。

    • 分支是一个提交的名称

    • 合并创建一个提交并移动当前分支的分支名称。

    • 短语“最新”意味着一个分支没有达到另一个分支没有达到的任何提交。

    假设我们从这种情况开始(箭头指向时间向后,每个提交都指向其父级):

    A <-- B <-- C <-- D (branch1)
     ↖︎
       <-- X <-- Y <-- Z (branch2)
    

    现在我结帐branch1 并说git merge branch2。我明白了:

    A <-- B <-- C <-- D <-- M (branch1)
     ↖︎                    ↙︎
       <-- X <-- Y <-- Z (branch2)
    

    所以现在,一方面,尝试将branch2 合并到branch1 是没有意义的再次; branch1 已经达到了 branch2 达到的所有相同提交。因此,“最新”。但是 commit M 和 commit Z 也不相同。


    也许你的困惑是因为你认为

    git merge -X theirs B
    

    在合并方面做了一些特别的事情。它没有。这仍然是一个非常普通的合并。它唯一特别做的是以防发生任何合并冲突; theirs 提供了有关如何在不寻求人工帮助的情况下解决这些冲突的提示。

    【讨论】:

    • 关于-X highlighted on the manual page 的一个重要说明是它不会选择合并策略,它会为所选策略选择一个选项。所以就其本身而言,-X theirs 使用带有“他们的”选项的“递归”策略,正如您所说,它控制着如何解决冲突。他们也是“我们的”策略 (-s ours),它将所有内容都标记为合并,而不会从其他分支中引入任何更改(但没有“他们的”策略)。
    • 是的,我故意省略了ours 策略。它并不真正相关,因为它也不会使 MZ 相同。
    • 它可以用来创建一个 M 和 Z 相同的树,我认为,通过在 branch2 上进行合并然后交换指针。像git switch branch2; git merge -s ours branch1; git branch temp; git reset --hard HEAD^; git switch branch1; git reset --hard temp; git branch -d temp 这样的东西最后,branch1 将具有 branch2 的内容(提交 Z),但是提交 D 的额外父级。
    • 感谢您的快速回答,我打开了其中一个文件,差异表明它是不同的,并且确实存在差异,我怎样才能将 A 的版本与 B 中的版本“粉碎”?我想做的是用分支B中的内容“粉碎”分支A中的所有内容,就像“替换”一样?提前致谢
    • 好的,但那不是你问的。我试图回答你提出的问题。如果您有不同的“如何做”问题,也许您可​​以将其作为一个新问题提出。虽然我认为之前的评论确实回答了这个问题。
    猜你喜欢
    • 2014-11-11
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 2012-04-25
    相关资源
    最近更新 更多