Hiển thị các cam kết được thực hiện trực tiếp cho một chi nhánh, bỏ qua các hợp nhất trong Git


86

Khi sử dụng git, có cách nào để hiển thị các cam kết được thực hiện cho một nhánh, đồng thời bỏ qua tất cả các cam kết được đưa vào bằng cách hợp nhất không?

Tôi đang cố gắng xem lại những thay đổi mã được thực hiện trên một nhánh trong khi bỏ qua những thay đổi mà chúng tôi đã thực hiện trên các nhánh khác đã được hợp nhất. Tôi biết thật là không thể để hiển thị sự khác biệt trong kiểu đó, nhưng tôi muốn có thể tìm ra những cam kết mà tôi cần xem xét.

Câu trả lời:


123

--no-merges

Cả cha và mẹ đều có trọng lượng bằng nhau trong nhiều ngữ cảnh trong git. Nếu bạn luôn nhất quán trong việc hợp nhất các thay đổi khác vào thì bạn có thể thấy rằng điều này mang lại cho bạn những gì bạn muốn.

git log --no-merges --first-parent

Nếu không, bạn có thể loại trừ các cam kết khỏi các chi nhánh có tên khác.

git log --no-merges ^other-branch-1 ^other-branch-2 ^other-branch-3

Nếu bạn muốn xem lại những thay đổi mà bạn sẽ hợp nhất lại thành một nhánh chính thì điều dễ dàng nhất để làm là thực hiện hợp nhất trên một bản sao cục bộ và sau đó chỉ cần xem xét sự khác biệt với gốc đầu tiên trước khi xuất bản hợp nhất.


Lệnh đầu tiên này là tuyệt vời trong "thích chi nhánh mỗi tính năng" ( plus.google.com/109096274754593704906/posts/R4qkeyRadLR )
Adam Dymitruk

1
Có vẻ như tôi nhận được hầu hết các cam kết từ nhánh đó, nhưng nó vẫn hiển thị các cam kết được lấy từ chủ. Chúng tôi có rất nhiều chi nhánh nên việc loại trừ những chi nhánh khác sẽ không thực tế.
Channel Cat

@ChannelCat tại sao không đặt lại chi nhánh của bạn vào chi nhánh khác, sau đó tất cả các cam kết sẽ ở cuối?
Mark Ingram

7

Bạn có thể sử dụng git cherrycho điều đó, nó sẽ tìm thấy bạn các cam kết chưa được hợp nhất với ngược dòng hoặc các cam kết nằm trên một nhánh nhưng không nằm trên nhánh kia. Vì vậy, đưa ra hai nhánh có tên "nhánh của bạn" và "chủ":

git cherry -v your-branch master

sẽ hiển thị cho bạn danh sách các cam kết được so sánh với id bản vá của họ:

+ c3e441bf4759d4aa698b4a413f1f03368206e82f Updated Readme
- 2a9b2f5ab1fdb9ee0a630e62ca7aebbebd77f9a7 Fixed formatting
+ e037c1d90b812af27dce6ed11d2db9454a6a74c2 Corrected spelling mistake

Bạn có thể nhận thấy rằng các cam kết có tiền tố "-" là những cam kết xuất hiện trong cả hai nhánh, trong khi những cam kết có tiền tố "+" chỉ có sẵn trên nhánh của bạn.

Để thay thế, bạn có thể sử dụng:

git log --pretty=format:"%h %s" your-branch..master --no-merges

sẽ hiển thị cho bạn danh sách các cam kết được thực hiện trên "chi nhánh của bạn" mà chưa có trên "chủ"


Vì cố gắng chỉnh sửa câu trả lời của bạn bị từ chối, tôi sẽ đăng nó ở đây: trong dòng git cuối cùng của bạn, nên có ba dấu chấm chứ không phải hai, giữa tên các chi nhánh. Như thế này: bạn ngành ... thạc sĩ
vedranm

@vedranm Bạn không cần 3 dấu chấm, chỉ cần hai ... mặc dù 3 hoạt động theo cùng một cách mà 2 hoạt động.
Zzzach ...

4

Một cách rất hack:

git log --graph --oneline --no-merges thebranch|grep '^\*'

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.