git visual diff giữa các nhánh


196

Câu trả lời này rất tuyệt khi thấy một khác biệt trực quan giữa hai tệp được kiểm tra vào git: Làm cách nào để tôi xem đầu ra 'git diff' với chương trình tìm khác biệt trực quan?

Tuy nhiên, tôi muốn thấy một sự khác biệt thị giác giữa hai nhánh. Cho đến nay, đặt cược tốt nhất của tôi dường như là:

git diff --name-status master dev

mà không phải là rất nhiều thông tin và không trực quan.

Có điều gì tốt hơn ngoài đó?


Tôi đã thêm một câu trả lời dưới đây bao gồm một hình ảnh mà trước đây chưa được giải quyết ở đây: làm thế nào để xem các nhánh nào chứa các nhánh (cho dù là chung hay duy nhất). Có rất nhiều thứ bạn có thể làm với chức năng git cốt lõi. Có thể là tốt để xác định những gì bạn muốn bao gồm trong khác biệt hình ảnh của bạn. Hầu hết các câu trả lời tập trung vào sự khác biệt giữa các dòng, trong đó ví dụ của bạn tập trung vào tên của các tệp bị ảnh hưởng trong một cam kết nhất định.
Kay V

Câu trả lời:


227

Sử dụng git diffvới một phạm vi .

git diff branch1..branch2

Điều này sẽ so sánh các mẹo của từng chi nhánh.

Nếu bạn thực sự muốn một số phần mềm GUI, bạn có thể thử một cái gì đó như SourceTree hỗ trợ Mac OS X và Windows.


27
Đó không phải là doe trực quan. ;)
thủy quân lục chiến

35
Trong các hệ thống Linux Tôi khuyên bạn nên cài đặt Meld, sau đó thiết lập nó như là mặc định difftoolvới git config --global diff.tool meldvà cuối cùng là khởi động nó thay vì đơn giản diffvới git difftool branch1..branch2. Kết quả là nhìn đẹp hơn nhiều.
Gabriel

8
sử dụng Meld visualftft mà không có git config:git difftool -t meld branch1..branch2
user3780389

2
Đối với độc giả: Theo bài đăng của tôi, mỗi câu trả lời ở đây đưa ra một cách để làm những gì người đó yêu cầu (một khác biệt trong GUI) ngoại trừ câu trả lời này.
G Huxley

3
@GHuxley OP yêu cầu giải pháp GUI ở đâu?
alex

97

Để thấy sự khác biệt trực quan của tất cả các khác biệt giữa hai nhánh, tôi muốn hợp nhất hai nhánh - KHÔNG cam kết hợp nhất - và sau đó sử dụng git guihoặc git Tiện ích mở rộng để có cái nhìn tổng quan về sự khác biệt.

Dòng lệnh Git để hợp nhất mà không cam kết:

chi nhánh kiểm tra gitA
hợp nhất git --no-commit --no-ff chi nhánhB

Sau đó, khi hoàn thành, bạn có thể hoàn tác hợp nhất với

hợp nhất git --abort

(h / t gửi tới @ jcugat để nhận xét)


10
Đừng đánh giá thấp mức độ phù hợp của phương pháp này nếu bạn muốn sử dụng IDE của mình (hoặc không phải lúc nào cũng dễ tích hợp với GUI khác nhau của Git)! Tùy chọn này là tuyệt vời đối với tôi, vì tôi sử dụng Intellij và cực kỳ thích có thể quay vòng qua các tệp đã sửa đổi trong IDE, trong tất cả các vinh quang được tô sáng bằng cú pháp, tô sáng lỗi, được tô sáng mã, có thể chỉnh sửa tại chỗ. Tôi sử dụng phương pháp này cho tất cả các đánh giá mã của mình và tôi đã bỏ lại công cụ so sánh yêu cầu kéo sâu trong GitHub. Tôi thậm chí có thể chỉnh sửa khi tôi thực hiện và khi hoàn thành, tôi chỉ cần tạo một chi nhánh mới với "-code-review" được nối và cam kết!
kghastie

2
Nó hoạt động miễn là không có xung đột hợp nhất và thất bại khi có bất kỳ xung đột hợp nhất nào.
Naga Kiran

