선호하는 diff 도구 / 뷰어로 'git diff'출력을 보려면 어떻게합니까?


754

를 입력하면 git diff선택한 시각적 차이 도구 (Windows의 SourceGear "diffmerge")를 사용하여 출력을보고 싶습니다. 이를 위해 git을 어떻게 구성합니까?


108
모든 최신 버전의 git에서 "git diff"대신 "git difftool"을 사용할 수 있습니다. 시각적 diff 프로그램이 열립니다.
PlagueHammer 2018 년

새 스크립트 difftool과 관련하여 아래 답변을 추가했습니다. stackoverflow.com/questions/255202/…
VonC 2016 년

2
gitx - gitx.frim.nl . 그런가 말했다.
Alex Grande

1
당신이 여기에서 찾을 것 튜토리얼 개요 : nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy
드미트리 Bespalov

5
Git Bash의 저장소로 이동하십시오. 을 입력하십시오 git config diff.tool winmerge. 을 입력하여 작동하는지 확인하십시오 git difftool. 프롬프트 입력을 제거하십시오 git config --global difftool.prompt false. winmerge 대신 p4merge를 권장합니다.
Michael S.

답변:


386

Git1.6.3부터 git difftool 스크립트를 사용할 수 있습니다 : 아래 내 답변을 참조하십시오 .


기사 가 도움 이 될 수 있습니다. 가장 좋은 부분은 다음과 같습니다.

외부 diff 도구를 지정하는 방법에는 두 가지가 있습니다.

첫 번째는 GIT_EXTERNAL_DIFF 변수를 설정하여 사용한 방법입니다. 그러나 변수는 실행 파일의 전체 경로를 가리켜 야합니다. 또한 GIT_EXTERNAL_DIFF에 의해 지정된 실행 파일은 고정 된 7 개의 인수 집합으로 호출됩니다.

path old-file old-hex old-mode new-file new-hex new-mode

대부분의 diff 도구에는 다른 순서의 인수가 필요하기 때문에 래퍼 스크립트를 지정해야 할 것입니다. 대신 래퍼 스크립트를 호출해야합니다.

두 번째 방법은 "git config"를 통해 외부 diff 도구를 구성하는 것 입니다. 여기 내가 한 일이 있습니다.

1) 래퍼 스크립트 "git-diff-wrapper.sh"를 작성하십시오.

-->8-(snip)--
#!/bin/sh

# diff is called by git with 7 parameters:
# path old-file old-hex old-mode new-file new-hex new-mode

"<path_to_diff_executable>" "$2" "$5" | cat
--8<-(snap)--

보다시피, 두 번째 ( "old-file") 및 다섯 번째 ( "new-file") 인수 만 diff 도구로 전달됩니다.

2) 종류

$ git config --global diff.external <path_to_wrapper_script>

명령 프롬프트에서 "git-diff-wrapper.sh"경로로 대체하여 ~ / .gitconfig에

-->8-(snip)--
[diff]
    external = <path_to_wrapper_script>
--8<-(snap)--

올바른 구문을 사용하여 랩퍼 스크립트 및 diff 도구의 경로를 지정하십시오 (예 : 백 슬래시 대신 슬래시 사용). 내 경우에는

[diff]
    external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\"

.gitconfig에서

"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat

랩퍼 스크립트에서. 후행 "고양이"를 마음!

( ' | cat'는 적절하거나 일관된 반환 상태를 반환하지 않을 수있는 일부 프로그램에만 필요하다고 가정합니다 . diff 도구에 명시적인 반환 상태가 있으면 후행 고양이없이 시도해 볼 수 있습니다)

( Diomidis Spinellis주석에 다음을 추가합니다 .

cat명령 때문에, 필요한 diff(1)파일이 다른 경우, 오류 코드와 기본 종료에 의해.
Git은 실제 오류가 발생한 경우 (예 : 메모리 부족) 외부 diff 프로그램이 오류 코드와 함께 종료 될 것으로 예상합니다.
배관의 출력으로 git하는 cat비 - 제로 오류 코드가 마스크된다.
더 효율적으로 프로그램은 exit인수 0으로 실행될 수 있습니다. )


