git difftool 및 mergetool로 Meld 설정 및 사용


255

이 질문과 답변의 많은 정보가 StackOverflow 에서 제공되지만 많은 페이지와 기타 답변 사이에 잘못되었거나 오해의 소지가 있습니다. 내가 알고 싶은 모든 것을한데 모으는 데 시간이 걸렸습니다.

git difftool 및 mergetool로 사용할 수있는 다양한 프로그램이 있으며, 어느 것이 가장 좋은지에 대한 합의가 없습니다 (의견, 요구 사항 및 OS가 분명히 다름).

Meld는 StackOverflow 질문에 나와있는 것처럼 인기있는 무료 오픈 소스 및 크로스 플랫폼 (UNIX / Linux, OSX, Windows) 선택 입니다. Git에 가장 적합한 시각적 병합 도구는 무엇입니까? Meld를 ​​제안하는 답변은 다른 도구보다 3 배 이상 많은 표를 얻습니다.

아래 두 가지 질문에 대한 답변이 아래에 있습니다.

  • Meld를 ​​git difftool로 어떻게 설정하고 사용합니까?
  • Meld를 ​​git mergetool로 어떻게 설정하고 사용합니까?

참고 : difftool 및 mergetool과 동일한 프로그램을 사용할 필요는 없으며 두 가지에 대해 서로 다른 프로그램을 설정할 수 있습니다.


1
관련 포스트- 일반적으로 Git에서 diff 도구구성하는 방법 .
RBT

답변:


423

Meld를 ​​git difftool로 어떻게 설정하고 사용합니까?

git difftool 은 터미널에 diff 출력을 표시하는 대신 GUI diff 프로그램 (예 : Meld)을 사용하여 diff를 표시합니다.

명령 행에서 GUI 프로그램을 설정할 수 있지만 파일 -t <tool> / --tool=<tool>에서 구성하는 것이 더 합리적 .gitconfig입니다. [참고 : 하단의 따옴표와 Windows 경로 탈출에 대한 섹션을 참조하십시오.]

# Add the following to your .gitconfig file.
[diff]
    tool = meld
[difftool]
    prompt = false
[difftool "meld"]
    cmd = meld "$LOCAL" "$REMOTE"

[참고 :이 설정은 git diff평소와 같이 계속 작동하는 동작을 변경하지 않습니다 .]

사용 git difftool하는 것과 똑같은 방식으로 사용 git diff합니다. 예 :

git difftool <COMMIT_HASH> file_name
git difftool <BRANCH_NAME> file_name
git difftool <COMMIT_HASH_1> <COMMIT_HASH_2> file_name

올바르게 구성된 경우 GUI 인터페이스를 사용하여 diff를 표시하는 Meld 창이 열립니다.

융합 GUI 윈도우 창의 순서는 순서에 의해 제어 될 수 $LOCAL$REMOTEcmd오른쪽 창에서 왼쪽 창 및있는 표시되는 파일 말을하는 것입니다. 다른 방법으로 원한다면 다음과 같이 바꾸십시오.

    cmd = meld "$REMOTE" "$LOCAL"

마지막으로 prompt = false라인은 단순히 git이 Meld를 ​​시작할 것인지 묻는 메시지를 표시하지 않습니다. 기본적으로 git은 프롬프트를 발행합니다.


Meld를 ​​git mergetool로 어떻게 설정하고 사용합니까?

git mergetool 을 사용하면 GUI 병합 프로그램 (예 : Meld)을 사용하여 병합 중에 발생한 병합 충돌을 해결할 수 있습니다.

difftool과 마찬가지로 GUI를 사용하여 명령 행에서 GUI 프로그램을 설정할 수 -t <tool> / --tool=<tool>있지만 이전과 마찬가지로 .gitconfig파일 에서 구성하는 것이 더 합리적 입니다. [참고 : 하단의 따옴표 및 Windows 경로 탈출에 대한 섹션을 참조하십시오.]

# Add the following to your .gitconfig file.
[merge]
    tool = meld
[mergetool "meld"]
    # Choose one of these 2 lines (not both!) explained below.
    cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
    cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"

git mergetool실제 병합을 수행하는 데 사용하지 않습니다 . 사용하기 전에 git mergetoolgit과 일반적인 방법으로 병합을 수행하십시오. 예 :

git checkout master
git merge branch_name

병합 충돌이 있으면 git은 다음과 같이 표시됩니다.

