Я хочу перечислить все коммиты, которые являются только частью определенной ветви.
С учетом следующего, он перечисляет все коммиты из ветви, но также из родительского (мастер)
git log mybranch
Другой вариант, который я нашел, состоял в том, чтобы исключить коммиты, доступные мастеру, и дает мне то, что я хочу, НО я хотел бы избежать необходимости знать имена других ветвей.
git log mybranch --not master
Я пытался использовать git for-each-ref
, но он также перечисляет mybranch, так что на самом деле он исключает все:
git log mybranch --not $(git for-each-ref --format '^%(refname:short)' refs/heads/)
Обновить:
Я тестирую новый вариант, который я нашел некоторое время назад, и до сих пор кажется, что это то, что я искал:
git log --walk-reflogs mybranch
Обновление (2013-02-13T15: 08):
Опция --walk-reflogs хороша, но я проверил, что для reflogs истек срок действия (по умолчанию 90 дней, gc.reflogExpire ).
Я думаю, что нашел ответ, который искал:
git log mybranch --not $(git for-each-ref --format='%(refname)' refs/heads/ | grep -v "refs/heads/mybranch")
Я просто удаляю текущую ветку из списка доступных ветвей и использую этот список для исключения из журнала. Таким образом, я получаю только те коммиты, которые доступны только моему филиалу .
Ответы:
Из того, как это звучит, вы должны использовать
cherry
:Это покажет все коммиты, которые содержатся в mybranch , но НЕ в разработке . Если вы пропустите последний вариант ( mybranch ), он будет сравнивать текущую ветку.
Как указал VonC, вы ВСЕГДА сравниваете свою ветку с другой веткой, поэтому знайте свои ветви, а затем выбирайте, с какой из них сравнивать.
источник
git cherry -v master
можете сравнить текущую ветку с главной веткой.fatal: Unknown commit mybranch
.Я не думаю, что это возможно: ветка в Git всегда основана на другом или, по крайней мере, на другом коммите, как объяснено в « git diff не показывает достаточно »:
Вам нужен ориентир для вашего журнала, чтобы показать правильные коммиты.
Как упомянуто в « GIT - Откуда я ветвился? »:
Поэтому, даже если
git log master..mybranch
ответ один, он все равно будет показывать слишком много коммитов, еслиmybranch
он основан наmyotherbranch
самомmaster
.Чтобы найти эту ссылку (источник вашей ветви), вы можете только проанализировать коммиты и посмотреть, в какой ветви они находятся, как показано в:
источник
Я наконец нашел способ сделать то, что хотел ОП. Это так просто, как:
Команда отобразит все коммиты, которые доступны из предоставленной ветки в формате графика. Но вы можете легко отфильтровать все коммиты в этой ветке, посмотрев на граф коммитов,
*
коммитов является первым символом в строке коммитов.Например, давайте посмотрим на выдержку из
git log --graph master
репозитория GitHub на cakephp:Как вы можете видеть, только фиксации
8314c2ff833280bbc7102cb6d4fcf62240cd3ac4
иc3f45e811e4b49fe27624b57c3eb8f4721a4323b
иметь*
существо первого символ фиксация линии. Эти коммиты из основной ветки, а остальные четыре из других веток.источник
Следующая команда оболочки должна делать то, что вы хотите:
Предостережения
Если вы
mybranch
проверили, приведенная выше команда не будет работать. Это потому, что коммитыmybranch
также доступныHEAD
, поэтому Git не считает коммиты уникальными для нихmybranch
. Чтобы заставить его работать, когдаmybranch
он выписан, вы также должны добавить исключение дляHEAD
:Тем не менее, вы не должны исключать,
HEAD
покаmybranch
не извлечены, в противном случае вы рискуете показать коммиты, которые не являются исключительнымиmybranch
.Точно так же, если у вас есть удаленная ветка с именем,
origin/mybranch
которая соответствует локальнойmybranch
ветке, вам придется исключить ее:И если удаленная ветвь является веткой по умолчанию для удаленного репозитория (обычно только для true
origin/master
), вам также придется исключитьorigin/HEAD
:Если у вас есть разветвленная ветвь, и есть удаленная ветвь, и удаленная ветвь является удаленной веткой по умолчанию, то в итоге вы исключаете много:
объяснение
Эта
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, но, возможно, это намеренно.
источник
hg log -b <branch>
. Я не понимаю, почему люди говорят, что мерзавец недружелюбен. / sgit log --all --not --exclude=refs/heads/mybranch --all
не работает, ноgit log refs/heads/mybranch --not --exclude=refs/heads/mybranch --all
работает, с теми же предостережениями об исключении HEAD и происхождения.Быстрый ответ:
Скажем так:
Что у вас есть мастер ветка
Сделать несколько коммитов
Вы создали ветку с именем b2
Делать
git log -n1
; идентификатор фиксации - это база слияния между b2 и masterСделать несколько коммитов в b2
git log
покажет ваш журнал истории b2 и мастерИспользуйте диапазон фиксации, если вы не знакомы с концепцией, я приглашаю вас погуглить или переполнить ее,
Для вашего реального контекста, вы можете сделать, например,
«..» - оператор диапазона для команды log.
Это означает, что в простой форме, дайте мне все журналы, более свежие, чем commitID_FOO ...
Посмотрите на пункт № 4, база слияния
Итак:
git log COMMITID_mergeBASE..HEAD
покажу вам разницуGit может получить базу слияния для вас, как это
Наконец вы можете сделать:
источник
Вы можете попробовать что-то вроде этого:
Или заимствуя рецепт из Руководства пользователя Git :
источник
git show-ref --tags
тоже.будет перечислять советы каждой отрасли, которая не
master
.перечислит каждый коммит в
master
истории России, которого нет в истории любого другого филиала.Последовательность важна для опций, которые устанавливают конвейер фильтра для выбора коммита, поэтому
--branches
должна следовать всем шаблонам исключения, которые она должна применять, и--no-walk
должна следовать фильтрам, предоставляющим коммиты. Rev-list не должен проходить.источник
Это выведет коммиты на текущую ветку. Если какой-либо аргумент передается, он просто выводит хэши.
git_show_all_commits_only_on_this_branch
источник
Я использую следующие команды:
или
источник
Я нашел этот подход относительно простым.
Оформить заказ в филиал и чем
Бегать
Это обеспечит всего два SHA:
1) последний коммит ветки [C1]
2) и зафиксировать родительский элемент для первого коммита ветви [C2]
Теперь беги
Здесь C1 и C2 - две строки, которые вы получите при запуске первой команды. Поместите эти значения без <> во второй команде.
Это даст список истории изменения файла в ветке.
источник
В моей ситуации мы используем Git Flow и GitHub. Все, что вам нужно для этого, - это сравнить вашу ветку функций с вашей веткой разработки на GitHub.
Он покажет коммиты, сделанные только для вашей функциональной ветви.
Например:
https://github.com/your_repo/compare/develop...feature_branch_name
источник
git
и вместо этого использовать GitHub, чтобы просто выполнить запрос на извлечение или сравнить ветви.