programing

Gitdiff 도구 및 병합 도구로 Meld 설정 및 사용

newstyles 2023. 5. 29. 09:57

Gitdiff 도구 및 병합 도구로 Meld 설정 및 사용

이 질의응답의 많은 정보는 StackOverflow에서 사용할 수 있지만, 이 정보는 많은 페이지와 잘못되었거나 오해의 소지가 있는 다른 답변에 걸쳐 있습니다.제가 알고 싶은 모든 것을 정리하는 데 시간이 좀 걸렸습니다.

Gitdiff 툴과 Merge 툴로 사용할 수 있는 다양한 프로그램이 있으며, 어느 것이 최선인지에 대한 합의는 확실히 없습니다(의견, 요구사항 및 OS는 분명히 다를 것입니다).

Meld는 인기 있는 자유, 오픈 소스 및 크로스 플랫폼(UNIX/Linux, OSX, Windows) 선택입니다. StackOverflow 질문인 "Git에 가장 적합한 시각적 병합 도구는 무엇입니까?"에서 볼 수 있듯이, Meld를 제안하는 답변은 다른 도구보다 3배 이상의 표를 얻었습니다.

아래 제 답변에는 다음 2가지 질문이 답변될 예정입니다.

  • 어떻게 멜드를 내 기트디프 도구로 설정하고 사용합니까?
  • Meld를 내 선물 도구로 어떻게 설정하고 사용합니까?

참고: diff 툴과 merge 툴 모두에서 동일한 프로그램을 사용할 필요는 없으며, 두 프로그램 모두에 대해 다른 프로그램을 설정할 수 있습니다.

어떻게 멜드를 내 기트디프 도구로 설정하고 사용합니까?

git diff 도구는 단말기에 diff 출력을 표시하는 대신 GUI diff 프로그램(즉, Meld)을 사용하여 diff를 표시합니다.

할 수 에도 GUI를 사용할 수 .-t <tool> / --tool=<tool>▁it▁in다▁it니▁▁sense▁more로 구성하는 것이 더 가 있습니다..gitconfig파일. [참고: 아래에 있는 이스케이프 따옴표 및 윈도우즈 경로에 대한 섹션을 참조하십시오.]

# 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

적절하게 구성된 경우 Meld 창이 열리고 GUI 인터페이스를 사용하여 diff가 표시됩니다.

Meld GUI 창의 순서는 다음 순서로 제어할 수 있습니다.$LOCAL그리고.$REMOTEcmd즉, 왼쪽 창에 표시되는 파일과 오른쪽 창에 표시되는 파일을 말합니다.반대로 원하는 경우 다음과 같이 교체하면 됩니다.

    cmd = meld "$REMOTE" "$LOCAL"

마침내prompt = false하지 않도록 . line을 합니다. 기본적으로 Git는 프롬프트를 표시합니다.


Meld를 내 선물 도구로 어떻게 설정하고 사용합니까?

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

처럼 diff 툴을 사용하여 할 수 .-t <tool> / --tool=<tool>하지만, 이전과 마찬가지로, 그것을 구성하는 것이 더 말이 됩니다..gitconfig파일. [참고: 아래에 있는 이스케이프 따옴표 및 윈도우즈 경로에 대한 섹션을 참조하십시오.]

# 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 mergetool일반적인 방법으로 git를 사용하여 병합을 수행합니다. 예를 들어,

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.

