Hiển thị tập tin nào đã thay đổi giữa hai phiên bản


2105

Tôi muốn hợp nhất hai nhánh đã được tách ra một lúc và muốn biết tập tin nào đã được sửa đổi.

Đến qua liên kết này: http://linux.yyz.us/git-howto.html khá hữu ích.

Các công cụ để so sánh các chi nhánh tôi đi qua là:

  • git diff master..branch
  • git log master..branch
  • git shortlog master..branch

Đã tự hỏi nếu có một cái gì đó như "git status master..branch" để chỉ xem những tệp khác nhau giữa hai nhánh.

Nếu không tạo một công cụ mới, tôi nghĩ đây là công cụ gần nhất bạn có thể làm điều đó ngay bây giờ (tất nhiên sẽ hiển thị lặp lại nếu một tệp được sửa đổi nhiều lần):

  • git diff master..branch | grep "^diff"

Đang tự hỏi liệu có điều gì tôi đã bỏ lỡ ...


12
Có bao nhiêu người khác tìm thấy tiêu đề của câu hỏi này gây hiểu nhầm? Nó thực sự là về việc tìm sự khác biệt tập tin giữa hai chi nhánh. Những gì tôi đến đây tìm kiếm là làm thế nào để thấy sự khác biệt tập tin giữa hai phiên bản trên cùng một chi nhánh. Hay tôi là người duy nhất?
Sandeepan Nath

4
@SandeepanNath: với git không có sự khác biệt. Bạn LUÔN LUÔN đề cập đến các cam kết cá nhân.
Samuel O'Malley

@ SamuelO'Malley Tôi mới sử dụng git và xem xét chiến lược phân nhánh dường như phổ biến trong đó tất cả các nhánh cuối cùng được sáp nhập vào nhánh chính và cuối cùng là chủ được triển khai. Bây giờ, xem xét sự kiện của buổi giới thiệu, nơi sản xuất đã thành chủ, nhưng đằng sau tiền boa (bởi một lần sửa đổi nếu lần giới thiệu cuối cùng xảy ra sau lần hợp nhất chính cuối cùng), tôi muốn thấy sự khác biệt giữa hai phiên bản này, tìm hiểu những gì sẽ được triển khai Tôi không muốn nhìn vào chi nhánh được sáp nhập lần cuối. Đúng nếu tôi đã sai lầm.
Sandeepan Nath

2
@SandeepanNath: thay vì sử dụng tên chi nhánh thì bạn có thể lấy câu trả lời bên dưới và chỉ cần xác định ID cam kết thay thế. Hoặc thậm chí giới thiệu các cam kết theo tên thẻ của họ nếu bạn tạo thẻ khi triển khai.
Samuel O'Malley

1
@SandeepanNath Bạn không thể so sánh 2 chi nhánh, bạn phải chỉ định sửa đổi. Vì vậy, so sánh 2 chi nhánh là so sánh 2 phiên bản.
Bastien Vandamme

Câu trả lời:


2575

Để so sánh chi nhánh hiện tại với masterchi nhánh:

$ git diff --name-status master

Để so sánh bất kỳ hai nhánh:

$ git diff --name-status firstbranch..yourBranchName

Đọc git difftrong tài liệu chính thức .


2
Mỗi chỉ số ở phía bên tay trái nghĩa là gì (tôi thấy rất nhiều chữ M và D)?
gogogadgeti Internet

15
@ user446936 - bạn có thể thấy ý nghĩa của các chữ cái trong trang man status git @ kernel.org/pub/software/scm/git/docs/git-status.html - đặc biệt, M == đã sửa đổi, D == đã xóa
James Manning

12
git diff --name-status your_branch...masterđưa ra các thay đổi xảy ra trên master kể từ your_branch được tạo từ nó
Radu

1
Toán tử hai chấm là không cần thiết, ở đây, bởi vì diffs là cặp đôi.
jub0bs

2
Tôi nhận được sửa đổi không xác định hoặc đường dẫn không trong cây làm việc.
SuperUberDuper

408

Thử

$ git diff --stat --color master..branchName

Điều này sẽ cung cấp cho bạn thêm thông tin về mỗi thay đổi, trong khi vẫn sử dụng cùng một số dòng.

Bạn cũng có thể lật các nhánh để có được một bức tranh rõ ràng hơn về sự khác biệt nếu bạn hợp nhất theo cách khác:

$ git diff --stat --color branchName..master

77
Nếu bạn đã bật (rất khuyến khích, imho) màu git đã bật ( config --global color.ui true), bạn có thể bỏ qua --color. (Tôi có lks - hội chứng bàn phím lười biếng.)
Art Swri

25
Tôi với bạn về màu sắc! BTW tôi muốn nói git config --global color.ui true- phải hoàn thành.
Nghệ thuật Swri

2
Không hoạt động, ném lỗi:fatal: ambiguous argument 'master..branchName': unknown revision or path not in the working tree.
Tomáš Zato - Phục hồi Monica

7
@ TomášZato xin lỗi nhưng bạn cần hoán đổi "BranchName" với tên chi nhánh của bạn.
Gerry

