Następujące polecenie powłoki powinno robić, co chcesz:
git log --all --not $(git rev-list --no-walk --exclude=refs/heads/mybranch --all)
Ostrzeżenia
Jeśli mybranchwymeldowałeś się, powyższe polecenie nie będzie działać. To dlatego, że zatwierdzenia mybranchsą również osiągalne przez HEAD, więc Git nie uważa, że zatwierdzenia są unikalne dla mybranch. Aby działał, gdy mybranchjest wyrejestrowany, musisz również dodać wykluczenie dla HEAD:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD \
--all)
Nie należy jednak wykluczać, HEADchyba żemybranch jest zaznaczone, w przeciwnym razie ryzykujesz pokazanie zatwierdzeń, które nie są wyłączne mybranch.
Podobnie, jeśli masz zdalny oddział o nazwie origin/mybranchodpowiadający mybranchoddziałowi lokalnemu , musisz go wykluczyć:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--all)
A jeśli gałąź zdalna jest domyślną gałęzią dla zdalnego repozytorium (zwykle tylko dla origin/master), musisz również wykluczyć 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)
Jeśli masz wyewidencjonowany oddział, i istnieje gałąź zdalna, a gałąź zdalna jest domyślna dla zdalnego repozytorium, to w rezultacie wykluczasz wiele:
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)
Wyjaśnienie
The git rev-list komenda jest komendą niskopoziomową (hydrauliczną), która przeprowadza daną wersję i zrzuca napotkane identyfikatory SHA1. Pomyśl o tym jako równoważnym, git logz tym wyjątkiem, że pokazuje tylko SHA1 - brak wiadomości w dzienniku, bez nazwiska autora, bez znacznika czasu, żadnych z tych „wymyślnych” rzeczy.
Ta --no-walkopcja, jak sama nazwa wskazuje, uniemożliwia git rev-listchodzenie po łańcuchu przodków. Więc jeśli napiszeszgit rev-list --no-walk mybranch , wydrukuje tylko jeden identyfikator SHA1: identyfikator zatwierdzenia końcówkimybranch oddziału.
Te --exclude=refs/heads/mybranch --allargumenty powiedziećgit rev-list zacząć od każdego odwołania z wyjątkiemrefs/heads/mybranch .
Tak więc, kiedy uruchomisz git rev-list --no-walk --exclude=refs/heads/mybranch --all, Git drukuje identyfikator SHA1 zatwierdzenia tip dla każdego ref z wyjątkiem refs/heads/mybranch. Te zobowiązania i ich przodkowie są zobowiązaniami, którymi nie jesteś zainteresowany - są to zobowiązania, które robisz nie interesujesz chcesz widzieć.
W innych commity są te, które chcesz zobaczyć, więc zbierać wyjściegit rev-list --no-walk --exclude=refs/heads/mybranch --all i powiedzieć Git, aby zobaczyć wszystko, ale te rewizje i ich przodków.
The --no-walkArgumentem jest to konieczne dla dużych repozytoriów (i jest optymalizacja dla małych repozytoriach): Bez niej, Git będzie musiał wydrukować, a powłoka musiałby zbierać (i przechowywać w pamięci) wiele więcej popełnić identyfikatory niż to konieczne. Przy dużym repozytorium liczba zebranych zatwierdzeń może łatwo przekroczyć limit argumentów powłoki w wierszu poleceń.
Masz błąd?
Spodziewałbym się, że zadziała:
git log --all --not --exclude=refs/heads/mybranch --all
ale tak nie jest. Zgaduję, że to błąd w Git, ale może to celowe.