返回
冲突优雅的艺术
开发工具
2023-10-15 09:16:03
版本控件,比如 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
冲突的两段改动以 <<<<<<<
、=======
、>>>>
进行标记。<<<<<<<
标记开头表示本地改动,=======
标记分隔两段改动,>>>>>>>
标记末尾表示远程改动。
冲突化解
检测冲突仅仅是第一步,真正的挑战是化解冲突。有如下几种选择:
- 手工化解
- 使用
git
命令行工具 - 使用图形化工具(比如
gitk
)
手工化解冲突是最直接的方式,但需要一定的 git
知识和使用文本比对工具的熟练度。git
命令行提供了几个有用的命令:
git checkout -- <file>
: 恢复指定文件的本地改动git checkout <commit-ish> -- <file>
: 恢复指定提交中文件的改动git reset HEAD <file>
: 抛弃本地对指定文件的改动git add <file>
: 标记指定文件的改动为已暂存
图形化工具(比如 gitk
)提供了更友善的操作界面,适合新手入门。
具体化解冲突的方式取决于冲突的具体内容。总体思路是:
- 找出冲突的根源
- 选择接受哪一段改动
- 移除冲突标记
- 保存文件
- 暂存文件
- 提交改动
总结
git
冲突是多人合作版本管理中一个常见的挑战。掌握如何检测、化解冲突至关重要的。手工化解冲突是最直接的方式,但需要一定的 git
知识和熟练度。git
命令行工具和图形化工具(比如 gitk
)可以辅助冲突化解。
冲突也提供了一个绝佳机会,让团队成员讨论并达成对改动内容的共识。良好的沟通和合作习惯是避免和化解 git
冲突的最佳途径。