위의 기사는 환경 변수가 아닌 구성 파일을 통해 정의 된 외부 도구에 대한 이론입니다 .
실제로 (여전히 외부 도구의 구성 파일 정의를 위해) 다음을 참조 할 수 있습니다.


1
아, 외부 diff 프로그램을 설정했지만 7 가지 논쟁에 대해서는 몰랐습니다. 감사합니다.
user3891

4
Kudos ... 이것은 매우 편리합니다. "opendiff"(Mac OS X에서 매끄러운 XCode FileMerge 유틸리티를 실행)로 설정했습니다.
Ryan Delucchi 2016 년

@Ryan : 대단하다 :)이 답변에 자세히 설명 된 "diff.external"설정 또는 아래 두 번째 답변의 "git difftool"을 사용 했습니까?
VonC 2016 년

환상적인! 감사합니다. DiffMerge와 opendiff를 모두 사용해보십시오. 둘 다 잘 작동합니다.
vfilby

2
그래서 git은 7 개의 인수를 diff 프로그램에 보냅니다. Git에 대해 더 많이 배울수록, 한 사람에게는 더 많이 느껴 졌다고 생각합니다. 원래 프로그래머. 이 dvcs는 많이하지 않는 반짝이는 장난감처럼 보입니다.
C Johnson

211

위의 이전 "diff.external"구성 답변 을 완료하려면

으로 야쿱 언급 , Git1.6.3 도입 자식 difftool , 원래 2008 년 9 월에 제안을 :

USAGE = '[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
( --extcmd이 답변의 마지막 부분 참조 )

$LOCAL시작 개정판 $REMOTE의 파일 내용을 포함하고 종료 개정판의 파일 내용을 포함합니다.
$BASEwor에 파일 내용이 들어 있습니다.

기본적으로 git-mergetoolgit index / worktree에서 작동하도록 수정되었습니다.

당신도 개최 또는 unstaged 변경하고 나란히은 diff 뷰어의 변화 (예를 들어보고 싶습니다 때이 스크립트에 대한 일반적인 사용 사례는 xxdiff, tkdiff, 등).

git difftool [<filename>*]

또 다른 유스 케이스는 동일한 정보를보고 싶지만 임의의 커밋을 비교하는 경우입니다 (이것은 리바 그 구문 분석이 더 좋을 수있는 부분입니다)

git difftool --start=HEAD^ --end=HEAD [-- <filename>*]

마지막 사용 사례는 현재 작업 트리를 HEAD 이외의 다른 태그 (예 : 태그)와 비교하려는 경우입니다.

git difftool --commit=v1.0.0 [-- <filename>*]

참고 : Git 2.5 이후로 git config diff.tool winmerge는 충분합니다!
" git mergetool winmerge "를 참조하십시오

그리고 힘내 1.7.11 이후 , 당신은 옵션이 --dir-diff두 가지의 임시 디렉토리를 채우는 대신 파일 쌍에 한 번 외부 도구의 인스턴스를 실행 한 후 한 번에 두 개의 디렉토리 계층 구조를 비교할 수있는 외부은 diff 도구를 생성하기 위해.


힘내 2.5 전에 :

difftool사용자 정의 diff 도구 로 구성 하는 실제 사례 :

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

PATH의 디렉토리 부분에 winmerge.sh가 저장되어있는 경우 :

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

다른 도구 (kdiff3, P4Diff, ...)가있는 경우 다른 쉘 스크립트와 적절한 difftool.myDiffTool.cmd구성 지시문을 작성하십시오.
그런 다음 diff.tool구성으로 도구를 쉽게 전환 할 수 있습니다 .

또한이 가지고 데이브에 의해 블로그 항목 기타 세부 사항을 추가 할 수 있습니다.
(또는 옵션에 대한 이 질문winmergeu )