161

Cũng nên nhớ rằng git có phân nhánh rẻ và dễ dàng. Nếu tôi nghĩ việc hợp nhất có thể có vấn đề thì tôi tạo một nhánh để hợp nhất. Vì vậy, nếu mastercó những thay đổi tôi muốn hợp nhất và balà chi nhánh của tôi cần mã từ chủ, tôi có thể thực hiện như sau:

git checkout ba
git checkout -b ba-merge
git merge master
.... review new code and fix conflicts....
git commit
git checkout ba
git merge ba-merge
git branch -d ba-merge
git merge master

Kết quả cuối cùng là tôi phải thử hợp nhất trên một nhánh ném trước khi bắt vít với nhánh của mình. Nếu tôi bị rối, tôi có thể xóa ba-mergechi nhánh và bắt đầu lại.


4
Tuyệt vời. Tôi chưa bao giờ nghĩ đến việc phân nhánh theo cách đó. Tôi nghĩ rằng điều này nên được coi là một phần của "thực tiễn tốt nhất" khi sáp nhập.
egelev

Khi bạn hợp nhất ba lô trở lại thành ba, không có khả năng phải khắc phục xung đột một lần nữa?
Josef.B

2
@EricAnderson Phải, đó là một biểu đồ. SVN dính như kẹo cao su dưới bàn học. cám ơn.
Josef.B

1
Tại sao bạn cần thực hiện bước cuối cùng 'git merge master' nếu ba-merge đã có chủ
qwebek

Bạn có thể bỏ nó đi. Lý do duy nhất nó sẽ hữu ích là nếu công cụ mới hạ cánh trong masterkhi bạn đang xem xét mã và khắc phục xung đột.
Eric Anderson

58

Nếu bất cứ ai đang cố gắng tạo một tệp khác từ hai nhánh:

git diff master..otherbranch > myDiffFile.diff

2
Điều này đã có ích đặc biệt là với các chi nhánh lớn chứa rất nhiều sự khác biệt.
vandsh

Điều này rất hữu ích khi sự khác biệt thực sự lớn. Theo mặc định, nó sẽ không hiển thị tất cả diff trong bảng điều khiển (tôi đã tự hỏi tại sao), chuyển diff cho một tệp là cách để đi trong trường hợp như vậy.
rotimi-tốt nhất

42

Ngoài ra còn có một phương pháp dựa trên GUI.

Bạn có thể sử dụng gitk .

  1. Chạy:

    $ gitk --all
    
  2. Nhấp chuột phải vào một cam kết của một chi nhánh và chọn Đánh dấu cam kết này trong menu bật lên.

  3. Nhấp chuột phải vào một cam kết của một chi nhánh khác và chọn Diff this -> cam kết được đánh dấu hoặc cam kết được đánh dấu khác -> này .

Sau đó, sẽ có một danh sách các tập tin thay đổi trong bảng dưới cùng bên phải và chi tiết khác ở bảng dưới cùng bên trái.


3
@Orwellophile Tôi tải lên một video để cho biết cách thực hiện. Tôi hy vọng nó sẽ giúp bạn.
Yantao Xie

Wow, chỉ cho tôi, tôi cảm thấy đặc biệt. Tôi đã đánh dấu nó trong Delicious.com để tham khảo trong tương lai và thêm google-foo.
Orwellophile

Câu trả lời bị đánh giá thấp. Cảm ơn!
Koshinae

36

Thêm một lựa chọn, sử dụng meld trong trường hợp này:

git difftool -d master otherbranch

Điều này cho phép không chỉ thấy sự khác biệt giữa các tệp mà còn cung cấp một cách dễ dàng để trỏ và nhấp vào một tệp cụ thể.


6
Có thể muốn thiết lập meld như difftool mặc định: git config --global diff.tool meld
bwv549

1
Đây là mục yêu thích của tôi vì nó sẽ sử dụng bất kỳ thứ gì bạn định cấu hình.
Josiah

