Thiết lập và sử dụng Meld làm git Difftool và mergetool của bạn


255

Mặc dù phần lớn thông tin trong câu hỏi và câu trả lời này có sẵn trên StackOverflow , nhưng nó được trải rộng trên nhiều trang và trong số các câu trả lời khác là sai hoặc sai. Phải mất một thời gian để ghép lại mọi thứ tôi muốn biết.

Có rất nhiều chương trình khác nhau có thể được sử dụng như git Difftool và mergetool của bạn, và chắc chắn không có sự đồng thuận nào là tốt nhất (ý kiến, yêu cầu và hệ điều hành sẽ khác nhau rõ ràng).

Meld là một lựa chọn phổ biến, mã nguồn mở và đa nền tảng (UNIX / Linux, OSX, Windows) phổ biến như trong câu hỏi StackOverflow , Công cụ hợp nhất trực quan nào tốt nhất cho Git? , trong đó câu trả lời đề xuất Meld có số phiếu nhiều hơn 3 lần so với bất kỳ công cụ nào khác.

2 câu hỏi sau đây sẽ được trả lời trong câu trả lời của tôi dưới đây:

  • Làm cách nào để thiết lập và sử dụng Meld làm git Difftool của tôi?
  • Làm cách nào để thiết lập và sử dụng Meld làm hợp nhất git của tôi?

Lưu ý: Không cần thiết phải sử dụng cùng một chương trình vì cả Difftool và mergetool của bạn, các chương trình khác nhau có thể được đặt cho cả hai.


Câu trả lời:


423

Làm cách nào để thiết lập và sử dụng Meld làm git Difftool của tôi?

git Difftool hiển thị diff bằng chương trình tìm khác biệt GUI (tức là Meld) thay vì hiển thị đầu ra diff trong terminal của bạn.

Mặc dù bạn có thể đặt chương trình GUI trên dòng lệnh bằng cách sử dụng -t <tool> / --tool=<tool>nó có ý nghĩa hơn để định cấu hình nó trong .gitconfigtệp của bạn . [Lưu ý: Xem các phần về thoát dấu ngoặc kép và đường dẫn Windows ở phía dưới.]

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

[Lưu ý: Những cài đặt này sẽ không thay đổi hành vi git diffsẽ tiếp tục hoạt động như bình thường.]

Bạn sử dụng git difftoolchính xác như cách bạn sử dụng git diff. ví dụ

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

Nếu được cấu hình đúng, cửa sổ Meld sẽ mở hiển thị diff bằng giao diện GUI.

Thứ tự của các ô cửa sổ GUI Meld có thể được điều khiển theo thứ tự $LOCAL$REMOTEtrong cmd, nghĩa là tệp nào được hiển thị trong khung bên trái và trong khung bên phải. Nếu bạn muốn chúng theo cách khác, chỉ cần trao đổi chúng xung quanh như thế này:

    cmd = meld "$REMOTE" "$LOCAL"

Cuối cùng, prompt = falsedòng chỉ đơn giản ngăn git nhắc bạn về việc bạn có muốn khởi chạy Meld hay không, theo mặc định, git sẽ đưa ra lời nhắc.


Làm cách nào để thiết lập và sử dụng Meld làm hợp nhất git của tôi?

git mergetool cho phép bạn sử dụng chương trình hợp nhất GUI (tức là Meld) để giải quyết các xung đột hợp nhất đã xảy ra trong quá trình hợp nhất.

Giống như Difftool, bạn có thể đặt chương trình GUI trên dòng lệnh bằng cách sử dụng -t <tool> / --tool=<tool>, nhưng như trước đây, việc cấu hình nó trong .gitconfigtệp của bạn có ý nghĩa hơn . [Lưu ý: Xem các phần về thoát dấu ngoặc kép và đường dẫn Windows ở phía dưới.]

# 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"

Bạn KHÔNG sử dụng git mergetoolđể thực hiện hợp nhất thực tế. Trước khi sử dụng, git mergetoolbạn thực hiện hợp nhất theo cách thông thường với git. ví dụ

git checkout master
git merge branch_name

Nếu có xung đột hợp nhất, git sẽ hiển thị một cái gì đó như thế này:

$ 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.

Tại thời điểm file_namenày sẽ chứa tệp được hợp nhất một phần với thông tin xung đột hợp nhất (đó là tệp có tất cả các mục >>>>>>><<<<<<<mục trong đó).