$ git merge branch_name
Auto-merging file_name
CONFLICT (content): Merge conflict in file_name
Automatic merge failed; fix conflicts and then commit the result.

이 시점 file_name에서 부분적으로 병합 된 파일과 병합 충돌 정보 (모든 >>>>>>><<<<<<<항목 이 포함 된 파일)가 포함됩니다 .

Mergetool을 사용하여 병합 충돌을 해결할 수 있습니다. 다음과 같이 쉽게 시작할 수 있습니다.

git mergetool

올바르게 구성된 경우 3 개의 파일을 표시하는 Meld 창이 열립니다. 각 파일은 GUI 인터페이스의 별도 창에 포함됩니다.

위의 예제 .gitconfig항목에서 두 줄이 줄로 제안됩니다 [mergetool "meld"] cmd. 실제로 고급 사용자가 cmd회선 을 구성 할 수있는 모든 방법이 있지만 이는이 답변의 범위를 벗어납니다.

이 답변에는 두 가지 대안 cmd이 있는데 그 중 대부분의 사용자를 수용 할 수 있으며 도구를 한 단계 더 복잡하게 만들고자하는 고급 사용자에게는 좋은 출발점이 될 것입니다.

먼저 매개 변수의 의미는 다음과 같습니다.

  • $LOCAL 현재 분기에있는 파일입니다 (예 : 마스터).
  • $REMOTE 병합 할 분기의 파일입니다 (예 : branch_name).
  • $MERGED 병합 충돌 정보가 포함 된 부분적으로 병합 된 파일입니다.
  • $BASE는의 공유 커밋 조상 $LOCAL이며 $REMOTE, 포함하는 브랜치를 $REMOTE처음 만들 때와 같이 파일을 말합니다 .

다음 중 하나를 사용하는 것이 좋습니다.

[mergetool "meld"]
    cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"

또는:

[mergetool "meld"]
    cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"
    # See 'Note On Output File' which explains --output "$MERGED".

선택 여부는 ~ 사이 $MERGED또는 $BASE사이 $LOCAL$REMOTE있습니다.

어느 쪽이든 융합은 3 개 창 표시 $LOCAL하고 $REMOTE왼쪽과 오른쪽 창 및 하나 $MERGED또는 $BASE가운데 창에 있습니다.

두 경우 모두 가운데 창은 병합 충돌을 해결하기 위해 편집해야하는 파일입니다. 차이점은 원하는 시작 편집 위치에 있습니다. $MERGED병합 충돌 정보 또는 부분적으로 병합 된 파일이 들어있는 파일 $BASE공유가의 조상 커밋에 $LOCAL$REMOTE. [두 cmd줄 모두 유용 할 수 있기 때문에 둘 다 내 .gitconfig파일 에 보관합니다 . 대부분의 경우 $MERGED회선을 사용하고 회선을 $BASE주석 처리하지만 $BASE대신 회선 을 사용하려면 주석 처리를 교체 할 수 있습니다 .]

출력 파일에 대한 참고 사항 :하지 걱정 --output "$MERGED"에 사용 cmd여부에 관계없이의 $MERGED또는 $BASE에서 이전에 사용 된 cmd라인. 이 --output옵션은 단순히 Meld에게 git이 충돌 해결 파일을 저장하기를 원하는 파일 이름을 알려줍니다. Meld는 사용 $MERGED또는 $BASE시작 편집 점에 상관없이 해당 파일에 충돌 편집 내용을 저장합니다 .

병합 충돌을 해결하기 위해 가운데 창을 편집 한 후 파일을 저장하고 Meld 창을 닫으십시오. Git은 자동으로 업데이트를 수행하고 현재 브랜치 (예 : 마스터)의 파일에 중간 창에있는 모든 것이 포함됩니다.

git은 .orig원래 파일 이름 에 추가하여 부분적으로 병합 된 파일을 병합 충돌 정보로 백업합니다 . 예 file_name.orig. 병합에 만족하는지 확인하고 원하는 테스트를 실행 한 후 .orig파일을 삭제할 수 있습니다.

이제 변경 사항을 커밋하기 위해 커밋을 수행 할 수 있습니다.

Meld에서 병합 충돌을 편집하는 동안 Meld 사용을 포기하려면 중간 분할 창에 병합 분석 파일을 저장하지 않고 Meld를 ​​종료하십시오. git은 메시지로 응답 file_name seems unchanged한 다음 묻습니다 Was the merge successful? [y/n]. 응답 n하면 병합 충돌 해결이 중단되고 파일은 변경되지 않습니다. 언제라도 Meld에 파일을 저장했다면 git으로부터 경고와 프롬프트를받지 못할 것입니다. [물론 파일을 삭제하고 .origgit이 만든 백업 파일로 바꿀 수 있습니다.]

