一文搞懂 Git 合并与比较:C、A、I、K、T 到底代表什么?
在使用 Git 图形化工具(如 Git GUI、SourceTree、VS Code 的 Git 面板、GitKraken 等)进行冲突解决或提交管理时,你经常会看到类似这样的按钮或菜单项:
合并(M)
比较当前项和传入的项(A)
比较当前项©(目标)
比较传入的项(I)(源)
保留当前项(K)(目标)
获取传入的项(T)(源)
暂存(S)
它们到底是什么意思?分别代表什么?
本文将用一个清晰易懂的“双人修改同一个文件”的例子,帮你彻底理解这些操作背后的逻辑。
一、背景:什么时候会出现这些选项?
这些操作最常见于合并冲突或三方合并视图中。
假设:
- 你从远端拉取代码(
git pull) - 或者合并另一个分支(
git merge feature) - 或者变基(
git rebase)
此时,Git 发现同一个文件的同一块区域被你和别人改成了不同的样子,就会产生冲突。
图形工具会把冲突区域拆分成:
- 当前项 (Current)— 当前分支上的内容(也叫“目标”,你本地的或目标分支的)
- 传入的项 (Incoming)— 要合并进来的分支的内容(也叫“源”,别人的或另一个分支的)
- 合并结果 (Merged)— 你手动或通过这些操作最终保留的内容
理解这三个角色,是搞懂上述选项的前提。
二、术语对照表(英文 → 中文)
| 原文 | 常见中文 | 含义 |
|---|---|---|
| Current | 当前项 / 目标 | 你当前所在分支(或本地)的内容 |
| Incoming | 传入的项 / 源 | 要合并进来的分支的内容 |
| Merged | 合并结果 | 最终写入文件的内容 |
| Compare | 比较 | 查看两个版本之间的差异 |
| Keep | 保留 | 最终采纳哪个版本 |
| Take | 获取 / 采纳 | 与 Keep 类似,也是选择某个版本 |
| Stage | 暂存 | 标记为解决冲突,准备提交 |
三、逐个选项详解(结合场景)
🧩 1. 合并(M)
含义:
执行标准的三方合并。它会尝试智能地合并当前项和传入项,如果能自动合并就自动合并,否则高亮冲突让你继续手动选择。
使用场景:
你希望 Git 自动帮你合并,而不是完全听某一个版本。
背后逻辑:
相当于git merge在无冲突时的自动行为,或在冲突工具中自动合并非冲突行。
🧩 2. 比较当前项和传入的项(A)
含义:
将当前项(Current)与传入的项(Incoming)进行对比,只显示两个版本的差异,不涉及合并结果。
使用场景:
你想看清楚“我的改动”和“别人的改动”到底哪里不一样。
相当于:git diff <当前分支> <传入分支>但只针对冲突文件。
🧩 3. 比较当前项©(目标)
含义:
将当前项(Current)与合并结果(Merged)进行比较。
使用场景:
在你手动修改合并结果后,检查你最终保留的内容与原来自己版本的区别。
典型用途:
确保你没有意外丢掉自己的重要修改。
🧩 4. 比较传入的项(I)(源)
含义:
将传入的项(Incoming)与合并结果(Merged)进行比较。
使用场景:
确认你从对方的改动中保留了哪些、丢弃了哪些。
典型用途:
审查对方的修改是否被合理采纳。
🧩 5. 保留当前项(K)(目标)
含义:
完全使用当前项(Current)的内容,丢弃传入项(Incoming)的所有冲突修改。
使用场景:
你确信自己的改法完全正确,对方的改法不应该进入最终版本。
相当于:
命令行执行git checkout --ours <文件>并标记冲突已解决。
⚠️注意:这会直接丢掉对方的修改,需谨慎使用。
🧩 6. 获取传入的项(T)(源)
含义:
完全使用传入的项(Incoming)的内容,丢弃当前项(Current)的冲突修改。
使用场景:
你认可对方的改法完全覆盖你的改法,或者你之前改错了。
相当于:
命令行执行git checkout --theirs <文件>并标记冲突已解决。
🧩 7. 暂存(S)
含义:
标记该冲突文件已解决,并将当前编辑器中的合并结果放入暂存区(Staging Area),准备提交。
注意:
这不是“临时保存未完成的工作”(那是git stash),而是“冲突解决完成,可以 commit 了”。
使用场景:
你完成某个文件的冲突合并后,告诉 Git “这个文件搞定了”。
相当于:git add <冲突文件>
四、一个完整例子帮你串起来
假设你在main分支,合并feature分支:
当前项(Current):
score=100# 你本地 main 分支传入的项(Incoming):
score=95# feature 分支
工具显示冲突。
你的操作过程示例:
先点比较当前项和传入的项(A)
→ 发现对方把 100 改成了 95,你是 100。决定保留谁?
- 点保留当前项(K)→ 最终是 100(你的胜出)
- 点获取传入的项(T)→ 最终是 95(对方的胜出)
- 点合并(M)→ 手动改成 98,两边都不全用。
手动修改合并结果后,点比较当前项©和比较传入的项(I)反复确认。
确认无误后,点暂存(S)并提交。
五、常见误区对照表
| 错误理解 | 正确理解 |
|---|---|
| 暂存(S) 是临时保存 | 暂存 =git add,冲突解决完成 |
| 比较当前项© = 比较当前和传入 | 实际是比较当前与最终结果 |
| 获取传入的项(T) 会合并 | 不会合并,是完全覆盖 |
| 必须一步步点这些按钮 | 熟练后可直接选 keep / take |
六、总结一句话记忆版
| 操作 | 一句话解释 |
|---|---|
| 合并(M) | 自动合并两边 |
| 比较当前项和传入的项(A) | 我的 vs 别人 |
| 比较当前项© | 我的 vs 最终结果 |
| 比较传入的项(I) | 别人的 vs 最终结果 |
| 保留当前项(K) | 只要我的 |
| 获取传入的项(T) | 只要别人的 |
| 暂存(S) | 解决完了,add 它 |
七、写在最后
很多初学者看到这些选项会一头雾水,但只要理解“当前项(我的)”、“传入项(别人的)”、“合并结果(最终)”这三个角色,再加上“比较”是看差异、“保留/获取”是选谁、“暂存”是提交前的最后一步,就能非常从容地处理 Git 冲突。
下一篇预告:Git 合并与 Rebase 中的冲突差异,以及 --ours / --theirs 的隐蔽陷阱。
如果你也在团队协作中遇到过搞不清“保留当前项”还是“获取传入的项”,欢迎转发给你的同事,一起告别合并恐惧。
你的点赞与在看,是作者继续写出高质量 Git 文章的最大动力。