Mergetool hiện có thể được sử dụng để giải quyết xung đột hợp nhất. Bạn bắt đầu nó rất dễ dàng với:

git mergetool

Nếu được cấu hình đúng, cửa sổ Meld sẽ mở hiển thị 3 tệp. Mỗi tệp sẽ được chứa trong một khung riêng biệt của giao diện GUI.

Trong .gitconfigmục ví dụ ở trên, 2 dòng được đề xuất là [mergetool "meld"] cmddòng. Trong thực tế, có tất cả các cách để người dùng nâng cao định cấu hình cmddòng, nhưng điều đó nằm ngoài phạm vi của câu trả lời này.

Câu trả lời này có 2 cmddòng thay thế , giữa chúng, sẽ phục vụ cho hầu hết người dùng và sẽ là điểm khởi đầu tốt cho người dùng nâng cao muốn đưa công cụ lên mức độ phức tạp tiếp theo.

Đầu tiên ở đây là ý nghĩa của các tham số:

  • $LOCAL là tập tin trong nhánh hiện tại (ví dụ: master).
  • $REMOTE là tệp trong nhánh được hợp nhất (ví dụ Branch_name).
  • $MERGED là tệp được hợp nhất một phần với thông tin xung đột hợp nhất trong đó.
  • $BASElà tổ tiên cam kết được chia sẻ của $LOCAL$REMOTE, điều này có nghĩa là tập tin giống như khi nhánh chứa $REMOTEban đầu được tạo.

Tôi đề nghị bạn sử dụng một trong hai:

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

hoặc là:

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

Sự lựa chọn là sử dụng $MERGEDhoặc $BASEở giữa $LOCAL$REMOTE.

Dù bằng cách nào, Meld sẽ hiển thị 3 tấm với $LOCAL$REMOTEở các ô bên trái và bên phải và ở $MERGEDhoặc $BASEở giữa.

Trong trường hợp CẢ HAI, ngăn giữa là tệp mà bạn nên chỉnh sửa để giải quyết xung đột hợp nhất. Sự khác biệt chỉ là ở chỗ bắt đầu chỉnh sửa vị trí bạn muốn; $MERGEDđối với tệp chứa tệp được hợp nhất một phần với thông tin xung đột hợp nhất hoặc $BASEcho tổ tiên cam kết được chia sẻ của $LOCAL$REMOTE. [Vì cả hai cmddòng có thể hữu ích, tôi giữ cả hai trong .gitconfigtệp của mình . Hầu hết thời gian tôi sử dụng $MERGEDdòng và $BASEdòng được nhận xét, nhưng nhận xét có thể được hoán đổi nếu tôi muốn sử dụng $BASEdòng thay thế.]

Lưu ý On Output File: Đừng lo lắng rằng --output "$MERGED"được sử dụng trong cmdbất kể $MERGEDhoặc $BASEđã được sử dụng trước đó trong cmddòng. Các --outputtùy chọn chỉ đơn giản nói với Meld gì git filename muốn các tập tin giải quyết xung đột được lưu trong. Meld sẽ tiết kiệm được chỉnh sửa xung đột của bạn trong tập tin đó cho dù bạn sử dụng $MERGEDhoặc $BASEnhư bắt đầu chỉnh sửa quan điểm của bạn.

Sau khi chỉnh sửa khung giữa để giải quyết xung đột hợp nhất, chỉ cần lưu tệp và đóng cửa sổ Meld. Git sẽ tự động cập nhật và tệp trong nhánh hiện tại (ví dụ: master) sẽ chứa bất cứ thứ gì bạn đã kết thúc ở khung giữa.

git sẽ tạo một bản sao lưu của tệp được hợp nhất một phần với thông tin xung đột hợp nhất trong đó bằng cách thêm .origvào tên tệp gốc. ví dụ file_name.orig. Sau khi kiểm tra xem bạn có hài lòng với việc hợp nhất và chạy bất kỳ thử nghiệm nào bạn muốn làm không, .origtệp có thể bị xóa.

Tại thời điểm này, bây giờ bạn có thể thực hiện một cam kết để cam kết thay đổi.

