Xem sự khác biệt của các chi nhánh với meld?


159

Tôi biết rằng tôi có thể xem sự khác biệt giữa CHÍNH và trạng thái hiện tại với meld .. Nhưng làm thế nào tôi có thể xem sự khác biệt giữa các chi nhánh, ví dụ masterdevelvới meld?

Hiện tại tôi làm các bước sau:

  1. Đổi tên thư mục của bản sao làm việc
    chẳng hạn mv /projectA /projectA_master)
  2. Nhân bản dự án một lần nữa
    git clone url
  3. Chuyển sang develchi nhánh
    cd projectA && git -b devel origin/devel
  4. Xem sự khác biệt với meld
    meld /projectA_Master projectA

Không có cách nào dễ dàng hơn để có được kết quả tương tự trong meld? Tôi chỉ cần nó để xem xét các thay đổi và không phải chủ yếu để hợp nhất.


Điều này có trả lời câu hỏi của bạn không? Thiết lập và sử dụng Meld làm git Difftool và mergetool của bạn
evan.bovie

Câu trả lời:


55

Tôi cũng thấy vấn đề này gây phiền nhiễu vì vậy tôi đã tạo ra git meld cho phép một cách thoải mái hơn để phân biệt các cam kết tùy ý đối với cây làm việc hoặc khu vực tổ chức. Bạn có thể tìm thấy nó tại https://github.com/wmanley/git-meld . Nó hơi giống kịch bản của Mark nhưng hoạt động để so sánh bất kỳ cam kết tùy ý hoặc khu vực tổ chức hoặc thư mục làm việc với bất kỳ ai khác. Nếu một trong những điều bạn đang so sánh là cây làm việc thì đó cũng là đọc-ghi để bạn không mất đi những thay đổi của mình.


1
Công cụ tuyệt vời, Will. Cảm ơn! Đề nghị triệt để ... bây giờ nếu chỉ có nó cũng hoạt động trên sự hợp nhất.
Dipstick

TYVM cho một công cụ tuyệt vời - (nhắc nhở tự thêm vào bí danh)
kfmfe04

26
Trích dẫn Will, từ kho lưu trữ github hit: "LƯU Ý: git-meld đã lỗi thời kể từ khi git Difftool học tùy chọn --dir-diff trong git 1.7.11."
oluc

318

Ngắn & ngọt ngào:

git config --global diff.tool meld

Điều này cấu hình Git để sử dụng meldnhư công cụ tìm khác biệt. (Bạn không cần chỉ định các đối số dòng lệnh, hỗ trợ meldđược tích hợp trong Git.)

Sau đó, nếu bạn muốn một khác biệt đồ họa thay vì văn bản, bạn chỉ cần gọi git difftoolthay vì git diff(cả hai đều có cùng một đối số). Trong trường hợp của bạn:

git difftool master..devel

Cập nhật: Nếu bạn không muốn khác biệt một tệp một lần, nhưng thay vào đó muốn sử dụng chế độ xem "thư mục con" của meld với tất cả các thay đổi giữa hai nhánh, hãy lưu ý -dhoặc --dir-difftùy chọn cho git difftool. Ví dụ: khi tôi ở nhánh XYZ và tôi muốn xem có gì khác biệt giữa nhánh này và nhánh ABC, tôi chạy cái này:

git difftool -d ABC

3
đó không phải là những gì tôi đang tìm kiếm. Nó cho tôi thấy các tập tin khác nhau theo tập tin. Tôi đã lưu trữ rằng với một tập lệnh diff.py và 'git diff master..devel' trước đó. Tôi muốn xem tất cả các khác biệt và cây thư mục là 'meld thư mụcA / thư mụcB /' hiện.
Marten Bauer

Marten, đó là cách git làm việc. Nó chỉ theo dõi tệp, vì vậy bạn chỉ có thể thấy tệp khác biệt theo tệp. Trong git, bạn không thể cam kết một thư mục trống một mình. Bất kỳ lý do cụ thể bạn muốn hiển thị khác nhau giữa dir?
Donny Kurnia

@DonnyKurnia: Tôi phải mất một chút để tìm hiểu xem OP đang cố gắng làm gì: Meld có một giao diện người dùng riêng để xem tất cả các thay đổi trong một thư mục. Bạn có thể lọc xem các tệp dựa trên nếu chúng giống nhau, đã thay đổi, mới. OP muốn sử dụng giao diện người dùng đó để hiển thị các thay đổi. (Điều này cho phép bạn xem danh sách tất cả các thay đổi và chọn những thay đổi bạn muốn khác.) Vì vậy, đây không phải là so sánh giữa các thư mục, mà là so sánh giữa các cam kết nhưng được xem như một toàn thể.
idbrii

17
@MartenBauer Tôi nghĩ đây là những gì bạn muốn: git Difftool --dir-diff master devel
Stéphane

3
Điều này có thể được thực hiện để nhánh hiện tại không nằm trong thư mục tmp và do đó cho phép chỉnh sửa không?
ngày

100

Bắt đầu với git v1.7.11, bạn có thể sử dụng git difftool --dir-diffđể thực hiện một thư mục diff. Hoạt động khá tốt với meld wihout https://github.com/wmanley/git-meld script.

Cấu hình git

git config --global diff.tool meld

Sử dụng nó

git difftool -d topic             // -d is --dir-diff
git difftool -d master..topic

Đối với macOS

brew cask install meld
git config --global difftool.meld.cmd 'open -W -a Meld --args \"$LOCAL\" \"$PWD/$REMOTE\"'
git config --global difftool.meld.trustExitCode true