이 설정의 관심은 winmerge.sh스크립트입니다 . 특수한 경우를 고려 하여 스크립트 를 사용자 정의 할 수 있습니다.

예를 들어 아래David Marble 답변을 참조하십시오 .

  • 출발지 또는 목적지에있는 파일
  • 출발지 또는 목적지에서 파일을 제거했습니다.

Kem Mason그의 답변 에서 언급 했듯이 다음 --extcmd옵션 을 사용하여 래퍼를 피할 수도 있습니다 .

--extcmd=<command>

diff를보기위한 사용자 정의 명령을 지정하십시오. git-difftool구성된 기본값을 무시 $command $LOCAL $REMOTE하고이 옵션을 지정하면 실행 됩니다.

예를 들어, 도구 gitk를 실행 / 사용하는 diff방법 입니다.


11
$ LOCAL과 $ REMOTE에 대해 $를 이스케이프하여 ""와 ""가되지 않도록해야했습니다. git config --globla difftool.winmerge.cmd "winmerge.sh \"\ $ LOCAL \ "\"\ $ REMOTE \ ""
Carlos Rendon

또한이 구성표에서 작동하도록 -s 옵션 (하나의 winmerge 창에서 여러 diff 열기)을 얻는 방법에 대한 아이디어가 있습니까?
Carlos Rendon

1
@Carlos : Frank (위의 설명 참조)는 stackoverflow.com/questions/1220309/… (한 winmerge 창에서 여러 diff 열기에 대한 )를 보길 원했습니다
VonC

1
--start=--end=옵션은 v1.7.11에서 인식되지 않습니다
마이클

1
@SteveChambers 예, stackoverflow.com/a/10879804/6309 에서 언급했습니다 . 이 답변을 편집하겠습니다.
VonC

110

질문과 다소 다른 질문에 대답하는 정신. 이 솔루션을 사용해보십시오 :

$ meld my_project_using_git

Meld는 git을 이해하고 최근 변경 사항을 탐색합니다.


17
즉 입력 훨씬 쉽게, 위대한 meld .보다 git difftool순차적으로 변경된 파일을 볼 수 있습니다. 그리고 그것은 Mercurial의 hg vdiff플러그인에 훨씬 가깝습니다 .
Tom

6
또한 meld .누군가 궁금한 경우를 대비하여 Mercurial 및 Subversion 프로젝트에서도 작동합니다.
Tom

흠, 내가 이것을 할 때 수정 된 파일 목록이 표시됩니다. 그중 하나를 클릭하거나 '비교'를 수행하면 별도의 탭에서 혼자 열립니다. diff는 어떻게 받습니까?
misiu_mp

@misiu_mp, 방금 수정 한 파일을 클릭하면 diff (이전 파일 및 수정 된 파일)가 표시됩니다.
db42

어떤 버전으로 추가 되었습니까? meld version에서 작동하지 않는 것 같습니다 1.1.5.
Mark Booth

41

새로운 git difftool을 사용하면 .gitconfig 파일에 이것을 추가하는 것만 큼 간단 합니다.

[diff]
    tool = any-name
[difftool "any-name"]
    cmd = "\"C:/path/to/my/ext/diff.exe\" \"$LOCAL\" \"$REMOTE\""

선택적으로 다음을 추가하십시오.

[difftool]
    prompt = false

또한 확산을 확인하십시오 스크립트는 각각 직렬로 여는 성가신 (IMO) 기본 diff 동작을 확장하기 위해 작성했습니다.

Windows의 전역 .gitconfig가 %USERPROFILE%\.gitconfig


1
$ local은 무엇이며 $ remote는 무엇입니까?
C Johnson

3
랩퍼 스크립트가 필요없는 메소드의 경우 +1
jhewlett

@CJohnson : 원본 파일의 경로와 편집 된 파일의 경로.
jhewlett

