52

我刚开始使用 Git。我想使用 TortoiseMerge 作为 difftool 和 mergetool。

在我的$HOME/.gitconfig我有以下部分。我已经删除了这个问题的用户和颜色部分。

[merge]
    tool = tortoisemerge
[mergetool "tortoisemerge"]
    cmd = \"TortoiseMerge.exe\" -base:\"$BASE\" -mine:\"$LOCAL\" -theirs:\"$REMOTE\" -merged:\"$MERGED\"
[diff]
    tool = tortoisemerge
[difftool "tortoisemerge"]
    cmd = \"TortoiseMerge.exe\" -base:\"$BASE\" -mine:\"$LOCAL\" -theirs:\"$REMOTE\" -merged:\"$MERGED\"

如果我在 Git Bash 提示符下键入 tortoisemerge,它会加载。众所周知,它在路上。但是,如果我键入命令,我会收到以下错误。

Rich:mygittest (master *)
$ git difftool
error: 'tortoisemerge' can only be used to resolve merges
merge tool candidates: kompare emerge vimdiff
No known merge resolution program available.
external diff died, stopping at readme.txt.
Rich:mygittest (master *)
$ 

我不明白什么使这项工作?Tortoisemerge 与 TortoiseSVN 一起安装。

4

7 回答 7

71

以下设置对我来说很好。但是,我使用的是 TortoiseGit 而不是 TortoiseSVN。注意 diff 参数的不同。

[diff]
  tool = tortoisediff
[difftool]
  prompt = false
[merge]
  tool = tortoisemerge
[mergetool]
  prompt = false
  keepBackup = false
[difftool "tortoisediff"]
  cmd = \""c:/Program Files/TortoiseGIT/bin/TortoiseGitMerge.exe"\" -mine "$REMOTE" -base "$LOCAL"
[mergetool "tortoisemerge"]
  cmd = \""c:/Program Files/TortoiseGIT/bin/TortoiseGitMerge.exe"\" -base "$BASE" -theirs "$REMOTE" -mine "$LOCAL" -merged "$MERGED"
于 2013-05-11T07:06:18.637 回答
7

为了正确处理带有空格的文件名,您应该将@melbourn 答案的最后一行更改为

cmd = \""c:/Program Files/TortoiseGIT/bin/TortoiseGitMerge.exe"\" -base "$BASE" -theirs "$REMOTE" -mine "$LOCAL" -merged "$MERGED"
于 2013-09-12T15:22:26.350 回答
1

这是一种更简单的方法,只需在 git bash 中运行这些命令:

git config --global merge.tool tortoisemerge
git config --global diff.tool tortoisediff
git config --global difftool.tortoisediff.cmd "TortoiseGitMerge \$LOCAL \$REMOTE"

完成。

----供进一步阅读----

您可能还需要其他设置:

# you may want to disable prompt or merge backup
git config --global mergetool.keepBackup false
git config --global difftool.prompt false
git config --global mergetool.prompt false

# set the path only when it's not found in system path
git config --global mergetool.tortoisemerge.path "C:\Program Files\TortoiseGit\bin\TortoiseGitMerge.exe" 
git config --global difftool.tortoisdiff.path "C:\Program Files\TortoiseGit\bin\TortoiseGitMerge.exe"

要设置合并工具,您只需要设置正确的合并工具名称。是官方支持的。

Windows 安装程序的 Git 包含一个 shell 文件,用于运行 tortoisegitmerge 作为合并工具。它位于C:\Program Files\Git\mingw64\libexec\git-core\mergetools. (Git 提供了 4 个用于合并的变量:$BASE $LOCAL $REMOTE $MERGED,您可以在 shell 文件中查看它们。)

您可以使用以下命令检查您的机器上支持的所有支持的合并/差异工具:

git difftool --tool-help
git mergetool --tool-help

运行 tortoisegitmerge 因为 git diff 工具是 git 官方不支持的,可能是因为这个工具不支持目录比较(git difftool -d)。因此,您需要配置 difftool cmd 以将其用作 git difftool。

tortoisegitmerge 工具的手册位于:
https
://tortoisegit.org/docs/tortoisegitmerge/tme-automation.html 您可以找到进行文件差异的最简单方法是:
TortoiseGitMerge BaseFilePath MyFilePath [ TheirFilePath ]

