How do I view 'git diff' output with my preferred diff tool/ viewer?

后端 未结 26 1876
清酒与你
清酒与你 2020-11-22 03:20

When I type git diff, I want to view the output with my visual diff tool of choice (SourceGear \"diffmerge\" on Windows). How do I configure git to do this?

26条回答
  •  [愿得一人]
    2020-11-22 03:54

    To complete my previous "diff.external" config answer above:

    As mentioned by Jakub, Git1.6.3 introduced git difftool, originally proposed in September 2008:

    USAGE='[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
    (See --extcmd in the last part of this answer)

    $LOCAL contains the contents of the file from the starting revision and $REMOTE contains the contents of the file in the ending revision.
    $BASE contains the contents of the file in the wor

    It's basically git-mergetool modified to operate on the git index/worktree.

    The usual use case for this script is when you have either staged or unstaged changes and you'd like to see the changes in a side-by-side diff viewer (e.g. xxdiff, tkdiff, etc).

    git difftool [*]
    

    Another use case is when you'd like to see the same information but are comparing arbitrary commits (this is the part where the revarg parsing could be better)

    git difftool --start=HEAD^ --end=HEAD [-- *]
    

    The last use case is when you'd like to compare your current worktree to something other than HEAD (e.g. a tag)

    git difftool --commit=v1.0.0 [-- *]
    

    Note: since Git 2.5, git config diff.tool winmerge is enough!
    See "git mergetool winmerge"

    And since Git 1.7.11, you have the option --dir-diff, in order to to spawn external diff tools that can compare two directory hierarchies at a time after populating two temporary directories, instead of running an instance of the external tool once per a file pair.


    Before Git 2.5:

    Practical case for configuring difftool with your custom diff tool:

    C:\myGitRepo>git config --global diff.tool winmerge
    C:\myGitRepo>git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
    C:\myGitRepo>git config --global difftool.prompt false
    

    With winmerge.sh stored in a directory part of your PATH:

    #!/bin/sh
    echo Launching WinMergeU.exe: $1 $2
    "C:/Program Files/WinMerge/WinMergeU.exe" -u -e "$1" "$2" -dl "Local" -dr "Remote"
    

    If you have another tool (kdiff3, P4Diff, ...), create another shell script, and the appropriate difftool.myDiffTool.cmd config directive.
    Then you can easily switch tools with the diff.tool config.

    You have also this blog entry by Dave to add other details.
    (Or this question for the winmergeu options)

    The interest with this setting is the winmerge.shscript: you can customize it to take into account special cases.

    See for instance David Marble's answer below for an example which deals with:

    • new files in either origin or destination
    • removed files in either origin or destination

    As Kem Mason mentions in his answer, you can also avoid any wrapper by using the --extcmd option:

    --extcmd=
    

    Specify a custom command for viewing diffs. git-difftool ignores the configured defaults and runs $command $LOCAL $REMOTE when this option is specified.

    For instance, this is how gitk is able to run/use any diff tool.

提交回复
热议问题