블로그 링크 다이 경우, 여기 링크 된 SO의 대답입니다 : stackoverflow.com/a/1291578/321973
토비아스 Kienzler

1
@CJohnson : $ LOCAL은 항상 최신 커밋입니다. 그러나 $ REMOTE는 일관성이 없습니다. 로컬 샌드 박스의 변경 사항을 볼 때 현재 / 편집 된 파일이지만 기록 커밋을 비교할 때 상위 커밋입니다. 일반 diffs에 대한 IOW $ LOCAL = old 및 $ REMOTE = new. 역사적으로 $ LOCAL = newer 및 $ REMOTE = old입니다.
Granger

40

git 버전 1.6.3부터 " git difftool "이 있는데,이 그래픽 도구는 선호하는 그래픽 diff 도구를 사용하도록 구성 할 수 있습니다. 현재 지원되는 기본적으로 kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, spreadopendiff ; 사용하려는 도구가이 목록에없는 경우 언제든지 ' difftool.<tool>.cmd'구성 옵션을 사용할 수 있습니다 .

"git difftool"은 "git diff"와 동일한 옵션을 허용합니다.


1
축 병합도 구성됩니다. araxis.com/merge/scm_integration.html
ΩmegaMan

8
사용법 예 :git difftool -t kdiff3 HEAD
emanaton 21

24

나는 이것에 하나의 추가가 있습니다. 기본 도구 (예 : 만화경) 중 하나로 지원되지 않는 diff 앱을 정기적으로 사용하고 싶습니다.

git difftool -t

또한 기본값을 diff일반 명령 줄로 사용 하고 싶습니다 . 따라서 GIT_EXTERNAL_DIFF변수 설정은 옵션이 아닙니다.

diff이 명령으로 임의의 앱을 일회용으로 사용할 수 있습니다 .

git difftool --extcmd=/usr/bin/ksdiff

2 개의 파일을 지정한 명령으로 전달하기 때문에 래퍼가 필요하지 않을 수도 있습니다.


1
좋은 지적 : 아직 그 --extcmd옵션 을 언급 한 사람은 없습니다 . +1. 나는 그것을 내 대답에 포함시켰다.
VonC

19

파일 제거 및 추가를 처리하기위한 VonC의 답변을 바탕으로 다음 명령 및 스크립트를 사용하십시오.

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

이것은 당신의 세계에 이것을 넣는 것과 .gitconfig같습니다 :

[diff]
    tool = winmerge
[difftool "winmerge"]
    cmd = winmerge.bat "$LOCAL" "$REMOTE" "$BASE"
[difftool]
    prompt = false

그런 다음 winmerge.sh경로에 있어야 하는 다음을 입력하십시오 .

#!/bin/sh
NULL="/dev/null"
if [ "$2" = "$NULL" ] ; then
    echo "removed: $3"
elif [ "$1" = "$NULL" ] ; then
    echo "added: $3"
else
    echo "changed: $3"
    "C:/Program Files (x86)/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$1" "$2"
fi

winmerge.sh스크립트에 추가되었습니다 . +1. 귀하의 답변 에 연결하기 위해 답변 을 업데이트했습니다 .
VonC

1
winmerge.bat두 번째 스 니펫은winmerge.sh
BartoszKP

많은 도구를 위해 이것을 만들 수 있습니까? 파일 확장자로 연결합니까?
yucer

12

Windows / msys git 솔루션

답을 읽은 후 하나의 파일 만 변경하는 간단한 방법을 발견했습니다.

  1. 인수 2와 5를 사용하여 diff 프로그램을 호출 할 배치 파일을 작성하십시오.이 파일은 경로의 어딘가에 있어야합니다. (어딘지 모른다면 c : \ windows에 넣으십시오). "gitdiff.bat"와 같이 호출하십시오. 광산은 :

    @echo off
    REM This is gitdiff.bat
    "C:\Program Files\WinMerge\WinMergeU.exe" %2 %5
    
  2. 배치 파일을 가리 키도록 환경 변수를 설정하십시오. 예를 들면 다음과 같습니다 GIT_EXTERNAL_DIFF=gitdiff.bat.. 또는을 입력하여 powershell을 통해 git config --global diff.external gitdiff.bat.

    따옴표를 사용하지 않거나 경로 정보를 지정하지 않으면 작동하지 않습니다. 그래서 gitdiff.bat가 경로에 있어야합니다.

