git - 为什么 git 自动解决这个冲突?

标签 git version-control merge

重现该情况的步骤 1. 在 git master 中创建文件 test.txt,其中包含内容

A
B
C

并提交它。

  • 创建新分支 test-v1
  • 在 master 分支中删除 B 行,这样你就拥有了

    A
    C
    
  • 从步骤 3 精选提交到 test-v1

  • checkout 分支 test-v1 并再次添加 B 行并提交

    A
    B
    C
    
  • 查看主分支

  • git merge test-v1
  • 我期望得到什么:

        A
        B
        C
    

    我得到了什么:

        A
        C
    

    问题:为什么B在 merge 时会自动解决而不标记为 merge 冲突?

    我尝试了不同的 merge 策略(git merge --strategy),但我没有找到任何可以获得预期结果的地方。唯一的方法是在 master 上 git rebase test-v1 。但我想在更复杂的设置中,它可以重写 master 的历史,对吗?

    最佳答案

    正如我们已经在 git IRC 中讨论的那样,在 thiago(Freenode 上的注册用户和经验丰富的 git 用户)的大力帮助下,我将采纳他的答案并将其放在这里以确保完整性:

    在您分支“test-v1”时,文件 test.txt 确实包含内容

    A
    B
    C
    

    在两个分支中,mastertest-v1

    现在,您正在将 master 中的更改应用到 test.txt,并将它们挑选到分支 test-v1。之后,您 checkout test-v1 并将 B 添加回文件中。 merge 后会发生什么?想象一下我现在是 git:

    1. 好吧,让我查一下共同祖先:啊,好吧,我明白了,文件测试看起来像 A B C

    2. 让我们看看 test-v1 中所做的更改:嗯,好吧,看起来与共同祖先相同

    3. 让我们看看 master 中所做的更改:啊好吧,有些东西发生了变化,让我们考虑一下修改

    -> 结果

    A
    C
    

    关于git - 为什么 git 自动解决这个冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31824993/

    相关文章:

    git - git中 "ours"和 "theirs"的具体含义是什么?

    database - 将多个Access数据库合并为一个大数据库

    git - ssh 代理转发不适用于 ec2

    git-clone 和 checkout 后 Hook

    git - 我如何向 gnu make 提交 git SHA1?

    git - 将一个存储库的提交 merge 到另一个存储库

    git - 如何删除 GitLab 存储库中的标签

    unity-game-engine - TortoiseGit 和 UnityYAMLMerge

    version-control - 是否有允许您永久删除文件的版本控制系统?

    git - GIT merge 后我还有旧分支