Nếu, trong khi bạn đang chỉnh sửa xung đột hợp nhất trong Meld, bạn muốn từ bỏ việc sử dụng Meld, sau đó thoát Meld mà không lưu tệp giải quyết hợp nhất trong khung giữa. git sẽ trả lời với thông báo file_name seems unchangedvà sau đó hỏi Was the merge successful? [y/n], nếu bạn trả lời nthì giải quyết xung đột hợp nhất sẽ bị hủy bỏ và tệp sẽ không thay đổi. Lưu ý rằng nếu bạn đã lưu tệp trong Meld tại bất kỳ thời điểm nào thì bạn sẽ không nhận được cảnh báo và lời nhắc từ git. [Tất nhiên bạn chỉ có thể xóa tệp và thay thế nó bằng .origtệp sao lưu git tạo cho bạn.]

Nếu bạn có nhiều hơn 1 tệp có xung đột hợp nhất thì git sẽ mở một cửa sổ Meld mới cho từng tệp, từng cái một cho đến khi hoàn tất. Tất cả chúng sẽ không được mở cùng một lúc, nhưng khi bạn hoàn thành chỉnh sửa các xung đột trong một và đóng Meld, git sau đó sẽ mở cái tiếp theo, và cứ thế cho đến khi tất cả các xung đột hợp nhất đã được giải quyết.

Sẽ là hợp lý khi tạo một dự án giả để kiểm tra việc sử dụng git mergetooltrước khi sử dụng nó trong một dự án trực tiếp . Hãy chắc chắn sử dụng tên tệp chứa khoảng trắng trong thử nghiệm của bạn, trong trường hợp HĐH của bạn yêu cầu bạn thoát dấu ngoặc kép trong cmddòng, xem bên dưới.


Thoát khỏi nhân vật trích dẫn

Một số hệ điều hành có thể cần phải có dấu ngoặc kép trong cmdthoát. Người dùng ít kinh nghiệm nên nhớ rằng các dòng lệnh cấu hình nên được kiểm tra với tên tệp bao gồm khoảng trắng và nếu các cmddòng không hoạt động với tên tệp bao gồm khoảng trắng thì hãy thử thoát dấu ngoặc kép. ví dụ

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

Trong một số trường hợp, trích dẫn phức tạp hơn có thể cần thiết. Liên kết đường dẫn thứ 1 của Windows bên dưới chứa một ví dụ về thoát ba lần mỗi trích dẫn. Đó là một nhàm chán nhưng đôi khi cần thiết. ví dụ

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

Đường dẫn Windows

Người dùng Windows có thể sẽ cần thêm cấu hình được thêm vào cmddòng Meld . Họ có thể cần sử dụng đường dẫn đầy đủ đến meldc, được thiết kế để được gọi trên Windows từ dòng lệnh hoặc họ có thể cần hoặc muốn sử dụng trình bao bọc. Họ nên đọc các trang StackOverflow được liên kết bên dưới, về cách thiết lập cmddòng Meld chính xác cho Windows. Vì tôi là người dùng Linux, tôi không thể kiểm tra các cmddòng Windows khác nhau và không có thêm thông tin nào về chủ đề này ngoài việc khuyến nghị sử dụng các ví dụ của tôi với việc thêm đường dẫn đầy đủ đến Meld meldchoặc thêm thư mục chương trình Meld vào path.

Bỏ qua khoảng trắng theo sau với Meld

Meld có một số tùy chọn có thể được cấu hình trong GUI.

Trong Text Filterstab tùy chọn, có một số bộ lọc hữu ích để bỏ qua những thứ như nhận xét khi thực hiện tìm khác biệt. Mặc dù có các bộ lọc để bỏ qua All whitespaceLeading whitespace, không có Trailing whitespacebộ lọc bỏ qua (điều này đã được đề xuất như là một bổ sung trong danh sách gửi thư Meld nhưng không có sẵn trong phiên bản của tôi).

Bỏ qua khoảng trắng theo dõi thường rất hữu ích, đặc biệt là khi cộng tác và có thể được thêm thủ công dễ dàng bằng một biểu thức chính quy đơn giản trong Text Filterstab tùy chọn Meld .

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

Tôi hy vọng điều này sẽ giúp tất cả mọi người.


2
Cảm ơn, đó là rất dễ dàng hơn để sử dụng [mergetool "meld"] cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"trong ~/.gitconfig, sau đó chỉ cần giải quyết những mâu thuẫn đánh dấu màu đỏ trong chảo trung và tiết kiệm! Nó phải là cài đặt mặc định.
KrisWebDev 28/03/2016