이제 "git diff"를 입력하면 외부 diff 뷰어가 호출됩니다.


1
+1 (가능한 경우 +10) 이것은 가장 간단한 해결책입니다. 나는 받아 들인 대답으로 몇 시간 동안 고생하고 마침내 포기했다. (내 문제 중 일부는 아마도 PowerShell을 통해 Git을 실행하는 것과 관련이 있습니다 ...) 그러나 환경 변수 git config --global diff.external winmerge.cmd를 설정하는 대신을 사용했으며 GIT_EXTERNAL_DIFF똑같이 잘 작동했습니다.
Christoffer Lette

이 솔루션의 몇 가지 문제 : 1. 새 파일에서는 작동하지 않습니다. WinMerge는 비교할 두 번째 파일을 입력하라는 메시지를 표시합니다. 2. 다음 파일을 비교할 창은 현재 WinMerge 창을 닫은 후에 만 ​​열리므로 모든 파일을 동시에 볼 수있는 쉬운 방법은 없습니다.
예수 H

9

cygwin을 통해이 작업을 수행하는 경우 cygpath 를 사용해야 할 수 있습니다 .

$ git config difftool.bc3.cmd "git-diff-bcomp-wrapper.sh \$LOCAL \$REMOTE"
$ cat git-diff-bcomp-wrapper.sh
#!/bin/sh
"c:/Program Files (x86)/Beyond Compare 3/BComp.exe" `cygpath -w $1` `cygpath -w $2`

어떤 이유로 "bc3"을 사용하면 더 이상 작동하지 않지만 대신 "beyond"를 사용하면 문제가 없습니다.
idbrii 2016 년

9

다른 외부 diff 도구를 살펴본 후 diffIntelliJ IDEA (및 Android Studio)의보기가 가장 좋습니다.

1 단계-명령 줄에서 IntelliJ IDEA를 실행하도록 설정

IntelliJ IDEA를 diff 도구로 사용하려면 먼저 다음 지침에 따라 명령 줄에서 IntelliJ IDEA를 실행하도록 설정해야 합니다 .

macOS 또는 UNIX에서 :

  1. IntelliJ IDEA가 실행 중인지 확인하십시오.
  2. 주 메뉴에서을 선택하십시오 Tools | Create Command-line Launcher. 런처 스크립트의 제안 된 경로 및 이름과 함께 런처 스크립트 작성 대화 상자가 열립니다. 기본값을 그대로 사용하거나 고유 한 경로를 지정할 수 있습니다. 나중에 필요할 것이므로주의하십시오. IntelliJ IDEA 외부에서 런처 스크립트의 경로와 이름을 경로에 추가하십시오.

Windows에서 :

  1. 경로 시스템 환경 변수에서 IntelliJ IDEA 실행 파일의 위치를 ​​지정하십시오. 이 경우 모든 디렉토리에서 IntelliJ IDEA 실행 파일 및 기타 IntelliJ IDEA 명령을 호출 할 수 있습니다.

2 단계-IntelliJ IDEA를 difftool로 사용하도록 git 구성

이 블로그 게시물 의 지침에 따라 .

세게 때리다

export INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
PATH=$IDEA_HOME $PATH

물고기

set INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
set PATH $INTELLIJ_HOME $PATH

이제 git 구성에 다음을 추가하십시오.

[merge]
   tool = intellij
[mergetool "intellij"]
   cmd = idea merge $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE") $(cd $(dirname "$BASE") && pwd)/$(basename "$BASE") $(cd $(dirname "$MERGED") && pwd)/$(basename "$MERGED")
   trustExitCode = true