1
Tôi thích cách tiếp cận đó rất nhiều! Ngoài ra, ít nhất là đối với tôi trong git guiđó cho thấy các xung đột là không được dàn dựng, các xung đột không được dàn dựng, do đó bạn có được sự phân biệt tốt ngay cả. Giúp tôi nhiều hơn so với câu trả lời được xếp hạng hàng đầu: D
DJGummikuh

55

Trong trường hợp bạn đang sử dụng Intellij Idea IDE, bạn chỉ có thể sử dụng tùy chọn so sánh trong nhánh.

nhập mô tả hình ảnh ở đây


Có bất kỳ cấu hình / tùy chọn / cài đặt để sửa đổi so sánh này? (như --ignore-space-at-eol cho git diff)
Superole

49

Bạn cũng có thể làm điều này dễ dàng với gitk.

> gitk branch1 branch2

Đầu tiên bấm vào đầu của nhánh1. Bây giờ, nhấp chuột phải vào đầu nhánh 2 và chọn Diff this-> được chọn.


7
Sử dụng gitk branch1..branch2chỉ hiển thị các cam kết giữa hai phiên bản.
T3rm1

sử dụng gitk (không có nhánh1 nhánh2) nếu bạn muốn xem tất cả các thay đổi bạn đã thực hiện trong nhánh của mình.
mikewasmike

31

Đối với những người bạn trên Windows sử dụng TortoiseGit, bạn có thể có được một so sánh trực quan thông qua tính năng khá tối nghĩa này:

  1. Điều hướng đến thư mục bạn muốn so sánh
  2. Nhấn shiftvà giữ chuột phải
  3. Truy cập TortoiseGit -> Duyệt tham khảo
  4. Sử dụng ctrlđể chọn hai nhánh để so sánh
  5. Nhấp chuột phải vào lựa chọn của bạn và nhấp vào "So sánh các giới thiệu đã chọn"

Nguồn: http://wikgren.fi/compare-diff-branches-in-tortoir-git-or-how-to-preview-changes-b Before-doing-a-imge /


Tại sao bạn nên giữ sự thay đổi?
Zero3

1
Giữ phím shift trong khi nhấp chuột phải luôn hiển thị menu TortoiseGit đầy đủ, trong trường hợp bạn đã cấu hình TortoiseGit không hiển thị một số mục nhất định.
Nghiên cứu

Điều này thật tuyệt. Chúc nó là một tính năng nổi bật hơn.
vẽ

22

Nếu bạn đang sử dụng OSX hoặc Windows 7+, Atlassian SourceTree hoạt động rất tốt cho việc này. Nó là miễn phí.

Bạn có thể thấy các thay đổi theo giai đoạn trong thiết lập khác biệt bên cạnh và bạn dễ dàng so sánh cục bộ với điều khiển từ xa và hai nhánh khác. Khi nhiều tệp được chọn, diff hiển thị như bên dưới:

nhập mô tả hình ảnh ở đây

Giả sử bạn đã kiểm tra một nhánh tính năng và bạn muốn xem khác biệt so với 'chủ', nhấp chuột phải vào nhánh 'chính' và chọn "Khác với hiện tại"

Thật không may, có vẻ như nó sẽ không khả dụng trên các bản phân phối * nix sớm .


3
Nó có thể là 'miễn phí' nhưng chắc chắn cần một chút thời gian để đọc đăng ký Điều khoản sử dụng của họ: atlassian.com/legal/customer-agribution Tôi cho đến nay vẫn thích công cụ này, nhưng điều này có thể đẩy tôi ra.
akauppi

@akauppi Bộ phận nào đưa bạn ra? Tôi nghĩ tất cả các thỏa thuận đó khá giống nhau
alex

Chuyện đó cách đây đã một năm rồi. Vâng, các thỏa thuận có thể tương tự nhưng đó là quá trình mà SourceTree đang thúc đẩy tôi vượt qua. Thật là kỳ lạ. Quá khứ, mặc dù. Tôi sẽ không có thông tin chi tiết cho bạn. Xin lỗi
akauppi

16

