如何将Visual Studio Code设置为Git MergeTool的默认编辑器,包括3路合并?

184
今天我试图在Windows命令提示符中使用git mergetool,发现它默认使用Vim,这很酷,但我更喜欢VS Code 。

如何将Visual Studio Code 设置为我的GUI以处理Git合并冲突(甚至作为差异工具)?

是否可以设置VS Code 以获取三方合并的可视化效果?

5个回答

356
更新: 截至 Visual Studio Code 1.70,已添加带有改进的三方合并功能。如果您感兴趣,可以查看视觉效果和更多解释

Visual Studio Code 1.13 开始,Better Merge 被整合到了 Visual Studio Code 的核心中。

将它们连接起来的方法是修改您的 .gitconfig,您有两个选项

  1. 通过命令行输入进行操作,输入以下每个命令:(注意:在 Windows 命令提示符下,请将 ' 替换为 "。感谢 Iztok Delfin 和 e4rache 帮助澄清此问题。)

    1. git config --global merge.tool vscode
    2. git config --global mergetool.vscode.cmd 'code --wait --merge $REMOTE $LOCAL $BASE $MERGED'
    3. git config --global diff.tool vscode
    4. git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'
  2. 通过在.gitconfig中粘贴一些命令来执行,可以使用Visual Studio Code进行操作。

    • 从命令行运行 git config --global core.editor 'code --wait'

    • 从这里您可以输入命令 git config --global -e。您将需要在下面的“额外块”中粘贴代码。

  [user]
      name = EricDJohnson
      email = cool-email@neat.org
  [gui]
      recentrepo = E:/src/gitlab/App-Custom/Some-App
  # Comment: You just added this via 'git config --global core.editor "code --wait"'
  [core]
      editor = code --wait
  # Comment: Start of "Extra Block"
  # Comment: This is to unlock Visual Studio Code as your Git diff and Git merge tool
  [merge]
      tool = vscode
  [mergetool "vscode"]
  # Comment: Original way before three-way merge shown commented out
  #    cmd = code --wait $MERGED
  # Comment: For "Three-way merge"
      cmd = code --wait --merge $REMOTE $LOCAL $BASE $MERGED
  [diff]
      tool = vscode
  [difftool "vscode"]
      cmd = code --wait --diff $LOCAL $REMOTE
  # Comment: End of "Extra Block"

现在,在冲突的Git目录中运行git mergetool,然后你会发现Visual Studio Code帮助你处理合并冲突!(只需确保在关闭Visual Studio Code之前保存文件。)

接受传入的更改?

有关从命令行启动code的更多信息,请查看此文档

有关git mergetool的更多信息,请查看此文档


1
这个Better Merge的集成是否允许您接受并选择要合并的部分?还是您仍然需要手动删除冲突的额外注释,例如<<<< HEAD>>>> develop - ghiscoding
3
在“<<<< Head”上方有一条线,它会插入一个选项列表:“接受当前更改 | 接受传入更改 | 接受两个更改 | 比较更改”,我认为它会在文件中检测到更改的每个部分都插入这个选项列表。但是在某个部分内,如果你想手动自定义合并一些内容,我认为你应该在本地进行更改,然后选择“接受当前更改”选项。因此,工作流程有点需要先后退一步才能向前迈进。如果其他人以不同的方式解决了这个问题,请在此处发布以便我们学习。 - Eric D. Johnson
1
哦,我现在在你的屏幕截图中看到了,非常整洁。非常感谢你的解释和操作指南。下次遇到时间冲突时,我会很高兴地使用它 :) - ghiscoding
5
我收到了错误信息:unknown tool: vscode... 我相当确定如果要从命令行调用 VsCode,你需要使用 code 而不是 vscode。请问需要我做什么翻译? - Kellen Stuart
28
这对我没有用,它只是弹出了VsCode,但从未打开任何文件。 - Kellen Stuart
显示剩余23条评论

34