병합 충돌이있는 파일이 두 개 이상인 경우 git은 모두 완료 될 때까지 하나씩 새 Meld 창을 엽니 다. 모두 동시에 열리지는 않지만 충돌 편집을 마치고 Meld를 ​​닫으면 git은 다음 충돌을 열고 모든 병합 충돌이 해결 될 때까지 계속 진행합니다.

실제 프로젝트 git mergetool에서 사용하기 전에 더미 프로젝트를 작성하여 사용을 테스트하는 것이 합리적 입니다. OS에서 줄 에서 따옴표를 이스케이프 처리해야하는 경우 테스트에서 공백이 포함 된 파일 이름을 사용해야합니다 ( 아래 참조).cmd


이스케이프 따옴표

일부 운영 체제는 따옴표를 cmd이스케이프 해야 할 수도 있습니다 . 경험이 부족한 사용자는 공백이 포함 된 파일 이름으로 config 명령 줄을 테스트해야하며 공백이 포함 된 파일 이름으로 cmd줄이 작동하지 않으면 따옴표를 이스케이프 처리하십시오. 예 :

cmd = meld \"$LOCAL\" \"$REMOTE\"

경우에 따라 더 복잡한 견적 이스케이프가 필요할 수 있습니다. 아래의 Windows 경로 링크 중 첫 번째에는 각 따옴표를 세 번 이스케이프하는 예가 포함되어 있습니다. 그것은 구멍이지만 때로는 필요합니다. 예 :

cmd = meld \\\"$LOCAL\\\" \\\"$REMOTE\\\"

Windows 경로

Windows 사용자는 Meld cmd라인에 추가 구성을 추가해야합니다 . meldc명령 줄에서 Windows로 호출되도록 설계된 전체 경로를 사용해야 할 수도 있고 래퍼를 사용해야하거나 사용할 수도 있습니다. 아래에 링크 된 StackOverflow 페이지를 읽어야합니다 cmd. 저는 Linux 사용자이기 때문에 다양한 Windows cmd라인 을 테스트 할 수 없으며 Meld에 대한 전체 경로를 meldc추가하거나 Meld 프로그램 폴더를 추가하는 예제를 사용하는 것 외에는 주제에 대한 추가 정보가 없습니다 path.

Meld로 후행 공백 무시

Meld에는 GUI에서 구성 할 수있는 여러 가지 기본 설정이 있습니다.

환경 설정 Text Filters탭에는 diff를 수행 할 때 주석과 같은 것을 무시하는 몇 가지 유용한 필터가 있습니다. 가 있지만 필터는 무시할 수 없습니다 All whitespaceLeading whitespace무시할 수없는 존재, Trailing whitespace(이것은 융합 메일 링리스트에 추가로 제안하지만 내 버전에서 사용할 수 없습니다 된) 필터를.

후행 공백을 무시하는 것은 특히 협업 할 때 매우 유용하며, Meld 환경 설정 Text Filters탭 에서 간단한 정규식으로 쉽게 수동으로 추가 할 수 있습니다 .

# Use either of these regexes depending on how comprehensive you want it to be.
[ \t]*$
[ \t\r\f\v]*$

이것이 모두에게 도움이되기를 바랍니다.


2
덕분에 사용하기 훨씬 쉽게 그 [mergetool "meld"] cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"에서 ~/.gitconfig, 그럼 그냥 중간 팬에 빨간색으로 강조 충돌을 해결하고 저장! 기본 설정이어야합니다.
KrisWebDev

1
$LOCAL $MERGED $REMOTE이 문제를 해결하기 위해 약간의 충돌이있을 때 대부분의 시간을 사용하는 설정은 훌륭하고 내 기본값이기도합니다. $LOCAL $BASE $REMOTE할 일이 많을 때 실제로 자체적으로 발생하며 어떤 파일 섹션에서 어떤 파일이 나오는지 정확히 알 수 있습니다. 공유 커밋 조상은 큰 혼란이없는 출발점이 될 수 있습니다. 때로는 충돌 강조 표시가 실제로 방해를받으며 더 깨끗한 기반이 축복입니다.
mattst

4
참고 : OSX에 있고 homebrew를 통해 meld를 설치 한 경우 출력 매개 변수에는 다음이 필요합니다 =.cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output="$MERGED"
Alteisen