Hãy thử "Difftool" (giả sử bạn có thiết lập công cụ tìm khác biệt) - xem https://www.kernel.org/pub/software/scm/git/docs/git-difftool.html

Tôi thấy trạng thái tên tốt cho tóm tắt nhưng Difftool sẽ lặp lại các thay đổi (và -dtùy chọn cung cấp cho bạn chế độ xem thư mục), ví dụ:

$ git difftool their-branch my-branch

Viewing: 'file1.txt'
Launch 'bc3' [Y/n]:
...

Hoặc như @ rsilva4 được đề cập -dvà mặc định cho chi nhánh hiện tại của bạn, nó chỉ là - ví dụ so sánh với chủ:

$  git difftool -d master..

... và có - có nhiều biến thể - https://www.kernel.org/pub/software/scm/git/docs/git-reset.html


3
Cảm ơn bạn, điều này rất hữu ích. Thêm tùy chọn -d sẽ giúp mọi thứ trở nên tốt hơn:git difftool -d their-abc my-abc
rsilva4

-d --dir-diff: Copy the modified files to a temporary location and perform a directory diff on them. This mode never prompts before launching the diff tool.
Explshell.com

8

Nếu bạn đang sử dụng github, bạn có thể sử dụng trang web này:

github.com/url/to/your/repo/compare/SHA_of_tip_of_one_branch...SHA_of_tip_of_another_branch

Điều đó sẽ cho bạn thấy một so sánh của hai.


Điều này hoạt động (tôi làm điều đó mọi lúc) nhưng nó yêu cầu bạn phải đẩy mã của mình đến repo github. Tuy nhiên, đó không thực sự là một cảnh báo có thể chấp nhận được.
adamwong246

2
hoặc chỉ github.com/url/to/your/repo/compare/và sau đó bạn có thể chọn các chi nhánh
caramba

Và làm thế nào để tôi có được SHA đó? Ý tôi là, SHA của đỉnh của một nhánh có nghĩa là gì?
Optimus Prime

8

Trong GitExtensions, bạn có thể chọn cả hai nhánh trong lưới sửa đổi bằng cách Ctrlnhấn. Sau đó, bạn có thể thấy các tập tin khác nhau giữa các chi nhánh. Khi bạn chọn một tập tin, bạn sẽ thấy khác cho nó.

Lấy từ đây


Tôi đã chọn 2 nhánh trong lưới sửa đổi của mình, nhưng tôi không thấy bất kỳ lệnh so sánh nào trong menu ở trên cùng hoặc khi tôi nhấp chuột phải.
Eric

1
Tôi tìm thấy nó trong các tiêu đề của khung dưới cùng. Có Cam kết, Cây tệp và Khác biệt.
Eric

7

CẬP NHẬT

Mac: Bây giờ tôi sử dụng SourceTree. Đề nghị kỹ lưỡng. Tôi đặc biệt thích cách bạn có thể tạo ra sân khấu / người ngoài sân khấu.

Linux: Tôi đã thành công với:

  • thông minh
  • GitKraken
  • meld

Ví dụ: để cài đặt smartgittrên Ubuntu:


Đây là công việc:

git-diffall với một công cụ tìm khác biệt GUI như meld. Xem điểm 5 tại đây:

http://rubyglazed.com/post/15772234418/git-ify-your-command-line

Có một bài viết hay về git và meld ở đây: http://nathanhoad.net/how-to-meld-for-git-diffs-in-ubfox-hardy


4

Nếu bạn sử dụng Eclipse, bạn có thể so sánh trực quan nhánh hiện tại của mình trên không gian làm việc với thẻ / nhánh khác:

So sánh không gian làm việc của Eclipse


Cá nhân tôi thấy sự hỗ trợ của Eclipse để phân biệt mệnh giá phụ, nhưng nếu đó là tất cả những gì bạn có thì nó vẫn ổn.
ysap

4

Bạn cũng có thể sử dụng P4Merge miễn phí từ Perforce để thực hiện việc này:

http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools

nhập mô tả hình ảnh ở đây

Chi tiết về việc tích hợp nó với Git có thể được tìm thấy ở đâyđây

