Git冲突解决指南(使用git mergetool的方法)

如果文件编辑发生冲突的情况

这是一个常见(令人不快)的冲突画面,不是吗?

コンフリクトしたときのgit status

你们都是通过什么样的方式来合并冲突的呢?我想大部分人都是直接在vim或者emacs中进行编辑,但实际打开文件后会显示以下差异。

conflict-marker.png

看到这个界面,我不知道应该如何合并。(如果有 Objective-C 的 ARC/MRC 双重开发经验,请闭上眼睛….)

Git中配备了一个名为git mergetool的命令,它对这类冲突合并提供支持。

git mergetoolのプロンプト

如果按下Enter键,将会出现下面这样的画面。

mergetool2.png

由于画面尺寸限制,字体较小。现在我们来关注一下想要合并的差异产生前的状态和想要合并的差异部分。

mergetool2-base-remote.png

当我们对比这两个时,我们可以发现@property中的”*adapter”已经被改变为”*webViewAdapter”。
实际上,我们想要合并的差异内容就是上述变量名的更改。

因此,在“保存为合并结果的文件”中,我们需要在发生冲突的区域的上部(屏幕上的HEAD一侧)将adapter更改为webViewAdapter。请不要忘记删除下部的冲突标记。

順便提一下,如果在git merge中出现冲突的情况,中间是分支分叉时的状态,左边是当前分支添加的差异,右边是想要合并的分支添加的差异(三路合并)。
因此,通过比较中间和左边,我们可以确认当前分支的进展情况。
在这个例子中,我们可以看到在ARC适配中,retain变为了strong,assign变为了weak。

merge後の状態

当合并完成后,保存并关闭编辑器。合并前的状态会保存为相应的文件.orig。由于已自动添加到git,请进行提交。

请注意,如果要取消操作,请不要保存任何内容并关闭编辑器。

※顺便提一下,目前只支持vim……但是据说emacs也有一些配置方法,如果有人能成功的话,请留下评论。

如果启动类似于(用于Xcode的)GUI差异工具的情况

因为好像有一些人正在使用opendiff,所以请使用以下命令切换至vimdiff。

git config --global merge.tool vimdiff

以类似的方法,在不使用mergetool的情况下执行合并(番外篇)。

对于出于宗教原因无法使用vim或屏幕较小的人来说,这是一个好消息。

通常的冲突标记工具中,合并工具的中间画面(即将创建的合并差异之前的状态,称为”BASE”)会被省略,但是冲突标记工具中有显示该选项。

git config --global merge.conflictstyle diff3

冲突标记将如下所示。

<<<<<<< HEAD
merge前の状態
||||||| merged common ancestors
mergeしたい差分が作られる直前の状態
=======
mergeしたい差分
>>>>>>> branch

暂时设置也不会有损失。即使在使用mergetool的情况下,也可以在没有重大冲突的时候派上用场。
※但是,请注意,在没有冲突的位置添加的更改是无法理解的,所以在处理大的差异时,最好同时使用mergetool和git diff。

请参考:http://qiita.com/hchbaw/items/1191c2627307a4673b1b

如果文件删除发生冲突(路径冲突)

当删除的文件被编辑时,会发生这种情况。

    • Deleted by them:

mergeする差分で削除されています
現在のbranchで変更されています

Deleted by us:

現在のbranchで削除されています
mergeする差分で変更されています

通常情况下我们会最终选择删除文件,但由于需要合并,所以将保留下述文件。

git rm path/to/target/file

※可能会出现未合并的消息,但删除将会正常反映。

如果要多次合并相同的差异。

git有一个名为rerere的功能,它可以保存并重复使用冲突合并的差异结果。
对于维护者和发布负责人来说,在多次合并相同差异时非常方便。
您可以通过以下命令启用该功能。

git config --global rerere.enabled true
广告
将在 10 秒后关闭
bannerAds