시점에서 이시점서에▁at.file_name정보를 "" "라는 입니다." ("라는 뜻).>>>>>>>그리고.<<<<<<<항목을 입력합니다.

병합 도구를 사용하여 병합 충돌을 해결할 수 있습니다.다음을 통해 매우 쉽게 시작할 수 있습니다.

git mergetool

적절하게 구성된 경우 Meld 창이 열리고 3개의 파일이 표시됩니다.각 파일은 GUI 인터페이스의 별도 창에 포함됩니다.

.gitconfig이 위의항목, 2행개제라로 됩니다.[mergetool "meld"] cmdline.가 인라를 할 수 합니다. 사실 고급 사용자들이 구성할 수 있는 모든 종류의 방법이 있습니다.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개의 과 함께 멜드 3개의 합니다.$LOCAL그리고.$REMOTE과 왼과오른창그둘리중하나고에서쪽쪽▁in▁the▁and하나▁either중.$MERGED또는$BASE가운데 창에

두 경우 모두 가운데 창은 병합 충돌을 해결하기 위해 편집해야 하는 파일입니다.당신이 을 시작하는을 선호하는지에 있습니다.$MERGED부분적으로 병합된 정보가 있는 파일 또는 " Conflict "이 $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에서 경고 및 프롬프트를 수신하지 않습니다.[물론 파일을 삭제하고 백업으로 대체할 수 있습니다..orig당신을 위해 깃이 만든 파일.]

병합 충돌이 있는 파일이 두 개 이상 있는 경우 Git는 해당 파일이 모두 완료될 때까지 각 파일에 대해 차례로 새 Meld 창을 엽니다.모든 항목이 동시에 열리지는 않지만, 하나의 충돌 편집을 완료하고 Meld를 닫으면 Git가 다음 항목을 열고 모든 병합 충돌이 해결될 때까지 계속됩니다.

의 사용을 테스트하기 위해 더미 프로젝트를 만드는 것이 현명할 것입니다.git mergetool실시간 프로젝트에 사용하기 전에.OS에서 따옴표를 이스케이프해야 하는 경우 테스트에 공백이 포함된 파일 이름을 사용해야 합니다.cmd선, 아래를 참조하십시오.


따옴표 문자를 이스케이트

를 따옴표로 할 수도 .cmd 명령줄을 공백이 . 그리고 만약 "component "이 공백이 포함된 파일 이름이라면.cmd줄은 공백이 포함된 파일 이름에서 작동하지 않습니다. 그런 다음 따옴표를 이스케이프하십시오.

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

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

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

윈도우즈 경로

Windows에 할 수 .cmd 인라에 대한 해야 할 수도 . 그들은 아마도 전체 경로를 사용해야 할 것입니다.meldc명령행에서 Windows로 호출되도록 설계되었거나 래퍼가 필요하거나 사용하기를 원할 수 있습니다.올바른 Meld 설정에 관한 아래 링크된 StackOverflow 페이지를 읽어야 합니다.cmdWindows용 줄입니다.에 다양한 Linux를 할 수 .cmd및 이 또는 행 주 대 및 에 제 한 추 정 멜 에 르 도 대 전 는 한 경 추 사 것 없 니 다 습 것 외 는 에 는 권 하 을 장 할 용 를 예 가 와 로▁with▁to▁▁examples▁using▁and▁other▁have▁subject▁my▁me▁the▁no▁to행▁inform▁of▁path▁than▁furtheration▁on▁recommend니다습없▁addition▁the▁ald▁full외는것에및는하제▁or주권meldc를 멜드 프로그램 폴더에 합니다.path.

Meld를 사용하여 후행 공백 무시

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

설정에서Text Filters탭에는 diff를 수행할 때 주석과 같은 것을 무시하는 몇 가지 유용한 필터가 있습니다.할 수 있는 는 ,All whitespace그리고.Leading 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]*$

다른 답변이 맞긴 하지만, 다음은 Meld를 시각적 디프 도구로 구성하는 가장 빠른 방법입니다.복사/붙여넣기:

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

지금실을 실행합니다.git difftool디렉터리에 있으면 각 다른 파일에 대해 멜드가 실행됩니다.

참고 사항:Meld는 CSV 파일을 비교하는 속도가 놀라울 정도로 느리며 Compare It!(2010년 마지막 업데이트)이라는 Windows 도구보다 빠른 Linux diff 도구는 없습니다.

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의 파일 경로를 업데이트합니다.)