[diff]
   tool = intellij
[difftool "intellij"]
   cmd = idea diff $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE")

당신은 그것을 시도 할 수 git difftool또는git difftool HEAD~1


8

이것은 Windows 7에서 작동합니다. 중개자 스크립트가 필요하지 않습니다.

.gitconfig의 내용 :

    [diff]
      tool = kdiff3

    [difftool]
       prompt = false

    [difftool "kdiff3"]
      path = C:/Program Files (x86)/KDiff3/kdiff3.exe
      cmd = "$LOCAL" "$REMOTE"

kdiff3도 mergetool로 정의 했습니까? 그렇다면 gitconfig의 해당 부분을 공유하고 있습니까?
blong

2
감사. 내가 제거 할 때 매우 나를 위해 작동하지 않았다하지만 작업을했다 path및 변경 cmd"\"C:/Program Files (x86)/KDiff3/kdiff3.exe\" \"$LOCAL\" \"$REMOTE\""
스티브 챔버

7

위의 위대한 답변에 대한 간략한 요약 :

git difftool --tool-help
git config --global diff.tool <chosen tool>
git config --global --add difftool.prompt false

그런 다음 다음을 입력하여 사용하십시오 (선택적으로 파일 이름도 지정).

git difftool

6

소개

참고로 VonC의 답변에 대한 변형을 포함하고 싶습니다. PATH가 수정 된 MSys 버전의 Git (현재 1.6.0.2)을 사용하고 Bash 셸이 아닌 Powershell (또는 cmd.exe)에서 Git 자체를 실행하고 있음을 명심하십시오.

새로운 명령을 도입했습니다 gitdiff. 이 명령을 실행하면 git diff영구적으로 선택한 VonC 솔루션과 달리 선택한 시각적 차이 프로그램을 사용하도록 일시적으로 리디렉션 됩니다. 이를 통해 기본 Git diff 기능 ( git diff)과 시각적 diff 기능 ( gitdiff)을 모두 사용할 수 있습니다. 두 명령 모두 동일한 매개 변수를 사용하므로 예를 들어 입력 할 수있는 특정 파일의 변경 내용을 시각적으로 구별 할 수 있습니다

gitdiff path/file.txt

설정

참고 $GitInstall힘내가 설치되어있는 디렉토리에 대한 자리 표시로 사용됩니다.

  1. 새 파일을 만들고 $GitInstall\cmd\gitdiff.cmd

    @echo off
    setlocal
    for /F "delims=" %%I in ("%~dp0..") do @set path=%%~fI\bin;%%~fI\mingw\bin;%PATH%
    if "%HOME%"=="" @set HOME=%USERPROFILE%
    set GIT_EXTERNAL_DIFF=git-diff-visual.cmd
    set GIT_PAGER=cat
    git diff %*
    endlocal
    
  2. 새 파일을 만듭니다 $GitInstall\bin\git-diff-visual.cmd( [visual_diff_exe]원하는 diff 프로그램의 전체 경로가있는 자리 표시 자 대체 )

    @echo off
    rem diff is called by git with 7 parameters:
    rem path old-file old-hex old-mode new-file new-hex new-mode
    echo Diffing "%5"
    "[visual_diff_exe]" "%2" "%5"
    exit 0
    
  3. 이제 끝났습니다. gitdiffGit 저장소 내에서 실행 하면 변경된 모든 파일에 대해 시각적 차이 프로그램을 호출해야합니다.


6

다음은 Windows에서 작동하는 배치 파일입니다. DiffMerge가 기본 위치에 설치되어 있고 x64를 처리하고 필요에 따라 백 슬래시 교체를 처리하며 자체 설치 기능이 있다고 가정합니다. DiffMerge를 선호하는 diff 프로그램으로 쉽게 교체 할 수 있어야합니다.

설치하기 위해서:

