Следующая команда оболочки должна делать то, что вы хотите:
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)
И если удаленная ветвь является веткой по умолчанию для удаленного репозитория (обычно только для true 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 ошибка?
Я ожидал бы следующее, чтобы работать:
git log --all --not --exclude=refs/heads/mybranch --all
но это не так. Я предполагаю, что это ошибка в Git, но, возможно, это намеренно.