Linux의 경우.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

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

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

따라서 https://github.com/wmanley/git-meld 스크립트와 유사합니다. git-meld.pl

그러면 그냥 도망칠 수 있습니다.

git meld

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

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

당신이 알아야 할 다른 모든 것들은 위의 매트에 의해 쓰여진 이 멋진 대답에 쓰여져 있습니다.

PS: 어떤 이유에서인지 이것은 Meld 3.18.x에서만 작동했지만 일부 Meld 3.20.x 버전에서는 오류가 발생합니다.Tomas Molina가 아래 코멘트에서 언급한 대로 Meld 3.20.4와 함께 작동해야 합니다.

저는 이 간단한 설정을 멜드로 따릅니다.Meld는 무료이며 오픈 소스 diff 도구입니다.코드 변경 사항에 대한 파일 및 디렉터리의 멋진 비교를 볼 수 있습니다.

  1. yum/apt를 사용하여 Linux에 meld를 설치합니다.
  2. ~/.gitconfig 파일에 다음 행 추가
[diff]
    tool = meld
  1. 코드 repo로 이동하고 다음 명령을 입력하여 마지막으로 커밋된 변경사항과 현재 작업 디렉토리(준비되지 않은 커밋된 변경사항) 간의 차이를 확인합니다.

git diff tool --get-diff./

  1. 마지막 커밋된 코드와 준비된 코드 간의 차이를 보려면 다음 명령을 사용합니다.

git diff tool --gets --gets --gets-diff./

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

Gitmerge 도구로 Kdiff3를 사용하지만 Gitdiff 도구를 Meld로 설정하기 위해 먼저 Meldmerge.org 에서 최신 버전의 Meld를 설치한 다음 다음을 사용하여 글로벌 .gitconfig에 추가했습니다.

git config --global -e

기본 Vim을 코어 편집기로 사용하는 대신 Sublime Text 3을 사용하려면 .gitconfig 파일에 추가할 수 있습니다.

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

그런 다음 inn Meld를 diff 툴로 추가합니다.

[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에서 선행 슬래시를 확인하십시오. 윈도우즈에서는 이를 수행해야 합니다.

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

별칭은 .gitconfig 파일의 [alias] 섹션 아래에 있는 다음과 같습니다.

showchanges = difftool --dir-diff

코드에 대한 변경 내용을 표시하려면 다음 명령을 입력합니다.

git showchanges

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

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

$Merged의 다른 섹션과 당신의 머릿속의 차이를 계산하고 그것을 적용하는 것은 복잡할 수 있습니다.내 설정에서 Meld는 다음을 사용하여 이러한 차이를 시각적으로 보여줍니다.

[merge]
    tool = mymeld
    conflictstyle = diff3

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

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

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

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

  3. 탭 3에서 오른쪽을 클립보드 내용으로 바꿉니다.모든 것이 올바르면 이제 왼쪽에서 오른쪽으로 탭 1에 표시된 것과 동일한 변경 사항이 표시됩니다(단, 상황에 따라 다름).이 탭에서 변경한 내용을 저장합니다.

주의:

  • 탭 1에서 아무것도 편집하지 않음
  • 탭 2에 아무것도 저장하지 마십시오. 탭 3에 성가신 팝업이 표시됩니다.

@mattest의 훌륭한 답변에는 이것을 제외하고는 별로 추가할 것이 없습니다.WSL2(Windows Subsystem for Linux)를 사용하는 사용자의 경우 Linux에서 개발할 수 있지만 Windows용 Meld를 사용할 수 있습니다.

cmd = "/mnt/c/Program Files (x86)/Meld/Meld.exe" "$LOCAL" "$REMOTE"

한 가지 주의할 점은 제 모든 코드가 WLS2 가상 드라이브가 아닌 Windows 드라이브에 있다는 점입니다.

언급URL : https://stackoverflow.com/questions/34119866/setting-up-and-using-meld-as-your-git-difftool-and-mergetool