Windows에서 Git : mergetool을 어떻게 설정합니까?


347

Cygwin에서 msysGit과 Git을 사용해 보았습니다. 둘 다 잘 작동하고 gitk와 git-gui를 완벽하게 실행합니다.

이제 어떻게 mergetool을 구성합니까? (Vimdiff는 Cygwin에서 작동하지만 Windows를 좋아하는 동료들에게는 좀 더 사용하기 쉬운 것이 좋습니다.)



4
Git Extensions에는 git UI가 있으며 Windows 사용자 친화적 인 병합 도구가 있습니다.
KallDrexx

TortoiseGit이 필요한 것 같습니까?
Sergei

답변:


305

Charles Bailey의 답변에 대한 후속 조치를 위해 p4merge (무료 크로스 플랫폼 3way 병합 도구)를 사용하는 git 설정이 있습니다 . msys Git (Windows) 설치에서 테스트되었습니다.

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'

또는 Windows cmd.exe 셸에서 두 번째 줄은 다음과 같습니다.

git config --global mergetool.p4merge.cmd "p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""

변경 사항 (Charles Bailey와 관련) :

  • 전역 자식 설정에 추가, 즉 현재 자식 프로젝트뿐만 아니라 모든 자식 프로젝트에 유효
  • 사용자 정의 도구 구성 값은 "merge. [tool] .cmd"가 아닌 "mergetool. [tool] .cmd"에 있습니다. 어리석은, git이 존재하지 않는 도구에 대해 계속 불평하는 이유를 한 시간 동안 보냈습니다.
  • 공백이있는 파일을 병합 도구로 여전히 찾을 수 있도록 모든 파일 이름에 큰 따옴표를 추가했습니다 (Powershell의 msys Git에서 이것을 테스트했습니다)
  • 기본적으로 Perforce는 설치 디렉토리를 PATH에 추가하므로 명령에서 p4merge의 전체 경로를 지정할 필요가 없습니다.

다운로드 : http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools


편집하다 (2014 년 2 월)

가리키는 OUT으로 @Gregory Pakosz , 최신 MSYS 힘내 "기본적으로"지원은 지금 p4merge (테스트 1.8.5.2.msysgit.0 ).

다음을 실행하여 지원되는 도구 목록을 표시 할 수 있습니다.

git mergetool --tool-help

p4merge 가 사용 가능 하거나 유효한 목록 에 표시되어야 합니다. 그렇지 않다면 자식을 업데이트하십시오.

경우 p4merge이 나열되었다 사용할 수 , 당신에 PATH 와 만 설정해야 merge.tool :

git config --global merge.tool p4merge

유효한 것으로 표시된 경우 merge.tool 외에도 mergetool.p4merge.path 를 정의해야합니다 .

git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
  • 위는 시스템 전체가 아닌 현재 사용자에 대해 p4merge를 설치할 때의 경로 예입니다 (관리자 권한이나 UAC 권한 상승이 필요하지 않음)
  • ~현재 사용자의 홈 디렉토리로 확장해야 하지만 이론적으로 경로는~/AppData/Local/Perforce/p4merge.exe ), 이것은 나를 위해 작동하지 않았습니다
  • 환경 변수 (예 $LOCALAPPDATA/Perforce/p4merge.exe:)를 활용하는 것이 더 낫습니다 .git은 경로에 대한 환경 변수를 확장하지 않는 것 같습니다 (이 작업을 수행하는 방법을 알고 있다면이 답변을 알려주거나 업데이트하십시오)

흠-이것을 시도해보십시오-첫 번째 구성은 정상적으로 작동하고 다음 구성은 git config에 대한 도움말 텍스트를 표시합니다. 이유가 확실하지 않습니다.
Danny Staple

1
그 작은 따옴표는 나에게 의심스러워 보입니다. 이것을 두 배로 늘리면 효과가 있습니다.
Danny Staple

13
mergetool.p4merge.cmdGit이 p4merge를 지원하기 시작했기 때문에 설정 이 더 이상 작동하지 않습니다 libexec/git-core/git-mergetool--lib. 대신 직접 사용합니다mergetool.p4merge.path
Gregory Pakosz

5
전체 경로를 입력하고 큰 따옴표를 cmd = \""c:/Program Files/TortoiseSVN/bin/TortoiseMerge.exe"\" -base:"$BASE" -theirs:"$REMOTE" -mine:"$LOCAL" -merged:"$MERGED"
피해야했습니다

21
이것은 나를 위해 그것을했다 : git config --global mergetool.p4merge.cmd '"C:\\Program Files\\Perforce\\p4merge" $BASE $LOCAL $REMOTE $MERGED'Windows 7 컴퓨터에서
Dan P.

88

Git이 p4merge를 지원하기 시작한 이후 mergetool.p4merge.cmd를 설정하면 더 이상 작동하지 않습니다.

git config --global mergetool.p4merge.path 'C:\Program Files\Perforce\p4merge.exe'
git config --global merge.tool p4merge

