上节讲到 拉取
(pull),说到:
拉取不仅将数据下载到你的本地版本库,还会自动合并。
在合并期间,将更新工作区文件以反映合并结果。如果合并文件的同一区域被多方更改,就会产生冲突。Git 不能随机选择一方而丢弃另一方,所以会要求开发者手动解决冲突。
每当报告冲突时,都需要解决它。
在发生冲突的文件中,冲突区域有明显的标记,比如:
<<<<<<< yours你当前工作区的代码
=======合并过来的代码
>>>>>>> their
当发生冲突后,TortoiseGit会用图标标出冲突文件,以方便的找到这些文件,如下图红框圈出部分。
可以使用任何编辑器手动解决冲突,也可以通过 TortoiseGit 提供的菜单解决冲突:选中冲突文件,在右键菜单中选择TortoiseGit → Edit Conflicts ,启动外部合并工具/冲突编辑器手动解决冲突。
使用Edit Conflicts
菜单后,TortoiseGit 将在所选冲突文件的目录中放置三个附加文件,并启动配置的冲突编辑器:
-
filename.ext.BASE.ext: 这是冲突文件的共同祖先版本。
-
filename.ext.LOCAL.ext:这是开始合并前工作树中存在的文件。
-
filename.ext.REMOTE.ext: 这是要合并的修订版中的文件。
手动修改冲突文件后,执行 TortoiseGit → Resolve… 菜单项,会将刚刚的修改冲突内容提交到存储库。务必注意,在没有手动修改冲突文件前,单纯的使用 Resolved 菜单无法真正解决冲突,它只是使用git add
命令将冲突文件标记为“冲突已解决”,以允许你后续提交更改,并删除 filename.ext.LOCAL.ext、filename.ext.BASE.ext、和filename.ext.REMOTE.ext 文件。
如果二进制文件产生了冲突,Git不会尝试合并文件本身。本地文件保持不变。为了解决冲突,使用TortoiseGit → Resolve…菜单项,然后右击冲突文件,选择Resolved(使用本地工作区中的文件)或者选择Resolve conflict using “HEAD” (使用HEAD版本文件)或者选择Resolve conflict using “MERGE_HEAD”(使用合并版本/分支的文件) 。然后进行提交。
如果你选中父文件夹,然后选择 TortoiseGit → Resolve… 菜单项,则会弹出一个窗口,列出改文件夹中所有的冲突文件,这样就可以将 Resolved 命令用于多个文件。
总结一下,使用TortoiseGit工具处理冲突的步骤如下:
- 选中所有冲突文件的父文件夹,选择右键菜单 TortoiseGit → Resolve…;
- 在弹出的窗口中会列出所有冲突的文件;
- 依次选中文件,选择右键菜单 Edit conflicts,将启动外部合并工具/冲突编辑器;
- 在编辑器中手动解决冲突;
- 所有冲突文件都解决后,点击 OK 按钮,在弹出的提交窗口中点击 commit 按钮;
如果你只是想用本地的版本替换远端,或者用远端的版本替换本地的,则不必打开任何编辑器,TortoiseGit 提供了更简便的方法:
-
选中所有冲突文件的父文件夹,选择右键菜单 TortoiseGit → Resolve…;
-
在弹出的窗口中会列出所有冲突的文件;
-
依次选中文件,选择右键菜单 Resolve conflict using “HEAD”(使用本地版本替换远端的),或者选择 Resolve conflict using “MERGE_HEAD”(使用远端版本代替本地的)。
右键菜单 Resolved 是使用当前工作区的版本,但是冲突发生时,当前工作区的版本是带有冲突标记的,如:
<<<<<<< yours你的更改 =======changes from the code merged >>>>>>> their
所以右键菜单 Resolved 一般用于二进制文件。
-
所有冲突文件都解决后,点击OK按钮。
-
做一次提交(commit)。
读后有收获,资助博主养娃 - 千金难买知识,但可以买好多奶粉 (〃‘▽’〃)