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 đã mybranch
kiểm tra, lệnh trên sẽ không hoạt động. Đó là bởi vì các cam kết trên mybranch
cũ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 HEAD
trừ 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/mybranch
tương ứng với mybranch
nhá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-list
lệ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 log
ngoạ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-walk
tùy chọn, như tên của nó, ngăn chặn git rev-list
từ đi bộ chuỗi gốc. Vì vậy, nếu bạn gõ, git rev-list --no-walk mybranch
nó sẽ chỉ in một mã định danh SHA1: mã định danh của cam kết đầu của mybranch
chi 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 --all
và 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-walk
số 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ố ý.