V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
0xABCD
V2EX  ›  问与答

一个关于 git 冲突的问题?

  •  
  •   0xABCD · 2018-10-16 22:33:03 +08:00 via Android · 2080 次点击
    这是一个创建于 1989 天前的主题,其中的信息可能已经有所发展或是发生改变。

    合并代码有时会看到形如如下格式的冲突:

    <<<<<<<HEAD

    code code code

    hash

    我想到一种可能出现这种情况的场景,即有 cherry-pick 操作的时候,pick 了某个 commit,但是这个 commit 前面的 commit 没有被 pick 过来,所以会导致这种情况。我的问题是,还有别的场景吗?因为我确实有过 cherry-pick 的操作,但是并不经常,而以上形式的合并冲突我看到比较多次了。

    求 git 大佬指点迷津

    13 条回复    2018-10-17 09:22:49 +08:00
    0xABCD
        1
    0xABCD  
    OP
       2018-10-16 22:36:00 +08:00
    发出来格式被吃掉了,再发一个:
    ```
    <<<<<<<HEAD
    =======
    code
    code
    code
    >>>>>>>hash
    ```
    guog
        2
    guog  
       2018-10-16 23:03:22 +08:00 via Android
    应该是没有经常 pull 代码吧,别人推了新的 commit 了
    liangzi
        3
    liangzi  
       2018-10-16 23:08:53 +08:00 via Android
    代码占用空间少的话 rm 掉整个代码目录重新 clone 最简单有效
    hlwjia
        4
    hlwjia  
       2018-10-16 23:27:05 +08:00
    @liangzi 这样的回答在 stackoverflow 上面是要 -100000 的
    0xABCD
        5
    0xABCD  
    OP
       2018-10-16 23:52:22 +08:00 via Android
    @guog 没有经常 pull 就会产生冲突?这里奇怪的是本地代码是空的还与远程分支冲突了
    hzwjz
        6
    hzwjz  
       2018-10-17 00:11:13 +08:00
    merge 两个分支的时候,也有这种情况。

    比如两个不同的分之,且相同一个文件,相同位置的代码不一样,merge 的时候也是会产生 conflict 的。
    假设两个分支为 develop,production 在 production 中执行 git merge dev,相同文件同一位置的代码不一样的话。
    会产生
    <<<<<<<<HEAD
    =====
    code1
    code2
    >>>>>>>>develop
    msg7086
        7
    msg7086  
       2018-10-17 01:02:06 +08:00
    产生冲突很正常,做 3-way merge 就行了。
    liangzi
        8
    liangzi  
       2018-10-17 06:35:47 +08:00 via Android
    @hlwjia 哈哈 这是我自己处理的经历 非技术人员 见笑了哈
    Sharuru
        9
    Sharuru  
       2018-10-17 08:03:20 +08:00 via Android
    只要产生了无法自动解决的冲突时,源文件都会这样啊
    0xABCD
        10
    0xABCD  
    OP
       2018-10-17 08:31:18 +08:00 via Android
    @hzwjz 还是不能理解,你描述的这种情况,git 为什么不视为 develop 有“新增”代码,直接自动合并呢?
    0xABCD
        11
    0xABCD  
    OP
       2018-10-17 08:32:43 +08:00 via Android
    @Sharuru 我不明白的“点”就是:为什么远程分支会跟本地的“空行”发生冲突
    networm
        12
    networm  
       2018-10-17 09:02:19 +08:00 via iPhone
    很简单,因为换行符不一致,你应该使用比较软件仔细检查。
    Git 默认情况下换行符不一致也会报告冲突,除非开启忽略换行符选项。
    Sharuru
        13
    Sharuru  
       2018-10-17 09:22:49 +08:00
    @0xABCD #11 6 楼的回答应该已经能解决一部分疑问了。

    假设文件名叫 A,当你从 master checkout 至 develop 分支时,A 文件会有一个 base 版本,你在 develop 分支修改的文件为 ours,其他人在 master 分支修改的文件为 theirs。

    当从 theirs 时拉取变更至 ours 时,选定的 diff 工具会根据一定的方法对文件进行比较。由于比起 base,theirs 和 ours 都发生了变更,且在同一行时,就会发生冲突问题,此时就要通过 base - theirs - ours 这种 3-way merge 的方式来解决冲突。

    毕竟 diff 工具不可能像 IDE 那么智能,一些看上去理所当然应该合并的东西却没有合并,可能这也是你觉得奇怪为什么无法自动合并的原因之一。

    GitTower 的教程中,有一部分说明了如何看懂 diff 信息,如果好奇可以参考确定:



    https://www.git-tower.com/learn/git/ebook/cn/command-line/advanced-topics/diffs
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3348 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 13:37 · PVG 21:37 · LAX 06:37 · JFK 09:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.