1
$LOCAL $MERGED $REMOTElà cài đặt tôi sử dụng hầu hết thời gian, khi chỉ có một vài xung đột để giải quyết nó là tuyệt vời và đó cũng là mặc định của tôi. $LOCAL $BASE $REMOTEthực sự trở nên độc đáo khi có rất nhiều việc phải làm và bạn biết chính xác phần mã nào đến từ tệp nào; tổ tiên cam kết được chia sẻ có thể là một điểm khởi đầu miễn phí lộn xộn tuyệt vời, đôi khi việc làm nổi bật xung đột thực sự cản trở và một cơ sở sạch hơn là một phước lành.
mattst 28/03/2016

4
Lưu ý: Nếu bạn đang dùng OSX và đã cài đặt meld thông qua homebrew, tham số đầu ra sẽ yêu cầu =như sau:cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output="$MERGED"
Alteisen

2
Đối với người dùng Mac đã cài đặt dmg và thấy rằng 'meld' không có trong con đường của mình, hãy chắc chắn để làm theo các bộ luân phiên của hướng dẫn tại đây: yousseb.github.io/meld
KC Baltz

3
Điều đó tốt hơn nhiều so với lời giải thích tại Cấu hình Git - git mergetool . Cảm ơn bạn rất nhiều đặc biệt là đã giải thích sự khác biệt giữa $ MERGED và $ BASE. Cứu tôi khỏi phát điên!
ChrisG

81

Mặc dù câu trả lời khác là chính xác, đây là cách nhanh nhất để tiếp tục và định cấu hình Meld làm công cụ tìm khác biệt trực quan của bạn. Chỉ cần sao chép / dán này:

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

Bây giờ chạy git difftooltrong một thư mục và Meld sẽ được khởi chạy cho mỗi tệp khác nhau.

Lưu ý bên lề: Meld chậm một cách đáng ngạc nhiên khi so sánh các tệp CSV và không có công cụ tìm khác biệt Linux nào tôi tìm thấy nhanh hơn công cụ Windows này có tên là So sánh! (cập nhật lần cuối năm 2010).


13
Bạn có thể muốn một git config --global difftool.meld.cmd 'meld "$LOCAL" "$REMOTE"'dòng trong đó quá. Đây là "mặc định", nhưng ngay khi bạn định cấu hình a mergetool, difftoolnó sẽ bắt đầu sử dụng cấu hình mergetool làm mặc định nếu không tìm thấy cấu hình diff. Vì hợp nhất thường được cấu hình để chuyển ba tệp cho hợp nhất 3 chiều, điều đó có nghĩa là cửa sổ tìm meld khác biệt của bạn sẽ đột nhiên có ba khung không có ý nghĩa gì.
BeeOnRope

Tại sao không kiểm tra cấu hình, sau khi được đặt với $ git config -l
agfe2

56

Đối với Windows . Chạy các lệnh này trong 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

(Cập nhật đường dẫn tệp cho Meld.exe nếu của bạn khác.)

Đối với Linux . Chạy các lệnh này trong 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

Bạn có thể xác minh đường dẫn của Meld bằng lệnh này:

which meld

1
Tôi đã gặp lỗi khi chạy git Difftool "Công cụ tìm khác biệt không khả dụng dưới dạng 'D: \ software \ melddiff \ Meld.exe'"
Allen Vork

@ ALLenVork: Bạn đã xác nhận rằng Meld.exe có trong thư mục bạn đã chỉ định không? Bạn có thể chạy nó bên ngoài Git thành công? Git trở lại khi bạn chạy git config --global --get-regex diff*?
MarredCheese

Tôi đã giải quyết nó. Tôi thay đổi nó thành "D: /software/melddiff/Meld.exe" và nó hoạt động. Định dạng của .gitconfig là ubfox không phải windows.
Allen Vork

Không nên là : git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"?
Jonathan Rosenne

@ ALLenVork, bạn đang sử dụng git cho cygwin?
Adrian

25

Tôi thích thiết lập meld như một lệnh riêng biệt, như vậy:

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

Điều này làm cho nó tương tự như tập lệnh git-meld.pl ở đây: https://github.com/wmanley/git-meld

Bạn có thể chạy

git meld

Tôi vừa mới làm việc với Cygwin, và giờ nó đã tan vỡ. Điều này đã sửa nó. Cảm ơn! (Mặc dù tôi đã xóa --dir-diffphần này theo sở thích cá nhân.)
PfunnyGuy

3

Đối với Windows 10, tôi phải đặt cái này trong .gitconfig:

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