gitvdiff --install 

gitvdiff.bat :

@echo off

REM ---- Install? ----
REM To install, run gitvdiff --install

if %1==--install goto install



REM ---- Find DiffMerge ----

if DEFINED ProgramFiles^(x86^) (
    Set DIFF="%ProgramFiles(x86)%\SourceGear\DiffMerge\DiffMerge.exe"
) else (
    Set DIFF="%ProgramFiles%\SourceGear\DiffMerge\DiffMerge.exe"
)



REM ---- Switch forward slashes to back slashes ----

set oldW=%2
set oldW=%oldW:/=\%
set newW=%5
set newW=%newW:/=\%


REM ---- Launch DiffMerge ----

%DIFF% /title1="Old Version" %oldW% /title2="New Version" %newW%

goto :EOF



REM ---- Install ----
:install
set selfL=%~dpnx0
set selfL=%selfL:\=/%
@echo on
git config --global diff.external %selfL%
@echo off


:EOF

훌륭한 스크립트로 DiffMerge 명령을 찾는 데 어려움을 겪지 않았습니다. 따옴표를 사용하도록 설치 줄을 수정하고 싶을 수 있습니다. "% 1"== "-install"컴퓨터에서 문제가 발생했습니다.
Mario

6

Mac에 있고 XCode가 있다면 FileMerge가 설치되어있는 것입니다. 터미널 명령은 opendiff이므로 수행 할 수 있습니다git difftool -t opendiff


2
성가신 프롬프트를 피하려면 -y 옵션을 사용하십시오. 불행히도 git은 FileMerge가 종료 될 때까지 기다렸다가 다음에 변경된 파일을 제공합니다. 한 번에 디렉토리를 비교하려면 -d 옵션을 사용하십시오.
광부 49r

-t 옵션은 완전한 경로를 요구하는 것 같습니다. 아마도 git difftool --extcmd = opendiff를 사용하는 것이 좋습니다.
yucer

6

meld 설치

 # apt-get install meld

그런 다음 difftool로 선택하십시오.

 $ git config --global diff.tool meld

콘솔 유형으로 실행하려면 다음을 수행하십시오.

 $ git difftool

그래픽 모드 유형을 사용하려는 경우 :

 $ git mergetool

결과는 다음과 같습니다.

 'git mergetool' will now attempt to use one of the following tools:
 meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse
 diffmerge ecmerge p4merge araxis bc3 codecompare emerge vimdiff
 Merging:
 www/css/style.css
 www/js/controllers.js

 Normal merge conflict for 'www/css/style.css':
   {local}: modified file
   {remote}: modified file
 Hit return to start merge resolution tool (meld):

따라서 Enter 키를 눌러 meld (기본값)를 사용하면 그래픽 모드가 열리고 마술을 저장하고 병합을 해결하는 키를 누릅니다. 그게 다야


5

이전 1.6.3에 자식 버전에 사랑하는 도구를 구성하는 방법의 리눅스 버전 (1.6.3가 자식에 difftool 추가)를 들어 좋은 간결 튜토리얼입니다,

간단히 :

1 단계 : .gitconfig에 추가

[diff]
  external = git_diff_wrapper
[pager]
  diff =

2 단계 : git_diff_wrapper라는 파일을 만들어 $ PATH에 넣습니다.

#!/bin/sh

vimdiff "$2" "$5"

4

Mac OS X에서

git difftool -t diffuse 

git 폴더에서 나를 위해 일합니다. 확산 설치를 위해 포트를 사용할 수 있습니다-

sudo port install diffuse

3

사용할 수 있습니다 git difftool.

예를 들어 meld 가있는 경우 분기를 다음 master과 같이 편집 할 수 있습니다 devel.

git config --global diff.external meld
git difftool master..devel

3

다음은 다른 답변에서 얻을 수 있지만 여기에는 어려운 정보가 너무 많으므로 tkdiff에 대한 '그냥 입력하십시오'라는 답변이 있습니다.