nhưng một bản tóm tắt nhanh chóng từ các liên kết trên là:

  • Đặt các bit sau vào ~ / .gitconfig, sau đó bạn có thể làm $ git mergetool$ git difftoolsử dụng p4merge
  • Lưu ý rằng $ git diffvẫn sẽ chỉ sử dụng trình xem khác biệt nội tuyến mặc định :) (đã thử nghiệm với phiên bản git 1.8.2)

Thay đổi cho .gitconfig

[merge]
  keepBackup = false
    tool = p4merge
[mergetool "p4merge"]
    cmd = /Applications/p4merge.app/Contents/Resources/launchp4merge "\"$PWD/$BASE\"" "\"$PWD/$REMOTE\"" "\"$PWD/$LOCAL\"" "\"$PWD/$MERGED\""
    keepTemporaries = false
    trustExitCode = false
    keepBackup = false
[diff]
    tool = p4merge
[difftool "p4merge"]
    cmd = /Applications/p4merge.app/Contents/Resources/launchp4merge "\"$REMOTE\"" "\"$LOCAL\""

2

Nếu bạn sử dụng trình soạn thảo WebStorm tuyệt vời, bạn có thể so sánh với bất kỳ chi nhánh nào bạn muốn: Webstorm git so sánh


Trên thực tế, tôi chỉ nhận thấy IntelliJ IDEA (có lẽ cũng là WebStorm) có khả năng "Đánh dấu các cam kết không được chọn", điều này cho thấy rất rõ các cam kết tồn tại trong chi nhánh chứ không phải là một cam kết khác.
arthurakay

Vâng, tôi vừa sử dụng intellij để chọn lọc vô số thay đổi được thực hiện trên một repo bằng cách "tự động định dạng lưu". Rất dễ dàng ... Phải tìm tùy chọn "So sánh trước với địa phương" để làm điều đó
Tom H

1

Có một cái nhìn git show-branch

Có rất nhiều thứ bạn có thể làm với chức năng git cốt lõi. Có thể là tốt để xác định những gì bạn muốn bao gồm trong khác biệt hình ảnh của bạn. Hầu hết các câu trả lời tập trung vào sự khác biệt giữa các dòng, trong đó ví dụ của bạn tập trung vào tên của các tệp bị ảnh hưởng trong một cam kết nhất định.

Một hình ảnh dường như không được giải quyết là làm thế nào để xem các cam kết mà các nhánh chứa (dù là chung hay duy nhất).

Đối với hình ảnh này, tôi là một fan hâm mộ lớn của git show-branch; nó phá vỡ một bảng cam kết được tổ chức tốt trên mỗi nhánh trở về tổ tiên chung. - để thử nó trên một repo có nhiều nhánh có phân kỳ, chỉ cần gõ git show-branchvà kiểm tra đầu ra - để biết cách viết với các ví dụ, xem So sánh các cam kết giữa các nhánh Git


0

Dưới đây là cách xem sự khác biệt trực quan giữa toàn bộ các cam kết, trái ngược với các tệp đơn lẻ, trong Visual Studio (được thử nghiệm trong VS 2017). Thật không may, nó chỉ hoạt động cho các cam kết trong một nhánh: Trong "Team Explorer", chọn chế độ xem "Chi nhánh", nhấp chuột phải vào repo và chọn "Xem lịch sử" như trong hình ảnh sau.

nhập mô tả hình ảnh ở đây

Sau đó, lịch sử của chi nhánh hiện tại xuất hiện trong khu vực chính. (Trường hợp các nhánh kết thúc như các cam kết trước đó trên nhánh hiện tại được đánh dấu bằng nhãn.) Bây giờ chọn một vài cam kết bằng Ctrl-Left, sau đó nhấp chuột phải và chọn "So sánh các cam kết ..." từ menu bật lên.

Để biết thêm về so sánh các nhánh trong thế giới Microsoft, hãy xem câu hỏi stackoverflow này: Sự khác biệt giữa các nhánh git bằng Visual Studio .


1
Chỉ hiển thị lịch sử của một nhánh duy nhất, vì vậy không thể so sánh giữa các nhánh.
Michał Fita

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.