2
Tôi nghĩ rằng đây thực sự là những gì OP muốn. Lưu ý tùy chọn -g để sử dụng công cụ hướng dẫn và tùy chọn -d để sử dụng --dir-diff. Điều này là tốt để làm đánh giá mã. Nit: tùy chọn Difftool.prompt không bắt buộc khi chỉ định -d, ít nhất là cho Git 1.8.
Michael Percy

1
Thật đáng kinh ngạc. Chính xác những gì tôi cần. Cảm ơn bạn!
Nicholas

5
Điều này có thể được thực hiện để nhánh hiện tại không nằm trong thư mục tmp và do đó cho phép chỉnh sửa không?
zb ngày

2
Tôi cũng đánh giá cao câu trả lời cho câu hỏi @zkent ... :(
tavlima 13/03 '

3
@zkent @tavlima: Lệnh này, đã cho phép chỉnh sửa trên phiên bản hiện tại của bạn. Ngay cả khi bạn thấy một bộ giải mã tmp thành meld, nếu bạn lưu - Ctrl+s- phần bên phải, tệp của bạn đã được sửa đổi.
Benjamin

13

Điều quan trọng là phải nói rằng sử dụng git difftool -dbạn vẫn có thể chỉnh sửa các tệp làm việc của mình trong Meld và lưu chúng . Để đạt được điều đó, bạn cần so sánh một số nhánh với cây làm việc hiện tại của mình, ví dụ:

git difftool -d branchname

Meld sẽ hiển thị rằng cả thư mục bên trái và bên phải đều nằm trong / tmp. Tuy nhiên, các tệp trong thư mục bên phải thực sự là các liên kết tượng trưng đến các tệp của bạn trong thư mục làm việc hiện tại (không áp dụng cho Windows). Vì vậy, bạn có thể chỉnh sửa chúng ngay trong Meld và khi bạn lưu chúng, các thay đổi của bạn sẽ được lưu trong thư mục làm việc của bạn.

Tuy nhiên, tùy chọn thú vị hơn là so sánh thư mục làm việc hiện tại với stash. Bạn có thể làm điều đó bằng cách chỉ cần gõ:

git difftool -d stash

Sau đó, bạn có thể chuyển một số thay đổi từ stash (cửa sổ bên trái) sang bản sao làm việc hiện tại của bạn (cửa sổ bên phải), mà không sử dụng git stash pop/applyvà tránh giải quyết xung đột khó chịu có thể do lệnh này gây ra.

Tôi nghĩ rằng nó có thể tăng đáng kể quy trình làm việc với stash. Bạn có thể dần dần chuyển các thay đổi từ stash sang bản sao làm việc và cam kết từng cái một, giới thiệu một số thay đổi khác nếu bạn muốn.


Piotr, đây chính xác là những gì tôi đã cố gắng thực hiện, nhưng trong trường hợp của tôi (trên CentOS), không có liên kết tượng trưng nào được tạo ra. Có bất kỳ thiết lập cấu hình cần thiết, hoặc một phiên bản tối thiểu của meld hỗ trợ này không?
wrjohns 22/05/2015

Tôi nghĩ rằng Git chịu trách nhiệm tạo liên kết tượng trưng, ​​không phải Meld. Kiểm tra hướng dẫn của Git cho lệnh Difftool. Có lẽ bạn nên cập nhật nó lên phiên bản mới hơn?
Piotr Jurkiewicz

2
sao chép các tệp mới từ chi nhánh sang thư mục làm việc không hoạt động :(
pykiss

5

Mặc dù có vẻ như từ các câu trả lời khác như thể không có cách nào để thực hiện điều này trực tiếp trong kho git vào lúc này, nhưng thật dễ dàng (nhờ câu trả lời cho một câu hỏi khác :)) để viết một tập lệnh sẽ trích xuất cây của hai cam kết vào các thư mục tạm thời và chạy meld trên chúng, loại bỏ cả hai thư mục khi meld thoát:

http://gist.github.com/498628

Tất nhiên, tôi sẽ mất bất kỳ thay đổi nào được thực hiện thông qua meld, nhưng nó khá hay để có cái nhìn tổng quan nhanh về sự khác biệt, tôi nghĩ vậy.


3

Tôi nghĩ rằng một cách dễ dàng để làm điều này là sử dụng git reset --soft:

Mục tiêu: so sánh sự khác biệt giữa Branch_a và Branch_b với meld

git checkout branch_a
git checkout -b do_diff
git reset --soft branch_b
meld .

0

Trong git v1.7.9, bạn có thể so sánh hai lần xác nhận mà không cần dòng lệnh:

Bạn phải định cấu hình trong các tùy chọn chỉnh sửa 'git gui', toàn cục: "Sử dụng công cụ hợp nhất: meld".

Bắt đầu gitk , chọn một cam kết, nhấp chuột phải vào một cam kết khác> " diff this -> đã chọn ". Trong 'patch', nhấp chuột phải vào một tệp> " diff diff ".

meld sẽ bắt đầu và hiển thị vẫn được chọn, cam kết đầu tiên ở phía bên phải.


0

Đối với Meld trên macOS, hãy thêm phần này vào ~/.gitconfigkhuyến nghị của bạn bởi người duy trì ứng dụng macOS, yousseb :

[diff]
  tool = meld
[difftool]
  prompt = false
[difftool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args \"$LOCAL\" \"$REMOTE\"
[merge]
  tool = meld
[mergetool]
  prompt = false
[mergetool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args --auto-merge \"$LOCAL\" \"$BASE\" \"$REMOTE\" --output=\"$MERGED\"

Bạn có thể bỏ qua các cấu hình mergenếu bạn muốn.

Câu trả lời của @ GutenYe không phù hợp với tôi do tự động thoát và / hoặc một cái gì đó với zsh.

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.