Git: Cách liệt kê các cam kết trên nhánh này nhưng không phải từ các nhánh đã hợp nhất


90

Giả sử lịch sử cam kết git của bạn trông giống như sau:

A---B---C---D---E---F master
     \         /
      X---Y---Z topic

Có thể có danh sách git chỉ các cam kết trên chính, AF không? Nói cách khác, nếu cam kết nằm trên một nhánh được hợp nhất, tôi không muốn nó hiển thị.


2
Vì vậy, làm thế nào git biết cái nào trong số DZlà một phần của nhánh đã hợp nhất?
Romain

2
Khi được hợp nhất từ ​​cái chính, các cam kết chính trước đó là những phụ huynh đầu tiên được hợp nhất. git logcho phép hiển thị chỉ những cam kết với --first-parent, vì vậy bạn sẽ có được những thứ quyền
CharlesB

Câu trả lời:


133

git logcó tùy chọn --first-parent, vì vậy bạn sẽ không nhận được topiclịch sử.

Khi hợp nhất từ master, các mastercam kết là cha mẹ đầu tiên được hợp nhất. Nhật ký Git chỉ cho phép hiển thị những cam kết đó với --first-parent, vì vậy bạn sẽ có được những thứ phù hợp.


25
1 --first-parentthực hiện nó :) kết hợp với --no-mergesbạn có thể ẩn các cam kết hợp nhất
c00kiemon5ter

Tôi đã ủng hộ, nhưng nó vẫn có vẻ quá mức so với câu trả lời của tôi
UpAndAdam

22

TLDR : git log origin/master --no-mergessẽ cung cấp cho bạn nhật ký chính và loại trừ mọi cam kết đã hợp nhất (trong trường hợp này là x, y, z)

Điểm gốc

Có một cách chung khác để giải quyết vấn đề này mà không dựa vào --first-parentđó sẽ hữu ích trong một số trường hợp nhất định .. sử dụng bộ lọc loại trừ nhánh

git log origin/topic ^origin/master Điều này sẽ cung cấp cho bạn một nhật ký origin/topicvới tất cả các origin/mastercam kết bị xóa.

bạn cũng có thể thêm vào --no-mergesđó sẽ ẩn các cam kết hợp nhất mà bạn có thể muốn hoặc có thể không muốn.

Một mẹo hữu ích khác là sử dụng shortlogthay thế logsẽ cung cấp cho bạn nhiều bản tóm tắt viết tắt hơn có thể hữu ích cho việc phát hành ghi chú hoặc thông tin liên lạc về những gì trong một chi nhánh.

Cập nhật
Sau khi đọc lại điều này, bạn thực sự muốn gần như ngược lại với những gì tôi đã đăng; tuy nhiên nó sẽ kết thúc loại trừ mọi thứ trên master và foo ( git log origin/master ^origin/foo). Tuy nhiên, bạn cũng có thể nhận được những gì bạn yêu cầu (ẩn tất cả các cam kết là một phần của hợp nhất) vớigit log origin/master --no-merges


0

Câu trả lời của Charles làm việc cho tôi.

git log has option --first-parent --no-merges, so you won't get topic history.

Nhưng nếu bạn đang sử dụng bất kỳ giao diện người dùng đồ họa nào cho các hoạt động Git của mình như, Git Extension, SourceTree, Tortoise Git,

Sau đó, có các tùy chọn trực tiếp để kiểm tra phụ huynh đầu tiên trong các công cụ của bạn. Tôi nghĩ thêm câu trả lời này vào danh sách vì hầu hết mọi người đều thấy Giao diện đồ họa dễ dàng. và Bạn có thể trực tiếp chọn tất cả các cam kết từ chi nhánh cụ thể đó từ công cụ, nếu cần.

Tôi đã đính kèm ví dụ về hai công cụ, Nó cũng tương tự đối với các công cụ khác: [Tôi đã xóa tên người dùng, tên kho git vì đây là kho lưu trữ riêng tư, nhưng bạn vẫn có thể biết cách sử dụng công cụ gốc từ các công cụ ]

  1. Phần mở rộng Git
    • Mở Git Extension -> Kiểm tra nhánh tính năng bạn muốn xem các cam kết, có một tùy chọn để chọn các cam kết đầu tiên như trong Hình ảnh:

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

  1. Rùa Git
    • Mở thư mục kho lưu trữ -> Nhấp vào Hiển thị nhật ký từ Tortoise Git -> Kiểm tra chi nhánh và chọn các cam kết đầu tiên như trong Hình ảnh

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


-3

Điều này không hoạt động?

git log master
git log --stat master

Không có cái nào không hoạt động. Cam kết hợp nhất có hai cha mẹ; mọi thứ theo dõi lại từ cả hai cha mẹ đó đều nằm trên nhánh 'chính'.
GoZoner
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.