我必须将双引号替换为单引号:

  git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'

为了使其正常工作(用双引号,$LOCAL和$REMOTE将被替换为它们的值)。

如果您使用Git Bash for Windows而不是Windows命令提示符,则需要这样做。


1
不是我做的。我只是在Windows上使用命令提示符完成了这个任务。也许你使用的是其他工具?如果是这样,我建议你说明你使用的环境,这样其他使用相同环境的人就会知道他们需要进行哪些更改。 - Todesengel
1
@e4rache和@Iztok-Delfin,你们列出的内容很有帮助,但不小心将其作为答案发布了,实际上应该是评论。我相信你们因为在SO上没有50个积分来发表评论而遇到了麻烦,这可能是一个站点工作流问题,也许应该加以解决。无论如何,感谢你们的贡献,我已经将你们的提示添加到我的答案中。感谢你们帮助那些后来使用Git Bash的人 :^) - Eric D. Johnson
@eric-d-johnson 我本来想发表评论而不是回复。(抱歉,我是这个网站的新手)顺便说一下,我正在使用 Linux 上的 bash。有没有办法将这个回复转换为评论? - e4rache
@e4rache 我不知道如何将其变成评论,但也许管理员会看到这个并给我们一些提示(暗示,暗示)。如果你有50分,你可以在被接受的答案上发表评论,并删除这个问题,所以一旦你成为一个拥有大量积分的SO明星,你可以回到这里做任何使你感到满意和带回美好回忆的清理工作。 - Eric D. Johnson
原始解决方案在Mac OS上无法完全工作,但这个可以正常工作。 - Mohamed Ghonemi
1
@mohamedghonemi 很好的反馈。我现在已经更新了顶部的说明,提醒macOS和Linux使用单引号(')。 - Eric D. Johnson

25

除了现有的优秀答案之外,您还应该通过在命令行中添加-n来在新窗口中打开VS Code。

因此,您的git config --global --edit看起来像这样。

[merge]
        tool = vscode
[mergetool "vscode"]
        cmd = code --new-window --wait $MERGED
[diff]
        tool = vscode
[difftool "vscode"]
        cmd = code --new-window --wait --diff $LOCAL $REMOTE                                                    

我使用了这些设置,但是当我执行 git diff commit_id1 commit_id2 命令时,它不会弹出 VS code 编辑器窗口。它仍然默认为终端。我使用的命令错了吗? - user5965026
@user5965026 你试过使用 git difftool 而不是 git diff 吗? - mvd
1
注意:如果您使用VSCode 1.7+并且想要三方合并UI,请使用cmd = code --wait --merge $REMOTE $LOCAL $BASE $MERGED - Rafs

11

使用说明书,您可以找到一个有趣的论点:

git difftool --help 
-x <command>, --extcmd=<command>
       Specify a custom command for viewing diffs.  git-difftool ignores the configured defaults and runs $command $LOCAL $REMOTE when this option is specified.
       Additionally, $BASE is set in the environment.

通过这些信息,你可以在不触碰git配置的情况下轻松使用以下命令:

git difftool -x "code --wait --diff" 

这里有一个类似的问题,参见此处


4
如果有人想在Visual Studio中解决此问题,另一个选择是通过Visual Studio完成:Team Explorer -> 点击主页图标 => 设置按钮 => 展开Git部分 => 点击全局设置。

enter image description here enter image description here enter image description here


7
Visual Studio和Visual Studio Code不是等价的。这些设置的方式是相当不同的。请参见 https://dev59.com/y10a5IYBdhLWcg3wRWyV#33798601 了解它们之间的区别。 - jwd630
3
@jwd630 我知道 VS Code 和 VS 是不同的。我曾经在 VS 中遇到过这个问题,但是找不到解决方法,所以我觉得最好把它发出来,以防其他人也遇到了这个问题。没有必要贬低它。 - Daniel B
4
这是针对不同产品的完全不同问题的回答。 - Jörg W Mittag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接