그런 다음 작동합니다.


1
Beyond Compare 3에서도 작동합니다. 대신 BComp.exe의 경로를 사용하십시오. 감사!
Richard Anthony Hein

4
나는 이것이 오래된 스레드라는 것을 알고 있지만 그 길을 갈 수는 없습니다. cmd / msys의 상호 작용이 주어지면 경로가 어떻게 탈출 해야하는지 약간 혼란 스럽습니다 ... 편집 큰 따옴표로 전환하면 문제가 해결되었습니다!
Rustavore

당신에게 Gitninja 감사합니다! 이것을 Git Bash에 입력 할 수 있지만 Prompt 명령을 사용하는 경우 작은 따옴표를 큰 따옴표로 변경해야합니다
Hải Phong

61

WinXP에서 Portable Git을 사용하고 있습니다 (치료 중입니다!). 분기에서 발생하는 충돌을 해결해야했습니다. 내가 확인한 모든 GUI 중 KDiff3 가 가장 투명하게 사용되었습니다.

그러나이 블로그 게시물 에서 Windows에서 작동시키는 데 필요한 지침을 찾았습니다.이 지침 은 여기에 나열된 다른 접근 방식과 약간 다릅니다. 기본적으로 다음 줄을 내 .gitconfig파일 에 추가했습니다 .

