[Git] 使用vimdiff在Git合并中实现差异对比

目标

当发生冲突时,例如在pull操作时,可以使用vimdiff来解决冲突。

步骤

1. 用途

当git pull失败并且需要手动合并时,可以使用如下方法。

$ git pull
~
Auto-merging aaa
CONFLICT (content): Merge conflict in aaa
Automatic merge failed; fix conflicts and then commit the result.

2. 设定vimdiff作为合并工具进行使用。

请将以下内容放在全局配置中。

$ git config --global merge.tool vimdiff
$ git config --global merge.conflictstyle diff3
$ git config --global mergetool.prompt false

只要在git mergetool中设定vimdiff作为合并工具,即使没有输入任何内容,系统也会询问要使用哪个合并工具。

打开vimdiff。

$ git mergetool

输入此命令将打开以下形式的vimdiff界面。

╔═══════╦══════╦════════╗
║ LOCAL ║ BASE ║ REMOTE ║
╠═══════╩══════╩════════╣
║                       ║
║        MERGED         ║
║                       ║
╚═══════════════════════╝
ウィンドウ役割LOCAL現在のワーキングツリー上のファイルBASE共通の先祖ファイル。変更前はどのようなファイルだったかREMOTEワーキングツリーへマージしようとしているファイルMERGED最終的にレポジトリの中で保存されるファイル

4. 如何使用vimdiff

窗口之间的移动

可以使用键盘上的 [ctrl]+w → hjkl 来在各个窗口之间进行移动(h代表向左,j代表向下,k代表向上,l代表向右)。
注意:也可以使用光标键来代替hjkl。

合并方式

当切换到合并的窗口时,冲突部分以不同颜色显示。

冲突点是从<<<<<<<到>>>>>>>之间。

<<<<<<< HEAD
localfile
||||||| merged common ancestors
ancestor
=======
remotefile
>>>>>>> ap8990as3eipsaldjff669197e1sdkfasasdf1131d

当将光标置于冲突部分时,决定采用LOCAL,BASE,还是REMOTE,并通过以下命令进行应用。

採用対象反映コマンドLOCAL:diffg LBASE:diffg BREMOTE:diffg Rその他手動で編集
合并处理结束

编辑完毕后关闭窗口。
当光标位于MERGED窗口时,可使用:xa命令保存并批量关闭所有窗口。
如果光标位于MERGED窗口,则使用:w命令保存,并使用:qa命令批量关闭所有窗口。
(虽然使用:wqa命令可以一次性关闭所有窗口,但这样会导致LOCAL、BASE和REMOTE文件全部保存,使版本库中出现未跟踪的文件)

:xa
删除在作业中未被跟踪的文件。

vimdiff中的合并处理完成后,发生冲突的本地文件会以.orig作为扩展名另存为别名。
这些由vimdiff保存的备份文件不需要包含在版本库中,因此可以使用git clean来删除。
※需要注意不要意外删除新创建的文件。

$ git clean -n
$ git clean -f

使用 git clean 命令可以删除暂存区中未被跟踪的文件。选项 -n 是表示进行演习运行的选项。如果只想删除特定的文件,请指定文件路径。

$ git clean -n %untracked_file_path%
$ git clean -f %untracked_file_path%