2
.dmg를 설치하고 'meld'가 경로에없는 것을 발견 한 Mac 사용자의 경우 여기에서 대체 지침을 따르십시오. yousseb.github.io/meld
KC Baltz

3
그것은 Git Configuration-git mergetool 의 설명보다 훨씬 낫습니다 . $ MERGED와 $ BASE의 차이점을 설명해 주셔서 대단히 감사합니다. 날 미치게하지 않았다!
ChrisG

81

다른 대답은 맞지만 여기에 Meld를 ​​시각적 diff 도구로 구성하는 가장 빠른 방법이 있습니다. 이것을 복사 / 붙여 넣기 만하면됩니다.

git config --global diff.tool meld
git config --global difftool.prompt false

이제 git difftool디렉토리에서 실행하면 서로 다른 파일마다 Meld가 시작됩니다.

참고 사항 : Meld는 CSV 파일을 비교할 때 놀랍게도 느리며 , 내가 찾은 Linux diff 도구가이 Windows 도구 인 Compare It! 보다 빠르지 않습니다 ! (2010 년 마지막 업데이트).


13
아마 git config --global difftool.meld.cmd 'meld "$LOCAL" "$REMOTE"'거기에 줄을 원할 것입니다 . 이것은 "기본"하지만, 당신이를 구성 빨리으로 mergetool는은 difftool은 diff의 설정이 발견되지 않는 경우 기본값으로 mergetool 구성을 사용하기 시작합니다. 병합은 일반적으로 3 방향 병합을 위해 3 개의 파일을 전달하도록 구성되어 있기 때문에 meld diff 창에 갑자기 3 개의 창이있어 의미가 없습니다.
BeeOnRope

왜 $로 설정 한 후 설정을 확인하지 자식 설정 -l
agfe2

56

Windows의 경우 . Git Bash에서 다음 명령을 실행하십시오.

git config --global diff.tool meld
git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
git config --global difftool.prompt false

git config --global merge.tool meld
git config --global mergetool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
git config --global mergetool.prompt false

Meld.exe의 파일 경로가 다르면 업데이트하십시오.

리눅스의 경우 . Git Bash에서 다음 명령을 실행하십시오.

git config --global diff.tool meld
git config --global difftool.meld.path "/usr/bin/meld"
git config --global difftool.prompt false

git config --global merge.tool meld
git config --global mergetool.meld.path "/usr/bin/meld"
git config --global mergetool.prompt false

이 명령을 사용하여 Meld의 경로를 확인할 수 있습니다.

which meld

1
git difftool을 실행할 때 오류가 발생했습니다. "diff 도구 meld를 'D : \ software \ melddiff \ Meld.exe'로 사용할 수 없음"
Allen Vork

@AllenVork : Meld.exe가 지정한 폴더에 있음을 확인 했습니까? Git 외부에서 성공적으로 실행할 수 있습니까? 실행할 때 Git은 무엇을 반환 git config --global --get-regex diff*합니까?
MarredCheese 2016 년

나는 그것을 해결했다. "D : /software/melddiff/Meld.exe"로 변경하고 작동합니다. .gitconfig 형식은 Windows가 아닌 우분투입니다.
Allen Vork 2018 년

해서는 안되는 것 : git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"?
Jonathan Rosenne

@AllenVork, cygwin에 git을 사용하고 있습니까?
Adrian

25

다음과 같이 meld를 별도의 명령으로 설정하는 것을 선호합니다.

git config --global alias.meld '!git difftool -t meld --dir-diff'

이것은 git-meld.pl 스크립트와 유사합니다 : https://github.com/wmanley/git-meld

그런 다음 그냥 실행할 수 있습니다

git meld

방금 Cygwin과 함께 일하는 것이 좋았으며 이제는 파산되었습니다. 이것은 그것을 고쳤다. 감사! ( --dir-diff개인 취향에 따라 부분을 삭제했지만 )
PfunnyGuy

3

Windows 10의 경우 이것을 .gitconfig에 넣어야했습니다.

[merge]
  tool = meld
[mergetool "meld"]
  cmd = 'C:/Program Files (x86)/Meld/Meld.exe' $LOCAL $BASE $REMOTE --output=$MERGED
[mergetool]
  prompt = false

당신이 알아야 할 모든 것은 위의 mattst에 의해이 슈퍼 답변 으로 작성되었습니다 .

추신 : 어떤 이유로 Meld 3.18.x에서만 작동했으며 Meld 3.20.x에서는 오류가 발생했습니다.


