如何在Git存储库中解决合并冲突?
下面是一个可能的使用场景,从头开始:
你要拉取一些更改,但哎呀,你没有更新到最新版本:
git fetch origin git pull origin master From ssh://gitosis@example.com:22/projectname * branch master -> FETCH_HEAD Updating a030c3a..ee25213 error: Entry 'filename.c' not uptodate. Cannot merge.
所以你更新到最新版本并再次尝试,但有冲突:
git add filename.c git commit -m "made some wild and crazy changes" git pull origin master From ssh://gitosis@example.com:22/projectname * branch master -> FETCH_HEAD Auto-merging filename.c CONFLICT (content): Merge conflict in filename.c Automatic merge failed; fix conflicts and then commit the result.
于是你决定查看更改:
git mergetool
哦我的天,上游更改了一些东西,但只是为了使用我的更改...不...是他们的更改...
git checkout --ours filename.c git checkout --theirs filename.c git add filename.c git commit -m "using theirs"
然后我们再试一次
git pull origin master From ssh://gitosis@example.com:22/projectname * branch master -> FETCH_HEAD Already up-to-date.
大功告成!
尝试:
git mergetool
它将打开一个GUI界面,引导您处理每个冲突,并且您可以选择如何合并。有时需要稍微手工编辑之后,但通常它是足够的。这肯定比完全手动合并要好得多。
[此命令]
未必会打开GUI,除非您安装了一个。在我的计算机上运行git mergetool结果使用的是vimdiff。您可以安装以下工具之一以代替:meld、opendiff、kdiff3、tkdiff、xxdiff、tortoisemerge、gvimdiff、diffuse、ecmerge、p4merge、araxis、vimdiff、emerge。
以下是使用vimdiff
解决合并冲突的示例过程,基于此链接。
-
在您的终端中运行以下命令
git config merge.tool vimdiff git config merge.conflictstyle diff3 git config mergetool.prompt false
这将把
vimdiff
设置为默认的合并工具。 -
在您的终端中运行以下命令
git mergetool
-
以下是您将看到的
vimdiff
展示格式:╔═══════╦══════╦════════╗ ║ ║ ║ ║ ║ LOCAL ║ BASE ║ REMOTE ║ ║ ║ ║ ║ ╠═══════╩══════╩════════╣ ║ ║ ║ MERGED ║ ║ ║ ╚═══════════════════════╝
这4个视图是
- LOCAL:这是当前分支中的文件。
- BASE:共同的祖先,这个文件在两次更改之前的状态。
- REMOTE:您正在合并到您的分支中的文件。
- MERGED:合并结果;这是将保存在合并提交中并在将来使用的内容。
您可以使用ctrl+w在这些视图之间导航。您可以使用ctrl+w后跟j直接到达MERGED视图。
-
您可以像这样编辑 MERGED 视图:
-
如果您想从 REMOTE 获取更改
:diffg RE
-
如果您想从 BASE 获取更改
:diffg BA
-
如果您想从 LOCAL 获取更改
:diffg LO
-
-
保存、退出、提交和清理
:wqa
保存并退出 vigit commit -m "message"
git clean
删除额外的文件(例如*.orig
)。警告:如果您不传递任何参数,它将删除所有未跟踪的文件。