Tất cả mọi thứ khác bạn cần biết được viết trong siêu câu trả lời này bởi mattst ở trên.

PS: Vì một số lý do, điều này chỉ hoạt động với Meld 3.18.x, Meld 3.20.x cho tôi một lỗi.


1

Đây là một câu trả lời nhắm mục tiêu chủ yếu là các nhà phát triển sử dụng Windows, vì cú pháp đường dẫn của công cụ tìm khác với các nền tảng khác.

Tôi sử dụng Kdiff3 làm git mergetool, nhưng để thiết lập git Difftool là Meld, trước tiên tôi đã cài đặt phiên bản mới nhất của Meld từ Meldmerge.org sau đó thêm phần sau vào .gitconfig toàn cầu của tôi bằng cách sử dụng:

git config --global -e

Lưu ý, nếu bạn muốn sử dụng Sublime Text 3 thay vì Vim mặc định làm ditor lõi, bạn có thể thêm phần này vào tệp .gitconfig:

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

Sau đó, bạn thêm inn Meld là 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

Lưu ý dấu gạch chéo hàng đầu trong cmd ở trên, trên Windows là cần thiết.

Cũng có thể thiết lập bí danh để hiển thị git diff hiện tại với --dir-diff tùy chọn . Điều này sẽ liệt kê các tệp đã thay đổi bên trong Meld, rất tiện lợi khi bạn đã thay đổi nhiều tệp (thực sự là một kịch bản rất phổ biến).

Bí danh trông như thế này trong tệp .gitconfig, bên dưới phần [bí danh] :

showchanges = difftool --dir-diff

Để hiển thị các thay đổi tôi đã thực hiện cho mã, sau đó chỉ cần nhập lệnh sau:

git showchanges

Hình ảnh sau đây cho thấy tùy chọn --dir-diff này có thể hiển thị danh sách các tệp đã thay đổi (ví dụ): Meld hiển thị danh sách các tệp có thay đổi giữa $ LOCAL và $ REMOTE

Sau đó, có thể nhấp vào từng tệp và hiển thị các thay đổi bên trong Meld.


0

Có thể rất phức tạp khi tính toán một sự khác biệt trong đầu của bạn từ các phần khác nhau trong $ MERGED và áp dụng điều đó. Trong thiết lập của tôi, meld giúp bằng cách hiển thị cho bạn các khác biệt này bằng cách sử dụng:

[merge]
    tool = mymeld
    conflictstyle = diff3

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

Nó trông lạ nhưng cung cấp luồng công việc rất thuận tiện, sử dụng ba tab:

  1. trong tab 1 bạn thấy (từ trái sang phải) thay đổi mà bạn nên thực hiện trong tab 2 để giải quyết xung đột hợp nhất.

  2. ở bên phải của tab 2, bạn áp dụng "thay đổi mà bạn nên thực hiện" và sao chép toàn bộ nội dung tệp vào bảng tạm (sử dụng ctrl-a và ctrl-c).

  3. trong tab 3 thay thế bên phải bằng nội dung clipboard. Nếu mọi thứ đều chính xác, bây giờ bạn sẽ thấy - từ trái sang phải - cùng một thay đổi như được hiển thị trong tab 1 (nhưng với các bối cảnh khác nhau). Lưu các thay đổi được thực hiện trong tab này.

Ghi chú:

  • không chỉnh sửa bất cứ điều gì trong tab 1
  • không lưu bất cứ thứ gì trong tab 2 vì điều đó sẽ tạo ra các cửa sổ bật lên gây phiền nhiễu trong tab 3

Điều này có tốt hơn so với hợp nhất 3 chiều (cục bộ / cơ sở / từ xa) trong một tab không?
André Werlang

@ AndréWerlang Ưu điểm của hợp nhất 3 chiều trong một tab duy nhất là bạn chỉ cần xử lý các thay đổi xung đột (các thay đổi khác được hợp nhất tự động). Nhưng tôi thích cách tiếp cận "của tôi" hơn trong trường hợp khó hiểu trong cách hợp nhất 3 chiều đã thay đổi và cách hợp nhất theo cách bảo tồn tất cả các thay đổi. Nếu tại một thời điểm nào đó, hợp nhất 3 chiều không còn làm tôi bối rối thì tôi có thể chuyển lại cho nó.
mnieber

Như người dùng đã chỉ ra, bạn có thể sử dụng $BASEthay vì $MERGEDbắt đầu hoạt động hợp nhất
André Werlang
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.