1

diff 도구의 경로 구문이 다른 플랫폼과 다르기 때문에 이는 주로 Windows를 사용하는 개발자를 대상으로하는 답변입니다.

Kdiff3을 git mergetool로 사용하지만 git difftool을 Meld로 설정하려면 먼저 Meldmerge.org 에서 최신 버전의 Meld를 설치 한 다음 다음을 사용하여 전역 .gitconfig에 다음을 추가했습니다.

git config --global -e

기본 Vim 대신 Sublime Text 3을 코어 ditor로 사용하려면 이것을 .gitconfig 파일에 추가하면됩니다.

[core]
editor = 'c:/Program Files/Sublime Text 3/sublime_text.exe'

그런 다음 여관 Meld를 ​​difftool로 추가하십시오.

[diff]
tool = meld
guitool = meld 

[difftool "meld"]
cmd = \"C:/Program Files (x86)/Meld/Meld.exe\" \"$LOCAL\" \"$REMOTE\" --label \"DIFF 
(ORIGINAL MY)\"
prompt = false
path = C:\\Program Files (x86)\\Meld\\Meld.exe

위의 cmd에서 선행 슬래시를 확인하십시오. Windows에서는 필요합니다.

--dir-diff 옵션을 사용하여 현재 git diff를 표시하도록 별칭을 설정할 수도 있습니다 . 이것은 Meld 내부의 변경된 파일을 나열합니다. 이는 여러 파일을 변경했을 때 편리합니다 (사실 매우 일반적인 시나리오).

별명은 .gitconfig 파일에서 [alias] 섹션 아래에 다음과 같이 표시됩니다 .

showchanges = difftool --dir-diff

코드의 변경 사항을 표시하려면 다음 명령을 입력하십시오.

git showchanges

다음 이미지는이 --dir-diff 옵션이 변경된 파일 목록을 표시하는 방법을 보여줍니다 (예). $ LOCAL과 $ REMOTE 사이에서 변경된 파일 목록이 표시됩니다.

그런 다음 각 파일을 클릭하고 Meld 내부의 변경 사항을 표시 할 수 있습니다.


0

$ MERGED의 다른 섹션에서 머리의 차이를 계산하고 적용하는 것은 복잡 할 수 있습니다. 내 설정에서 meld는 다음을 사용하여 이러한 차이점을 시각적으로 표시하여 도움을줍니다.

[merge]
    tool = mymeld
    conflictstyle = diff3

[mergetool "mymeld"]
    cmd = meld --diff $BASE $REMOTE --diff $REMOTE $LOCAL --diff $LOCAL $MERGED

이상하게 보이지만 세 개의 탭을 사용하여 매우 편리한 워크 플로우를 제공합니다.

  1. 탭 1에서 병합 충돌을 해결하기 위해 탭 2에서 변경해야 할 사항이 왼쪽에서 오른쪽으로 표시됩니다.

  2. 탭 2의 오른쪽에서 "변경해야 할 사항"을 적용하고 전체 파일 내용을 클립 보드에 복사합니다 (ctrl-a 및 ctrl-c 사용).

  3. 탭 3에서 오른쪽을 클립 보드 내용으로 바꿉니다. 모든 것이 올 바르면 왼쪽에서 오른쪽으로 탭 1에 표시된 것과 동일한 변경 사항이 표시되지만 상황에 따라 다릅니다. 이 탭에서 변경 한 내용을 저장하십시오.

노트:

  • 탭 1에서 아무것도 편집하지 마십시오
  • 탭 3에 성가신 팝업이 생성되므로 탭 2에 아무것도 저장하지 마십시오.

단일 탭에서 3 방향 병합 (로컬 /베이스 / 원격)보다 나은가요?
André Werlang

@ AndréWerlang 단일 탭에서 3 방향 병합의 장점은 충돌하는 변경 사항 만 처리하면됩니다 (다른 변경 내용은 자동으로 병합 됨). 그러나 3 방향 병합에서 변경된 내용과 모든 변경 사항을 보존하는 방식으로 병합하는 방법을 이해하기 어려운 경우에는 "내"접근 방식을 선호합니다. 어떤 시점에서 3 방향 병합이 더 이상 나를 혼동하지 않으면 다시 전환 할 수 있습니다.
mnieber

사용자 mattst가 지적한 바와 같이, 당신은 사용할 수있는 $BASE대신 $MERGED병합 작업 시작
앙드레 Werlang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.