Git khác nhau giữa nhánh hiện tại và chủ nhưng không bao gồm các cam kết chính không được trộn


170

Tôi muốn một khác biệt của tất cả các thay đổi trong một nhánh chưa được hợp nhất để làm chủ.

Tôi đã thử:

git diff master
git diff branch..master
git diff branch...master

Tuy nhiên, trong mỗi trường hợp này, diff chứa nội dung trong master chưa được sáp nhập vào chi nhánh của tôi.

Có cách nào khác biệt giữa chi nhánh và chủ của tôi mà không bao gồm các thay đổi trong chủ chưa được sáp nhập vào chi nhánh của tôi chưa?


9
Nếu bạn lật xung quanh phiên bản thứ hai, bạn sẽ có được thứ bạn muốn : git diff master..branch. Bạn có thể rút ngắn nó xuống git diff master..nếu bạn đang ở chi nhánh. Các r1..r2cú pháp là viết tắt của ^r1 r2mà có nghĩa là "cho tôi tất cả mọi thứ mà xuống từ r2và không thể truy cập từ r1". git help gitrevisionscó thông tin về các cú pháp khác nhau mà bạn có thể sử dụng.
John Szakmeister

1
Tôi mở rộng câu trả lời của mình sau khi tôi đọc thêm về ...cú pháp của git diff. Nhận xét của bạn là sai, @jszakmeister, vì phạm vi sửa đổi như được mô tả trong gitrevisionskhông có gì để làm với git diff. Diff so sánh hai điểm trong lịch sử, không thể làm việc với một phạm vi.
Palec

Bạn nói đúng. Tôi luôn quên rằng nó git diffhoạt động khác với các lệnh khác ... một thực tế mà tôi thấy bực bội. :-(
John Szakmeister

đảm bảo rằng bạn cập nhật bản sao chính của địa phương trước khi so sánh
joe

Câu trả lời:


231
git diff `git merge-base master branch`..branch

Hợp nhất cơ sở là điểm mà branchchuyển hướng từ master.

Git diff hỗ trợ một cú pháp đặc biệt cho việc này:

git diff master...branch

Bạn không được hoán đổi các bên vì sau đó bạn sẽ có được chi nhánh khác. Bạn muốn biết những gì đã thay đổi branchkể từ khi nó chuyển hướng từmaster , không phải cách khác.

Liên quan lỏng lẻo:


Lưu ý rằng .....cú pháp không có cùng ngữ nghĩa như trong các công cụ Git khác. Nó khác với ý nghĩa được chỉ định trong man gitrevisions.

Trích dẫn man git-diff:

  • git diff [--options] <commit> <commit> [--] [<path>…]

    Điều này là để xem những thay đổi giữa hai tùy ý <commit>.

  • git diff [--options] <commit>..<commit> [--] [<path>…]

    Điều này đồng nghĩa với hình thức trước đó. Nếu <commit>một bên bị bỏ qua, nó sẽ có tác dụng tương tự như sử dụng HEADthay thế.

  • git diff [--options] <commit>...<commit> [--] [<path>…]

    Hình thức này là để xem các thay đổi trên nhánh chứa và lên đến lần thứ hai <commit>, bắt đầu từ một tổ tiên chung của cả hai <commit>. " git diff A...B" tương đương với " git diff $(git-merge-base A B) B". Bạn có thể bỏ qua bất kỳ một trong số <commit>đó, có tác dụng tương tự như sử dụng HEADthay thế.

Chỉ trong trường hợp nếu bạn đang làm một cái gì đó kỳ lạ, cần lưu ý rằng tất cả các <commit>mô tả trong phần trên, ngoại trừ trong hai hình thức cuối cùng sử dụng ký hiệu "..", có thể là bất kỳ <tree>.

Để biết danh sách đầy đủ hơn về các cách đánh vần <commit>, hãy xem phần "ĐẶC BIỆT CÁCH MẠNG" gitrevisions[7]. Tuy nhiên, "diff" là về việc so sánh hai điểm cuối, không phải phạm vi và các ký hiệu phạm vi (" <commit>..<commit>" và " <commit>...<commit>") không có nghĩa là một phạm vi như được định nghĩa trong phần "ĐẶC BIỆT RANGES" trong gitrevisions[7].


Đối với tôi $ git diff master...branchđược sản xuất fatal: ambiguous argument 'master...branch': unknown revision or path not in the working tree.- đây có phải là một lệnh phụ thuộc phiên bản không?
Joel Peltonen

Trên thực tế, tôi chỉ nhận ra rằng "chi nhánh" phải là tên của chi nhánh của bạn, tôi nghĩ đó là một tham chiếu đến chi nhánh hiện tại
Joel Peltonen

4
Bạn nói đúng, câu trả lời của tôi phụ thuộc vào chi nhánh được gọi branch. Tôi đã chọn gắn với cái tên mà OP đã chọn trong câu hỏi. Nếu bạn muốn sử dụng chi nhánh hiện tại, thay thế branchbằng HEAD.
Palec

14
Lưu ý rằng bạn có thể sử dụng git diff master...để tránh chỉ định chi nhánh (hiện tại sẽ được thực hiện).
VasiliNovikov

1
Lệnh ban đầu có hoạt động sau khi bạn kiểm tra không devel, @ChrisGuest? Có thể, Git đã tạo chi nhánh cho bạn trong quá trình thanh toán, dưới dạng bản sao cục bộ của một chi nhánh từ xa (thông thường origin/devel). Nếu đó là trường hợp, git diff origin/devel...bugfix/API-353-api-allows-database-access-whenđã làm việc ngay cả trước khi thanh toán.
Palec

44

Đây là những gì làm việc cho tôi:

git diff origin/master...

Điều này chỉ hiển thị các thay đổi giữa nhánh cục bộ hiện được chọn của tôi và nhánh chính từ xa và bỏ qua tất cả các thay đổi trong nhánh cục bộ của tôi xuất phát từ các cam kết hợp nhất.


Để tham khảo, nếu bạn cần các giới thiệu cam kết của các cam kết có chứa những thay đổi này, hãy sử dụng git cherry origin/master.
jaytibann

Nếu điều này cho thấy một loạt rác mà bạn không mong đợi, mastercó thể đã loại bỏ một loạt các cam kết từ bên dưới bạn.
Michael - Clay Shirky ở đâu

21

Như John Szakmeister và VasiliNovikov cũng lưu ý, lệnh ngắn nhất để có được sự khác biệt hoàn toàn từ quan điểm của bậc thầy về chi nhánh của bạn là:

git diff master...

Điều này sử dụng bản sao địa phương của bạn.

Để so sánh một tập tin cụ thể sử dụng:

git diff master... filepath

Ví dụ đầu ra:

Ví dụ sử dụng

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.