git difftool 및 mergetool로 Meld 설정 및 사용
이 질문과 답변의 많은 정보가 StackOverflow 에서 제공되지만 많은 페이지와 기타 답변 사이에 잘못되었거나 오해의 소지가 있습니다. 내가 알고 싶은 모든 것을한데 모으는 데 시간이 걸렸습니다.
git difftool 및 mergetool로 사용할 수있는 다양한 프로그램이 있으며, 어느 것이 가장 좋은지에 대한 합의가 없습니다 (의견, 요구 사항 및 OS가 분명히 다름).
Meld는 StackOverflow 질문, Git에 가장 적합한 시각적 병합 도구는 무엇입니까?에서 볼 수 있듯이 널리 사용되는 크로스 플랫폼 (UNIX / Linux, OSX, Windows) 선택입니다 . Meld를 제안하는 답변은 다른 도구보다 3 배 이상 많은 표를 얻습니다.
아래 두 가지 질문에 대한 답변이 아래에 있습니다.
- Meld를 git difftool로 어떻게 설정하고 사용합니까?
- Meld를 git mergetool로 어떻게 설정하고 사용합니까?
참고 : difftool 및 mergetool과 동일한 프로그램을 사용할 필요는 없으며 두 가지에 대해 서로 다른 프로그램을 설정할 수 있습니다.
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
와 $REMOTE
의 cmd
오른쪽 창에서 왼쪽 창 및있는 표시되는 파일 말을하는 것입니다. 다른 방법으로 원한다면 다음과 같이 바꾸십시오.
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 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 this point file_name
will contain the partially merged file with the merge conflict information (that's the file with all the >>>>>>>
and <<<<<<<
entries in it).
Mergetool can now be used to resolve the merge conflicts. You start it very easily with:
git mergetool
If properly configured a Meld window will open displaying 3 files. Each file will be contained in a separate pane of its GUI interface.
In the example .gitconfig
entry above, 2 lines are suggested as the [mergetool "meld"]
cmd
line. In fact there are all kinds of ways for advanced users to configure the cmd
line, but that is beyond the scope of this answer.
This answer has 2 alternative cmd
lines which, between them, will cater for most users, and will be a good starting point for advanced users who wish to take the tool to the next level of complexity.
Firstly here is what the parameters mean:
$LOCAL
is the file in the current branch (e.g. master).$REMOTE
is the file in the branch being merged (e.g. branch_name).$MERGED
is the partially merged file with the merge conflict information in it.$BASE
is the shared commit ancestor of$LOCAL
and$REMOTE
, this is to say the file as it was when the branch containing$REMOTE
was originally created.
I suggest you use either:
[mergetool "meld"]
cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
or:
[mergetool "meld"]
cmd = meld "$LOCAL" "$BASE" "$REMOTE" --output "$MERGED"
# See 'Note On Output File' which explains --output "$MERGED".
The choice is whether to use $MERGED
or $BASE
in between $LOCAL
and $REMOTE
.
Either way Meld will display 3 panes with $LOCAL
and $REMOTE
in the left and right panes and either $MERGED
or $BASE
in the middle pane.
In BOTH cases the middle pane is the file that you should edit to resolve the merge conflicts. The difference is just in which starting edit position you'd prefer; $MERGED
for the file which contains the partially merged file with the merge conflict information or $BASE
for the shared commit ancestor of $LOCAL
and $REMOTE
. [Since both cmd
lines can be useful I keep them both in my .gitconfig
file. Most of the time I use the $MERGED
line and the $BASE
line is commented out, but the commenting out can be swapped over if I want to use the $BASE
line instead.]
Note On Output File: Do not worry that --output "$MERGED"
is used in cmd
regardless of whether $MERGED
or $BASE
was used earlier in the cmd
line. The --output
option simply tells Meld what filename git wants the conflict resolution file to be saved in. Meld will save your conflict edits in that file regardless of whether you use $MERGED
or $BASE
as your starting edit point.
After editing the middle pane to resolve the merge conflicts, just save the file and close the Meld window. Git will do the update automatically and the file in the current branch (e.g. master) will now contain whatever you ended up with in the middle pane.
git will have made a backup of the partially merged file with the merge conflict information in it by appending .orig
to the original filename. e.g. file_name.orig
. After checking that you are happy with the merge and running any tests you may wish to do, the .orig
file can be deleted.
At this point you can now do a commit to commit the changes.
If, while you are editing the merge conflicts in Meld, you wish to abandon the use of Meld, then quit Meld without saving the merge resolution file in the middle pane. git will respond with the message file_name seems unchanged
and then ask Was the merge successful? [y/n]
, if you answer n
then the merge conflict resolution will be aborted and the file will remain unchanged. Note that if you have saved the file in Meld at any point then you will not receive the warning and prompt from git. [Of course you can just delete the file and replace it with the backup .orig
file that git made for you.]
If you have more than 1 file with merge conflicts then git will open a new Meld window for each, one after another until they are all done. They won't all be opened at the same time, but when you finish editing the conflicts in one, and close Meld, git will then open the next one, and so on until all the merge conflicts have been resolved.
It would be sensible to create a dummy project to test the use of git mergetool
before using it on a live project. Be sure to use a filename containing a space in your test, in case your OS requires you to escape the quotes in the cmd
line, see below.
Escaping quote characters
Some operating systems may need to have the quotes in cmd
escaped. Less experienced users should remember that config command lines should be tested with filenames that include spaces, and if the cmd
lines don't work with the filenames that include spaces then try escaping the quotes. e.g.
cmd = meld \"$LOCAL\" \"$REMOTE\"
In some cases more complex quote escaping may be needed. The 1st of the Windows path links below contains an example of triple-escaping each quote. It's a bore but sometimes necessary. e.g.
cmd = meld \\\"$LOCAL\\\" \\\"$REMOTE\\\"
Windows paths
Windows users will probably need extra configuration added to the Meld cmd
lines. They may need to use the full path to meldc
, which is designed to be called on Windows from the command line, or they may need or want to use a wrapper. They should read the StackOverflow pages linked below which are about setting the correct Meld cmd
line for Windows. Since I am a Linux user I am unable to test the various Windows cmd
lines and have no further information on the subject other than to recommend using my examples with the addition of a full path to Meld or meldc
, or adding the Meld program folder to your path
.
Ignoring trailing whitespace with Meld
Meld has a number of preferences that can be configured in the GUI.
In the preferences Text Filters
tab there are several useful filters to ignore things like comments when performing a diff. Although there are filters to ignore All whitespace
and Leading whitespace
, there is no ignore Trailing whitespace
filter (this has been suggested as an addition in the Meld mailing list but is not available in my version).
Ignoring trailing whitespace is often very useful, especially when collaborating, and can be manually added easily with a simple regular expression in the Meld preferences Text Filters
tab.
# Use either of these regexes depending on how comprehensive you want it to be.
[ \t]*$
[ \t\r\f\v]*$
I hope this helps everyone.
While the other answer is correct, here's the fastest way to just go ahead and configure Meld as your visual diff tool. Just copy/paste this:
git config --global diff.tool meld
git config --global difftool.prompt false
Now run git difftool
in a directory and Meld will be launched for each different file.
Side note: Meld is surprisingly slow at comparing CSV files, and no Linux diff tool I've found is faster than this Windows tool called Compare It! (last updated in 2010).
For Windows. Run these commands in 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
(Update the file path for Meld.exe if yours is different.)
For Linux. Run these commands in 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
You can verify Meld's path using this command:
which meld
I prefer to setup meld as a separate command, like so:
git config --global alias.meld '!git difftool -t meld --dir-diff'
This makes it similar to the git-meld.pl script here: https://github.com/wmanley/git-meld
You can then just run
git meld
For Windows 10 I had to put this in my .gitconfig:
[merge]
tool = meld
[mergetool "meld"]
cmd = 'C:/Program Files (x86)/Meld/Meld.exe' $LOCAL $BASE $REMOTE --output=$MERGED
[mergetool]
prompt = false
Everything else you need to know is written in this super answer by mattst further above.
PS: For some reason, this only worked with Meld 3.18.x, Meld 3.20.x gives me an error.
This is an answer targeting primarily developers using Windows, as the path syntax of the diff tool differs from other platforms.
I use Kdiff3 as the git mergetool, but to set up the git difftool as Meld, I first installed the latest version of Meld from Meldmerge.org then added the following to my global .gitconfig using:
git config --global -e
Note, if you rather want Sublime Text 3 instead of the default Vim as core ditor, you can add this to the .gitconfig file:
[core]
editor = 'c:/Program Files/Sublime Text 3/sublime_text.exe'
Then you add inn Meld as the 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
Note the leading slash in the cmd above, on Windows it is necessary.
It is also possible to set up an alias to show the current git diff with a --dir-diff option. This will list the changed files inside Meld, which is handy when you have altered multiple files (a very common scenario indeed).
The alias looks like this inside the .gitconfig file, beneath [alias] section:
showchanges = difftool --dir-diff
To show the changes I have made to the code I then just enter the following command:
git showchanges
The following image shows how this --dir-diff option can show a listing of changed files (example):
Then it is possible to click on each file and show the changes inside Meld.
It can be complicated to compute a diff in your head from the different sections in $MERGED and apply that. In my setup, meld helps by showing you these diffs visually, using:
[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $REMOTE --diff $REMOTE $LOCAL --diff $LOCAL $MERGED
It looks strange but offers a very convenient work-flow, using three tabs:
in tab 1 you see (from left to right) the change that you should make in tab 2 to solve the merge conflict.
in the right side of tab 2 you apply the "change that you should make" and copy the entire file contents to the clipboard (using ctrl-a and ctrl-c).
in tab 3 replace the right side with the clipboard contents. If everything is correct, you will now see - from left to right - the same change as shown in tab 1 (but with different contexts). Save the changes made in this tab.
Notes:
- don't edit anything in tab 1
- don't save anything in tab 2 because that will produce annoying popups in tab 3
'Programing' 카테고리의 다른 글
gradle 의존성이 새로운 버전인지 확인하는 방법 (0) | 2020.05.06 |
---|---|
web.config 파일을 사용하여 HTTPS를 강제 실행하는 방법 (0) | 2020.05.06 |
x == (x = y)가 (x = y) == x와 다른 이유는 무엇입니까? (0) | 2020.05.06 |
Bash에서 공백을 마침표로 교체 (0) | 2020.05.06 |
Java 클래스가 빈 줄과 다르게 컴파일되는 이유는 무엇입니까? (0) | 2020.05.06 |