
一文搞懂 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)score100# 你本地 main 分支传入的项(Incoming)score95# 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 文章的最大动力。