于 2021-11-17T02:18:26.417 回答
0

Klas Mellbourn 的回答很好!节省了我很多时间。一个缺点是,在 difftool 命令执行期间不会显示存储库中的新文件Added或文件。Removed没有什么可以和他们相比的!这是我在此之上所做的:(受我同事的回答启发)。

  1. 创建一个empty.empty$Home目录中命名的文件(start ~在你的 bash 中执行)。顾名思义,保持空白。
  2. 使用以下内容tortoisediff.sh在目录中创建另一个名为的文件$Home/bin

#!/bin/sh
# $LOCAL $REMOTE seem to be swapped
# $1 is $LOCAL
# $2 is $REMOTE

difftool='/c/Program Files/TortoiseGit/bin/TortoiseGitMerge.exe'
NULL="/dev/null"
empty="C:/home/empty.empty"

if [ "$1" == "$NULL" ]; then
    echo "Added: " "$2"
    "$difftool" /base:"$empty" /mine:"$2" /readonly:"$empty"
elif [ "$2" == "$NULL" ]; then
    echo 'Removed: ' "$1"
    "$difftool" /base:"$1" /readonly:"$1" /mine:"$empty"
else
    echo 'Modified' "$2"
    "$difftool" /base:"$1" /basename:"$1" /readonly:"$1" /mine:"$2" /minename:"$2"
fi

# Checkout https://tortoisegit.org/docs/tortoisegitmerge/tme-automation.html for more
  1. 修改您的 .gitconfig 文件(答案的第 11 行)

    cmd = tortoisediff.sh "$LOCAL" "$REMOTE"

现在这将使 difftool 引用 tortoisediff.sh 而不是直接打开应用程序。

  1. 请记住:您必须在git add .后面运行git difftool --staged而不是简单地运行git difftool.
于 2017-03-23T23:36:08.547 回答
0
[diff]
  tool = tortoisediff
[difftool]
  prompt = false
[merge]
  tool = tortoisemerge
[mergetool]
  prompt = false
  keepBackup = false
[difftool "tortoisediff"]
  cmd = \""C:/Users/$USER/Desktop/TortoiseMerge.exe"\" -base:\"$BASE\" -mine:\"$LOCAL\" -theirs:\"$REMOTE\" -merged:\"$MERGED\"
[mergetool "tortoisemerge"]
  cmd = \""C:/Users/$USER/Desktop/TortoiseMerge.exe"\" -base:\"$BASE\" -mine:\"$LOCAL\" -theirs:\"$REMOTE\" -merged:\"$MERGED\"

这对我有用,使用 TortoiseMerge 1.6.7(便携式)

于 2019-01-15T16:00:13.180 回答
0

在 Windows 中使用 TortoiseMerge 和现有的 TortoiseSVN 安装:

[guitool "VisualDiff"]
    cmd = git difftool -y \"$FILENAME\"
    needsfile = yes
    noconsole = yes
[diff]
    tool = tortoisediff
[difftool]
    prompt = false
[merge]
    tool = tortoisemerge
[mergetool]
    prompt = false
    keepBackup = false
[difftool "tortoisediff"]
    cmd = \""W:/Programs/TortoiseSVN/bin/TortoiseMerge.exe"\" "/mine:$REMOTE" "/base:$LOCAL"
[mergetool "tortoisemerge"]
    cmd = \""W:/Programs/TortoiseSVN/bin/TortoiseMerge.exe"\" "/base:$BASE" "/theirs:$REMOTE" "/mine:$LOCAL" "/merged:$MERGED"
于 2019-10-29T14:35:35.947 回答
0

在 rebase 时,我强烈推荐 switch$theirs$mine,因为它在合并和 rebase-merge 时是不同的。在这里检查:

git中“我们的”和“他们的”的确切含义是什么?

所以,如果你只像我一样使用 mergetool 来变基,请执行以下操作:

[mergetool "tortoisemerge"]
cmd = \""c:/Program Files/TortoiseGIT/bin/TortoiseGitMerge.exe"\" -base "$BASE" -theirs "$LOCAL" -mine "$REMOTE" -merged "$MERGED"
于 2019-02-26T11:09:54.407 回答