[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    path = C:/YourPathToBinaryHere/KDiff3/kdiff3.exe
    keepBackup = false
    trustExitCode = false

지금 잘 작동합니다!


13
내 Win7 PC에서, 나는 path = C:\\Program Files (x86)\\KDiff3\\kdiff3.exe(더블 백 슬래시에 주목)
누군가 어딘가에

"Diff 도구 meld는 'D : \ software \ melddiff \ Meld.exe'로 사용할 수 없습니다"와 같은 오류가 발생했습니다.
Allen Vork

각 섹션이 추가되는 순서에 차이가 있는지 알고 있습니다. 만약 [merge]가 [mergetool] 이후라면?
사무엘

20

Cygwin에서 나를 위해 일한 유일한 것은 다음과 같습니다.

git config --global merge.tool myp4merge
git config --global mergetool.myp4merge.cmd 'p4merge.exe "$(cygpath -wla $BASE)" "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)" "$(cygpath -wla $MERGED)"'
git config --global diff.tool myp4diff
git config --global difftool.myp4diff.cmd 'p4merge.exe "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)"'

또한 difftool에 대한 프롬프트 메시지를 끄고 싶습니다.

git config --global difftool.prompt false

16

git mergetool 완전히 구성 할 수 있으므로 원하는 도구를 거의 선택할 수 있습니다.

전체 설명서는 다음과 같습니다. http://www.kernel.org/pub/software/scm/git/docs/git-mergetool.html

간단히 말해, 사용자 설정 변수를 설정하여 기본 mergetool을 설정할 수 있습니다 merge.tool .

병합 도구가 기본적으로 지원되는 도구 중 하나 인 경우 도구 mergetool.<tool>.path의 전체 경로로 설정 하면됩니다 ( <tool>구성한 내용으로 대체).merge.tool .

그렇지 않으면, mergetool.<tool>.cmd쉘 변수 $BASE, $LOCAL, $REMOTE, $MERGED를 적절한 파일로 설정하여 런타임시 평가하도록 약간의 쉘로 설정할 수 있습니다. 설정 파일을 직접 편집하든 git config명령으로 변수를 설정하든 이스케이프 처리에는 약간주의해야합니다 .

이와 같은 것은 당신이 할 수있는 일의 풍미를 제공해야합니다 ( 'mymerge'는 가상의 도구입니다).

git config merge.tool mymerge
git config merge.mymerge.cmd 'mymerge.exe --base "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'

자주 사용하는 병합 도구를 설정 한 후에는 실행 문제 일뿐입니다. git mergetool 해결해야 할 충돌이있을 때마다 됩니다.

Perforce의 p4merge 도구는 상당히 좋은 독립형 병합 도구입니다.


8

Windows 7에서 비교할 수없는

git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"

2
이 명령을 사용했지만 Beyond Compare 대신 WinMerge를 사용하고 있습니다.
브렌트 켈러

6

최신 git 버전은 p4merge를 직접 지원하는 것으로 보입니다.

git config --global merge.tool p4merge

p4merge.exe가 경로에 있으면 필요한 모든 것입니다. cmd 또는 경로를 설정할 필요가 없습니다.


이것이 핵심입니다. p4merge를 설치하고 mergetool.p4merge.path를 정확한 위치로 설정 한 후에도 여전히 작동하지 않습니다. 경로에 설치 폴더를 추가하면 작동합니다.
RichardM

5

here ( herehere )에서 이미 대답했듯이 mergetool은 이것을 구성하는 명령입니다. 멋진 그래픽 프론트 엔드를 위해 kdiff3 (GPL)을 추천 합니다.


4

Windows 7에서 msysGit을 사용하여 추가 인용을 삭제해야했습니다. 왜 그런지 확실하지 않습니다.

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'

3

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

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge `cygpath -w $BASE` `cygpath -w $LOCAL` `cygpath -w $REMOTE` `cygpath -w $MERGED`'

3

Bah, 이것은 마침내 나를 위해 일했습니다 (Windows 7 + Cygwin + TortoiseMerge) :

.git / config에서 :

cmd = TortoiseMerge.exe /base:$(cygpath -d \"$BASE\") /theirs:$(cygpath -d \"$REMOTE\") /mine:$(cygpath -d \"$LOCAL\") /merged:$(cygpath -d \"$MERGED\")

cygpath를 사용하는 팁에 대한 이전 포스터 덕분에!


3

매뉴얼 ( http://manual.winmerge.org/CommandLine.html )의 WinMerge ( http://winmerge.org/ ) 정보 앱을 사용합니다

이것은 mergetool지시문 에서 사용하는 bash 스크립트입니다..gitconfig

#!/bin/sh
# using winmerge with git
# replaces unix style null files with a newly created empty windows temp file

file1=$1
if [ "$file1" == '/dev/null' ] || [ "$file1" == '\\.\nul' ] || [ ! -e "$file1" ]
    then 
       file1="/tmp/gitnull"
       `echo "">$file1`
fi
file2=$2
if [ "$file2" == '/dev/null' ] || [ "$file2" == '\\.\nul' ] || [ ! -e "$file2" ]
    then 
       file2="/tmp/gitnull"
       `echo "">$file2`
fi
echo diff : $1 -- $2
"C:\Program files (x86)\WinMerge\WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$file1" "$file2"

기본적으로 bash는 diff 결과가 빈 파일에있을 때를 고려하여 올바른 위치에 새 임시 파일을 만듭니다.


3

github Windows에서 " SourceGear DiffMerge "를 difftool 및 mergetool로 구성하는 두 가지 방법을 찾았습니다 .

명령 프롬프트 창의 다음 명령은 .gitconfig를 업데이트하여 GIT 사용 DiffMerge를 구성합니다.

git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  \"$LOCAL\" \"$REMOTE\"'

git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd  'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  -merge  -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"'

[ 또는 ]

.gitconfig에 다음 줄을 추가하십시오. 이 파일은 C : \ Users \ UserName의 홈 디렉토리에 있어야합니다.

[diff]
    tool = diffmerge
[difftool "diffmerge"]
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"

[merge]
    tool = diffmerge
[mergetool "diffmerge"]
    trustExitCode = true
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"

1

이 옵션들도 추가 할 수 있습니다 :

git config --global merge.tool p4mergetool
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
git config --global mergetool.p4mergetool.trustExitCode false
git config --global mergetool.keepBackup false

또한, 나는 왜 그런지 모르겠지만 Milan Gardian의 답변에서 인용과 슬래시가 문제를 일으켰습니다.


1

누군가 TortoiseGit에서 diff 도구로 gvim을 사용하려면 다음과 같이 외부 diff 도구 경로의 텍스트 입력에 입력해야합니다.

path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"

1

Windows 환경에서 IntelliJ IDEA (Community Edition) 3 방향 git mergetool 구성의 경우 ( ~/.gitconfig)

사이 그윈

[mergetool "ideamerge"]
     cmd = C:/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe merge `cygpath -wa $LOCAL` `cygpath -wa $REMOTE` `cygpath -wa $BASE` `cygpath -wa $MERGED`
[merge]
     tool = ideamerge

Msys

[mergetool "ideamerge"]
cmd = "/c/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe" merge `~/winpath.sh $LOCAL` `~/winpath.sh $REMOTE` `~/winpath.sh $BASE` `~/winpath.sh $MERGED`
[merge]
 tool = ideamerge

~ / winpath.sh는 경로를 msys에서 Windows로 변환하는 것이며 moverr 경로 변환 질문에서 가져옵니다.

#! /bin/sh                                                               

function wpath {                                                         
    if [ -z "$1" ]; then                                                 
        echo "$@"                                                        
    else                                                                 
        if [ -f "$1" ]; then                                             
            local dir=$(dirname "$1")                                    
            local fn=$(basename "$1")                                    
            echo "$(cd "$dir"; echo "$(pwd -W)/$fn")" | sed 's|/|\\|g';  
        else                                                             
            if [ -d "$1" ]; then                                         
                echo "$(cd "$1"; pwd -W)" | sed 's|/|\\|g';              
            else                                                         
                echo "$1" | sed 's|^/\(.\)/|\1:\\|g; s|/|\\|g';          
            fi                                                           
        fi                                                               
    fi                                                                   
}                                                                        

wpath "$@" 


0

SourceTree에서 p4merge를 여는 데 문제가있는 경우 MyRepo.git에서 config 라는 로컬 구성 파일을 찾아 병합 구성을 삭제하십시오. 내 경우에는 방금 제거한 Meld를 ​​열려고했습니다.

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