Không được hỗ trợ trên OSX. :-(
Mike S.

@MikeS. vui lòng kiểm tra câu trả lời này stackoverflow.com/a/12815806/151918 nó chứa hướng dẫn cho OSX. Nó làm việc cho tôi ít nhất, hy vọng nó sẽ giúp.
rsilva4

Đẹp. Nhưng -dlựa chọn cho là gì?
Scotty.NET

29

Lưu ý rằng git giúp bạn dễ dàng thử kết hợp và tránh xa mọi vấn đề nếu bạn không thích kết quả. Nó có thể dễ dàng hơn tìm kiếm các vấn đề tiềm năng trước.


10
David, đó là một điểm tốt, mặc dù thật tuyệt khi biết những gì đang diễn ra trước mắt ...
johannix

18

Và nếu bạn đang tìm kiếm thay đổi chỉ trong số (các) tệp nhất định, thì:

git diff branch1 branch2 -- myfile1.js myfile2.js

nhánh 1 là tùy chọn và nhánh hiện tại của bạn (nhánh bạn đang ở) sẽ được xem xét theo mặc định nếu nhánh1 không được cung cấp. ví dụ:

git diff master -- controller/index.js

15

Khi làm việc cộng tác hoặc trên nhiều tính năng cùng một lúc, thông thường là thượng nguồn hoặc thậm chí chủ của bạn chứa công việc không được bao gồm trong chi nhánh của bạn và sẽ xuất hiện không chính xác trong các khác biệt cơ bản.

Nếu thượng nguồn của bạn có thể đã di chuyển, bạn nên làm điều này:

git fetch
git diff origin/master...

Chỉ cần sử dụng git diff master có thể bao gồm hoặc không bao gồm các thay đổi có liên quan.



8

Có hai nhánh cho biết.

  • A (Chi nhánh mà bạn đang làm việc)
  • B (Một nhánh khác mà bạn muốn so sánh)

Ở trong nhánh A bạn có thể gõ

git diff --color B

sau đó điều này sẽ cung cấp cho bạn một đầu ra của

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

Điểm quan trọng về điều này là

  1. Văn bản màu xanh lá cây hiện diện trong Chi nhánh A

  2. Văn bản màu đỏ có mặt ở Chi nhánh B


8

Có rất nhiều câu trả lời ở đây, nhưng tôi muốn thêm một cái gì đó mà tôi thường sử dụng. NẾU bạn đang ở một trong những nhánh mà bạn muốn so sánh, tôi thường làm một trong những điều sau đây. Vì câu trả lời này, chúng tôi sẽ nói rằng chúng tôi đang ở trong nhánh thứ cấp. Tùy thuộc vào chế độ xem bạn cần tại thời điểm nào sẽ tùy thuộc vào chế độ bạn chọn, nhưng hầu hết thời gian tôi đang sử dụng tùy chọn thứ hai của hai chế độ. Tùy chọn đầu tiên có thể hữu ích nếu bạn đang cố gắng trở lại bản sao gốc - cả hai cách đều hoàn thành công việc!

Điều này sẽ so sánh chủ với nhánh mà chúng ta đang ở (là thứ yếu) và mã gốc sẽ là các dòng được thêm vào và mã mới sẽ được coi là các dòng bị loại bỏ

git diff ..master

HOẶC LÀ

Điều này cũng sẽ so sánh chủ với nhánh mà chúng ta đang ở (là thứ yếu) và mã gốc sẽ là các dòng cũ và mã mới sẽ là các dòng mới

git diff master..

1

Nếu bạn đang sử dụng Github / Github Enterprise, bạn có thể sử dụng Giao diện người dùng web bằng cách nhấn url /comparecủa đường dẫn kho lưu trữ của bạn, ví dụ: https://github.com/http4s/http4s/compare . Bạn có thể chọn nhánh / cam kết / thẻ mà bạn muốn so sánh: Github So sánh ảnh chụp màn hình

Và khác biệt sẽ được trình bày trong giao diện github tại url /compare/{x1}...{x2}nơi x2x1là nhánh / cam kết / thẻ bạn muốn so sánh, ví dụ: https://github.com/http4s/http4s/compare/release-0.18.x ...bậc thầy

Bạn có thể xem thêm trong Github Doc .


0

Đối với những người đang tìm kiếm một giải pháp GUI, Git Cola có một "Trình xem khác biệt nhánh ( Diff -> Chi nhánh .. ) rất đẹp" .


-1
git diff revision_n revision_m

nếu revision_nrevision_mlà các cam kết liên tiếp thì nó xuất ra giống như git show revision_m



-2

Nếu bạn thích GUI và đang sử dụng Windows, đây là một cách dễ dàng.

  1. Tải xuống WinMerge
  2. Kiểm tra hai nhánh vào các thư mục khác nhau
  3. Làm một thư mục theo thư mục so sánh bằng WinMerge. Bạn cũng có thể dễ dàng thực hiện sửa đổi nếu một trong những chi nhánh là chi nhánh bạn đang làm việc.

Đó không phải là cách đơn giản nhất, thực sự không cần phải tải xuống repos để tìm khác biệt giữa các chi nhánh.
stefgosselin

Đây thực sự không phải là cách đơn giản nhất, nhưng đó là cách GUI, thường dễ dàng hơn rất nhiều đặc biệt là việc nhìn thấy các khác biệt trong tất cả các tệp
Marius Matioc 20/07/19

-3

Bạn cũng có thể dễ dàng so sánh các nhánh cho các tệp đã thay đổi bằng ví dụ TortoiseGit . Chỉ cần nhấp vào Duyệt Tài liệu tham khảo và chọn các nhánh bạn muốn so sánh.

Ví dụ: nếu bạn so sánh chi nhánh của mình với chủ, bạn sẽ nhận được một danh sách kết quả của các tệp sẽ được thay đổi trong tổng thể nếu bạn quyết định hợp nhất chi nhánh của bạn thành chủ .

Hãy nhớ rằng bạn sẽ có kết quả khác nếu so sánh master với nhánh của bạnnhánh của bạn với master .


1
câu hỏi dường như là về tiện ích git bản địa
Vladimir Hraban
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.