在团队协作和版本控制过程中,Git 冲突是常见的问题,尤其是在多人同时修改同一文件的同一部分时,要高效解决冲突,首先需要准确查看冲突的具体内容和位置,Git 提供了多种命令和工具来帮助开发者识别、定位和分析冲突,以下是详细说明。

使用 git status 查看冲突状态
当合并、变基或拉取操作引发冲突时,git status 是最先使用的命令,它能快速提示哪些文件存在冲突,执行后,输出中会明确标记冲突文件,
On branch main
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git add <file>..." to mark resolution)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: src/utils.js
这里的 "both modified" 表示该文件在分支合并时被双方修改,需手动解决冲突。git status 还会提示后续操作,如标记解决后的文件或提交合并结果。
使用 git diff 查看冲突详情
git diff 是查看文件修改的核心命令,在冲突场景下,它能直观显示冲突的具体代码差异,默认情况下,git diff 会展示当前分支与目标分支(如 main)的差异,冲突部分会用特殊标记标注:
diff --cc src/utils.js
index a1b2c3d..e4f5g6h 100644
--- a/src/utils.js
+++ b/src/utils.js
@@ -<<<<<<< HEAD
const count = 10;
+ const name = "Alice";
+=======
+ const count = 20;
+ const name = "Bob";
+>>>>>>> feature-branch
console.log(count);
标记中 <<<<<<< HEAD 到 之间是当前分支的代码, 到 >>>>>>> feature-branch 之间是目标分支的代码,通过 git diff,开发者可以清晰看到冲突的代码行,并决定保留哪部分或如何修改。

使用 git diff --ours/--theirs 对比分支代码
若想单独查看当前分支或目标分支的修改内容,可通过 --ours 和 --theirs 选项实现。
git diff --ours:显示当前分支(如HEAD)独有的修改,排除冲突部分。git diff --theirs:显示目标分支(如feature-branch)的修改。
这对理解分支差异、选择保留哪些代码非常有帮助。git diff --ours src/utils.js # 查看当前分支在冲突文件中的修改 git diff --theirs src/utils.js # 查看目标分支的修改
使用 git log 分析冲突历史
有时冲突源于多次提交的累积,git log 可帮助追溯修改历史。
git log --oneline --merge # 查看涉及冲突的提交记录
该命令会列出所有参与合并的提交,便于定位冲突的根源,结合 git show <commit> 可进一步查看某次提交的具体修改。
使用 git checkout 或 git reset 查看冲突前的版本
若想回退到冲突前的状态以对比原始文件,可通过以下方式:

git checkout --theirs <file> # 保留目标分支版本(暂存区)
git checkout --ours <file> # 保留当前分支版本(工作区)
注意:此操作会覆盖当前工作区的修改,建议先备份或通过 git stash 保存。
图形化工具与第三方工具辅助
除了命令行,Git 还支持图形化工具查看冲突,如:
- Git GUI:执行
git gui后,点击 "Merge" 按钮,冲突文件会以红色标记,点击可查看差异。 - IDE 集成:如 VS Code、IntelliJ IDEA 等工具会高亮冲突代码,并提供合并界面。
git mergetool:配置后可调用外部工具(如kdiff3、meld)可视化解决冲突。
冲突解决后的验证
解决冲突后,需通过以下步骤确认:
- 使用
git add <file>标记已解决的文件。 - 执行
git status确认无未解决冲突。 - 提交合并:
git commit -m "Resolve merge conflict in <file>"。
冲突查看命令对比表
| 命令 | 功能 | 示例 | 适用场景 |
|---|---|---|---|
git status |
查看冲突文件状态 | git status |
快速定位冲突文件 |
git diff |
显示冲突代码差异 | git diff src/utils.js |
查看具体冲突行 |
git diff --ours |
对比当前分支修改 | git diff --ours <file> |
分析当前分支代码 |
git diff --theirs |
对比目标分支修改 | git diff --theirs <file> |
分析目标分支代码 |
git log --merge |
查看冲突提交历史 | git log --oneline --merge |
定位冲突根源 |
git mergetool |
启用图形化合并工具 | git mergetool |
可视化解决冲突 |
相关问答 FAQs
Q1: 如何区分 git diff 和 git diff --cached 在冲突时的作用?
A: git diff 显示工作区与暂存区的差异(即未暂存的修改),而 git diff --cached 显示暂存区与最新提交的差异(即已暂存但未提交的修改),在冲突场景下,git diff 会展示当前未解决的冲突代码,而 git diff --cached 通常不直接显示冲突内容,除非已通过 git add 标记冲突文件。
Q2: 冲突解决后,如何验证合并结果是否符合预期?
A: 验证步骤包括:
- 代码审查:通过
git show查看提交内容,确认冲突代码已正确合并。 - 运行测试:执行项目的单元测试或集成测试,确保修改未引入新问题。
- 分支对比:使用
git diff main..branch检查分支是否已完全合并,或git log --graph可视化提交历史。 - 回滚测试:若发现问题,可通过
git reset --hard HEAD~1撤销提交并重新处理冲突。
