Наступна команда оболонки повинна робити те, що ви хочете:
git log --all --not $(git rev-list --no-walk --exclude=refs/heads/mybranch --all)
Коваджі
Якщо ви mybranch
зареєструвались, вищевказана команда не працюватиме. Це тому, що комісії на mybranch
них також доступні HEAD
, тому Git не вважає, що ці документи є унікальними mybranch
. Щоб змусити його працювати, коли mybranch
він перевіряється, потрібно також додати виключення для HEAD
:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=HEAD \
--all)
Однак, ви не повинні виключати, HEAD
якщо це mybranch
не перевірено, інакше ви ризикуєте показати комісії, які не є ексклюзивними mybranch
.
Аналогічно, якщо у вас є віддалена гілка з назвою, origin/mybranch
яка відповідає локальній mybranch
гілці, вам доведеться її виключити:
git log --all --not $(git rev-list --no-walk \
--exclude=refs/heads/mybranch \
--exclude=refs/remotes/origin/mybranch \
--all)
І якщо віддалена гілка є гілкою за замовчуванням для віддаленого сховища (зазвичай це стосується лише origin/master
), вам доведеться також виключити 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)
Якщо ви перевірили гілку, і там є віддалене відділення, а віддалене відділення є за замовчуванням для віддаленого сховища, то в кінцевому підсумку виключаєте багато:
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)
Пояснення
git rev-list
Команда є командою низького рівня (водопровід) , який йде задані зміни і відвали ідентифікатори SHA1 зустрічаються. Думайте про це як еквівалент, за git log
винятком того, що він показує лише SHA1 - жодного повідомлення журналу, імені автора, відмітки часу, нічого з цього «вигадливого» матеріалу.
Цей --no-walk
варіант, як випливає з назви, заважає git rev-list
ходити по ланцюжку родовідних. Отже, якщо ви введете git rev-list --no-walk mybranch
його, він буде надрукувати лише один ідентифікатор SHA1: ідентифікатор комітету mybranch
гілки гілки.
В --exclude=refs/heads/mybranch --all
аргументах кажуть , git rev-list
щоб почати з кожного посилання , за винятком refs/heads/mybranch
.
Отже, коли ви запускаєте git rev-list --no-walk --exclude=refs/heads/mybranch --all
, Git друкує ідентифікатор SHA1 кожного комітету, за винятком, крім refs/heads/mybranch
. Ці зобов’язання та їх предки - це зобов’язання, які вас не цікавлять - це ті зобов'язання, яких ви не хочете бачити.
В інших фіксацій є ті , які ви хочете бачити, тому ми збираємо висновок git rev-list --no-walk --exclude=refs/heads/mybranch --all
і сказати Git , щоб показати всі , крім тих фіксацій і їх предки.
--no-walk
Аргумент необхідний для великих сховищ (і є оптимізацією для невеликих сховищ): Без нього, Git б друкувати, і оболонці доведеться збирати (і зберігати в пам'яті) багато більше роблять ідентифікатори , ніж це необхідно. З великим сховищем кількість зібраних комітетів може легко перевищити ліміт аргументів командного рядка оболонки.
Git bug?
Я б очікував, що це працюватиме:
git log --all --not --exclude=refs/heads/mybranch --all
але це не так. Я здогадуюсь, це помилка в Git, але, можливо, це навмисно.