如何在Git存储库中解决合并冲突?

18 浏览
0 Comments

如何在Git存储库中解决合并冲突?

我如何解决Git仓库中的合并冲突?

admin 更改状态以发布 2023年5月22日
0
0 Comments

下面是一个可能的使用场景,从头开始:

你要拉取一些更改,但哎呀,你没有更新到最新版本:

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.

大功告成!

0
0 Comments

尝试:

git mergetool

它将打开一个GUI界面,引导您处理每个冲突,并且您可以选择如何合并。有时需要稍微手工编辑之后,但通常它是足够的。这肯定比完全手动合并要好得多。


根据Josh Glover的评论

[此命令]
未必会打开GUI,除非您安装了一个。在我的计算机上运行git mergetool结果使用的是vimdiff。您可以安装以下工具之一以代替:meld、opendiff、kdiff3、tkdiff、xxdiff、tortoisemerge、gvimdiff、diffuse、ecmerge、p4merge、araxis、vimdiff、emerge。


以下是使用vimdiff解决合并冲突的示例过程,基于此链接

  1. 在您的终端中运行以下命令

    git config merge.tool vimdiff
    git config merge.conflictstyle diff3
    git config mergetool.prompt false
    

    这将把vimdiff设置为默认的合并工具。

  2. 在您的终端中运行以下命令

    git mergetool
    

  3. 以下是您将看到的vimdiff展示格式:

      ╔═══════╦══════╦════════╗
      ║       ║      ║        ║
      ║ LOCAL ║ BASE ║ REMOTE ║
      ║       ║      ║        ║
      ╠═══════╩══════╩════════╣
      ║                       ║
      ║        MERGED         ║
      ║                       ║
      ╚═══════════════════════╝
    

    这4个视图是

    • LOCAL:这是当前分支中的文件。
    • BASE:共同的祖先,这个文件在两次更改之前的状态。
    • REMOTE:您正在合并到您的分支中的文件。
    • MERGED:合并结果;这是将保存在合并提交中并在将来使用的内容。

    您可以使用ctrl+w在这些视图之间导航。您可以使用ctrl+w后跟j直接到达MERGED视图。

  4. 有关 vimdiff 导航的更多信息在这里:这里这里

  5. 您可以像这样编辑 MERGED 视图:

    • 如果您想从 REMOTE 获取更改

      :diffg RE
      

    • 如果您想从 BASE 获取更改

      :diffg BA
      

    • 如果您想从 LOCAL 获取更改

      :diffg LO
      

  6. 保存、退出、提交和清理

    :wqa 保存并退出 vi

    git commit -m "message"

    git clean 删除额外的文件(例如 *.orig)。警告:如果您不传递任何参数,它将删除所有未跟踪的文件。

0