1. Git 冲突产生的场景

当你在 git mergegit rebasegit cherry-pick 等操作时,如果 同一个文件的同一部分在两个分支中都被修改了,Git 就会无法自动合并,结果是产生冲突。

冲突后的文件中会出现类似这样的标记:

<<<<<<< HEAD
printf("Hello from main branch\n");
=======
printf("Hello from feature branch\n");
>>>>>>> feature

2. 冲突标记符号解释

  • <<<<<<< HEAD
    表示 当前分支(即你所在的分支) 的内容,也就是 ours

  • =======
    表示 ours 与 theirs 的分隔符。

  • >>>>>>> feature
    表示 要合并进来的分支(目标分支) 的内容,也就是 theirs

所以:

  • ours = 当前分支(HEAD)

  • theirs = 你要合并的分支

3. git checkout --ours 和 git checkout --theirs

这两个命令在冲突文件存在时使用,可以帮助你快速选择保留哪一方的版本。

语法

git checkout --ours <file>
git checkout --theirs <file>

含义

  • git checkout --ours <file>
    <file> 冲突部分全部替换为 当前分支(HEAD,ours) 的内容。

  • git checkout --theirs <file>
    <file> 冲突部分全部替换为 合并进来的分支(theirs) 的内容。

使用场景

  1. 如果你 确信本地分支的修改更正确,执行:

    git checkout --ours filename.c
    
  2. 如果你 确信远端分支的修改更正确,执行:

    git checkout --theirs filename.c
    
  3. 如果想要手动融合两边的修改(而不是简单选择一方),就要编辑冲突文件,把冲突标记符号 <<<<<<<=======>>>>>>> 删除,并保留你想要的代码。

4. 操作完成后的流程

无论是用 --ours--theirs,还是手动修改,最后都要:

git add <file>
git commit

Git 会生成一个合并提交(如果是 merge)。

5. 举例演示

假设我们在 main 分支有:

printf("Hello from main branch\n");

feature 分支有:

printf("Hello from feature branch\n");

合并时冲突文件会是:

<<<<<<< HEAD
printf("Hello from main branch\n");
=======
printf("Hello from feature branch\n");
>>>>>>> feature
  • 如果执行 git checkout --ours file.c → 文件变成:

    printf("Hello from main branch\n");
    
  • 如果执行 git checkout --theirs file.c → 文件变成:

    printf("Hello from feature branch\n");
    

总结:

  • ours = 当前分支 (HEAD)

  • theirs = 要合并进来的分支

  • <<<<<<< / ======= / >>>>>>> 是冲突标记,标记 ours 与 theirs 的不同部分。

  • git checkout --ours → 保留当前分支的修改

  • git checkout --theirs → 保留合并分支的修改

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