2012-05-09 27 views
8

Làm cách nào để tìm thấy cam kết hợp nhất trước đó giữa hai nhánh?Cách tìm cam kết hợp nhất trước đó

Tôi muốn xem các thay đổi trong nhánh chính của mình kể từ lần cuối cùng tôi đã hợp nhất chi nhánh phát hành vào nhánh chính. Để xem các thay đổi trong nhánh phát hành kể từ nhánh cuối cùng, nó dễ dàng như git diff ...release

Nhưng rõ ràng là git diff release... không hoạt động vì nó cũng bao gồm tất cả thay đổi trước lần hợp nhất cuối cùng. Vì vậy, tôi nghĩ rằng tôi cần phải cam kết id của việc hợp nhất cuối cùng để vượt qua nó để git diff

git log --reverse --ancestry-path `git merge-base HEAD release`.. \ 
     --format=format:%H|head -n1 

dường như làm việc và có thể được sử dụng với git diff $(...), nhưng có vẻ như hết sức phức tạp. Có giải pháp nào dễ hơn không?

Ví dụ

I 
/\ 
A1 B1 
\ | 
| M 
| | 
A2 B2 

đây I là cam kết ban đầu. A[12] là các cam kết phát hành và B[12] là các cam kết chính. M là cam kết trước đó. Trong ví dụ, các thay đổi giữa lần hợp nhất cuối cùng và cái chính chỉ là những thay đổi được giới thiệu bởi B2. git merge-base A2 B2 trả về A 1. Và git diff B2 A1 bao gồm các thay đổi của B1. Vì vậy, câu hỏi là làm thế nào để tìm M trong trường hợp phức tạp hơn chung để người ta có thể chạy git diff M B2 mà không cần phải tìm kiếm thủ công M.

+0

Đây không phải là cách hiệu quả nhất, nhưng bạn có thể xem 'git log --graph --oneline' để tìm commit. – Shahbaz

Trả lời

-1

này sẽ hiển thị các kết hợp mới nhất cam kết giữa foo chi nhánh và thạc sĩ ngành

git log foo master --oneline --date-order --merges -1 

--oneline is just to keep the output short 
--date-order to get the latest first 
--merges to only show merge commits 
-1 to display the first result only 
+3

Lệnh này dường như cung cấp cho tôi lần hợp nhất cuối cùng trong một trong hai nhánh. Điều này bao gồm các hợp nhất mà chủ hoặc foo với cái gì khác. Nhưng tôi muốn có sự hợp nhất cuối cùng của foo với chủ không phải với bất cứ điều gì khác. –

+0

Lệnh này rất hữu ích để có được kết hợp cuối cùng từ một chi nhánh nếu bạn chỉ đăng nhập một nhánh: git log master --oneline [...] –

6

Có vẻ như những gì bạn đang tìm kiếm là điểm mà tại đó hai chi nhánh bắt đầu khác nhau, không phải là hợp nhất cuối cùng giữa hai các chi nhánh. Hai khái niệm này khác nhau vì nhánh phát hành của bạn có thể đã được chuyển tiếp nhanh một thời gian sau khi nó được hợp nhất.

git merge-base master release sẽ tìm thấy tổ tiên chung gần đây nhất của các nhánh chính và bản phát hành của bạn (nghĩa là cam kết cuối cùng mà cả hai có điểm chung).

Sau đó, trên máy chủ bạn có thể sử dụng git diff [common ancestor] HEAD để xem các thay đổi đã được thực hiện để làm chủ từ tổ tiên chung.

+0

Tôi đã thêm một ví dụ cho câu hỏi để hiển thị lý do tại sao 'git merge-base' chính nó không giải quyết được vấn đề. –

+0

@Roland Shulz Tôi hiểu. Tôi sẽ cố gắng đưa ra một câu trả lời khác –

Các vấn đề liên quan