Lệnh shell sau sẽ làm những gì bạn muốn:
git log --all --not $(git rev-list --no-walk --exclude=refs/heads/mybranch --all)
Hãy cẩn thận
Nếu bạn đã mybranchkiểm tra, lệnh trên sẽ không hoạt động. Đó là bởi vì các cam kết trên mybranchcũng có thể truy cập được HEAD, vì vậy Git không coi các cam kết là duy nhất mybranch. Để làm cho nó hoạt động khi mybranchđược kiểm tra, bạn cũng phải thêm một loại trừ cho HEAD:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD \
--all)
Tuy nhiên, bạn không nên loại HEADtrừ trừ khi mybranchđược kiểm tra, nếu không bạn có nguy cơ hiển thị các cam kết không dành riêng cho mybranch.
Tương tự, nếu bạn có một nhánh từ xa có tên origin/mybranchtương ứng với mybranchnhánh cục bộ , bạn sẽ phải loại trừ nó:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--all)
Và nếu nhánh từ xa là nhánh mặc định cho kho lưu trữ từ xa (thường chỉ đúng với origin/master), bạn cũng sẽ phải loại trừ origin/HEAD:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--exclude=refs/remotes/origin/HEAD \
--all)
Nếu bạn đã kiểm tra chi nhánh và có một chi nhánh từ xa và chi nhánh từ xa là mặc định cho kho lưu trữ từ xa, thì cuối cùng bạn sẽ loại trừ rất nhiều:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD
--exclude=refs/remotes/origin/mybranch \
--exclude=refs/remotes/origin/HEAD \
--all)
Giải trình
Các git rev-listlệnh là một mức độ thấp (ống nước) lệnh đó đi các phiên bản nhất định và bãi các định SHA1 gặp phải. Hãy nghĩ về nó tương đương với git logngoại trừ nó chỉ hiển thị thông báo nhật ký SHA1, không tên tác giả, không dấu thời gian, không có nội dung "ưa thích" nào.
Các --no-walktùy chọn, như tên của nó, ngăn chặn git rev-listtừ đi bộ chuỗi gốc. Vì vậy, nếu bạn gõ, git rev-list --no-walk mybranchnó sẽ chỉ in một mã định danh SHA1: mã định danh của cam kết đầu của mybranchchi nhánh.
Các --exclude=refs/heads/mybranch --allđối số nói git rev-listđể bắt đầu từ mỗi tham chiếu ngoại trừ refs/heads/mybranch.
Vì vậy, khi bạn chạy git rev-list --no-walk --exclude=refs/heads/mybranch --all, Git sẽ in định danh SHA1 của cam kết tiền tip của mỗi ref trừ refs/heads/mybranch. Những cam kết này và tổ tiên của chúng là những cam kết mà bạn không quan tâm đến, đây là những cam kết bạn không muốn thấy.
Các cam kết khác là những cam kết bạn muốn xem, vì vậy chúng tôi thu thập kết quả đầu ra git rev-list --no-walk --exclude=refs/heads/mybranch --allvà bảo Git hiển thị mọi thứ trừ những cam kết đó và tổ tiên của chúng.
Đối --no-walksố là cần thiết cho các kho lưu trữ lớn (và là tối ưu hóa cho các kho nhỏ): Nếu không có nó, Git sẽ phải in và trình bao sẽ phải thu thập (và lưu trữ trong bộ nhớ) nhiều số nhận dạng cam kết hơn mức cần thiết. Với kho lưu trữ lớn, số lượng xác nhận được thu thập có thể dễ dàng vượt quá giới hạn đối số dòng lệnh của shell.
Lỗi Git?
Tôi đã mong đợi những điều sau đây để làm việc:
git log --all --not --exclude=refs/heads/mybranch --all
Nhưng nó không. Tôi đoán đây là một lỗi trong Git, nhưng có lẽ đó là cố ý.