返回

冲突优雅的艺术

开发工具

版本控件,比如 git,方便整理一段时间的改动,特别是团队合作时候。多人同时间改动相同的文件就会产生冲突。如果不恰当管理,会让人沮丧,浪费时间。本文将讨论如何恰当管理 git 冲突,优雅地化解。

我们已经知道了,git 冲突产生的根源:

  • 尝试将多个分支的改动合并到同一个分支时
  • 向同一个远程分支推送多个分支时

在这些场景中,多个分支很可能在相同的地方改动,也可能改动了文件的名字。

冲突检测

git 检测到冲突后会停止 git push 的动作,并输出一个信息:

Some local changes to the following files would be overwritten by this commit:

      file1.txt
      file2.txt

Please, compare your local copy with the remote copy

冲突检测到的文件由 git 打印,展示在终端中。事实上,git 已经自动尝试合并改动,并创建一个新文件,后缀名为 .orig。你可以用文本比对工具(比如 vimdiff)查看改动:

$EDITOR file.txt.orig myfile.txt

文件内容如下:

<<<<<<< HEAD
Line 1 from the local file.
=======
Line 1 from the remote file.
>>>>>>> branch-name

冲突的两段改动以 <<<<<<<=======>>>> 进行标记。<<<<<<< 标记开头表示本地改动,======= 标记分隔两段改动,>>>>>>> 标记末尾表示远程改动。

冲突化解

检测冲突仅仅是第一步,真正的挑战是化解冲突。有如下几种选择:

  1. 手工化解
  2. 使用 git 命令行工具
  3. 使用图形化工具(比如 gitk

手工化解冲突是最直接的方式,但需要一定的 git 知识和使用文本比对工具的熟练度。git 命令行提供了几个有用的命令:

  • git checkout -- <file>: 恢复指定文件的本地改动
  • git checkout <commit-ish> -- <file>: 恢复指定提交中文件的改动
  • git reset HEAD <file>: 抛弃本地对指定文件的改动
  • git add <file>: 标记指定文件的改动为已暂存

图形化工具(比如 gitk)提供了更友善的操作界面,适合新手入门。

具体化解冲突的方式取决于冲突的具体内容。总体思路是:

  1. 找出冲突的根源
  2. 选择接受哪一段改动
  3. 移除冲突标记
  4. 保存文件
  5. 暂存文件
  6. 提交改动

总结

git 冲突是多人合作版本管理中一个常见的挑战。掌握如何检测、化解冲突至关重要的。手工化解冲突是最直接的方式,但需要一定的 git 知识和熟练度。git 命令行工具和图形化工具(比如 gitk)可以辅助冲突化解。

冲突也提供了一个绝佳机会,让团队成员讨论并达成对改动内容的共识。良好的沟通和合作习惯是避免和化解 git 冲突的最佳途径。