git difftool --tool=tkdiff <path to the file to be diffed>

tkdiff에 대해 선호하는 diffing 도구의 실행 파일 이름을 대체 할 수 있습니다. PATH (예 : tkdiff) 또는 선호하는 디핑 도구가 PATH에 있으면 실행됩니다.


가장 간단하고 빠른 방법입니다.
Zameer Fouzan

2

나는 tkdiff와 함께 멋진 것을 시도했지만 아무것도 효과가 없었다. 그래서 tkgitdiff라는 스크립트를 작성했습니다. 내가해야 할 일을합니다.

$ cat tkgitdiff
#!/bin/sh

#
# tkdiff for git.
# Gives you the diff between HEAD and the current state of your file.
#

newfile=$1
git diff HEAD -- $newfile > /tmp/patch.dat
cp $newfile /tmp
savedPWD=$PWD
cd /tmp
patch -R $newfile < patch.dat
cd $savedPWD
tkdiff /tmp/$newfile $newfile

1

우분투에서 kompare를 사용합니다.

sudo apt-get install kompare

두 가지를 비교하려면

git difftool -t kompare <my_branch> master

1

나는이 비트를 ~/.gitconfig오랫동안 사용 해왔다.

[diff]
    external = ~/Dropbox/source/bash/git-meld

git-meld:

#!/bin/bash
if [ "$DISPLAY" = "" ];
then
    diff $2 $5
else
    meld $2 $5
fi

그러나 이제는 그래픽 환경에서 항상 meld를 사용하는 것에 지쳤습니다.이 설정으로 일반적인 diff를 호출하는 것은 쉽지 않습니다.

[alias]
    v =  "!sh -c 'if [ $# -eq 0 ] ; then git difftool -y -t meld ; else git difftool -y $@ ; fi' -"

이 설정을 사용하면 다음과 같은 작업이 수행됩니다.

git v
git v --staged
git v -t kompare
git v --staged -t tkdiff

그리고 나는 여전히 좋은 것을 유지합니다 git diff.


0

파일 유형과 관련된 diff 도구가 이미있는 경우 (예 : diff 뷰어와 함께 제공되는 TortoiseSVN을 설치했기 때문에) 일반 git diff출력을 "temp"파일로 파이프 한 다음 알 필요없이 해당 파일을 직접 열면됩니다. 시청자에 대한 모든 것 :

git diff > "~/temp.diff" && start "~/temp.diff"

전역 별칭으로 설정하면 훨씬 더 효과적입니다. git what

[alias]
    what = "!f() { git diff > "~/temp.diff" && start "~/temp.diff"; }; f"

0

커맨드 라인이 아닌 경우 거북이 git을 설치하면 파일을 마우스 오른쪽 버튼으로 클릭하여 "나중에 차분"옵션이있는 거북이 하위 메뉴를 얻을 수 있습니다.

첫 번째 파일에서 이것을 선택하면 두 번째 파일을 마우스 오른쪽 버튼으로 클릭하고 tortoisegit 하위 메뉴로 이동하여 "Diff with == yourfilehere =="를 선택하면 결과에 대한 tortoisegitmerge gui가 제공됩니다.


0

GIT / SVN diff의 GUI 래퍼 인 xd http://github.com/jiqingtang/xd 를 사용해보십시오 . diff 도구 자체는 아닙니다. 달리고 xd싶을 때 git diff또는svn diff , 이맥스 (는 Ediff)와 그것은 당신에게 파일의 목록, 미리보기 창을 보여줍니다 당신이 tkdiff, xxdiff, gvimdiff, 이맥스 (는 Ediff)를 포함하여 당신이 원하는은 diff 도구를 실행할 수 있습니다, MELD, 확산, kompare 및 kdiff3. 모든 사용자 정의 도구를 실행할 수도 있습니다.

불행히도이 도구는 Windows를 지원하지 않습니다.

공개 : 저는이 도구의 저자입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.