Наступна команда оболонки повинна робити те, що ви хочете:
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, але, можливо, це навмисно.