Как получить историю коммитов только для одной ветки?


128

Допустим, я создал новую ветку my_experimentот masterи сделал несколько фиксаций к my_experiment. Если я делаю, git logкогда включен my_experiment, я вижу коммиты, сделанные в этой ветке, но также и фиксации, сделанные masterдо создания my_experimentsветки.

Мне было бы очень полезно увидеть историю всех коммитов в my_experimentsветке до тех пор, пока не произойдет создание этой ветки - по сути, настоящая история только этой ветки. Иначе при просмотре журнала мне непонятно, были ли коммиты на my_experimentsветке или нет.

Есть ли способ сделать это с помощью Git?

Ответы:


139

Для этого вы можете использовать диапазон .

git log master..

Если вы проверили свою my_experimentветку. Это сравнит, где masterнаходится HEAD(кончик my_experiment).


3
Хорошо заговорил слишком рано. Это было сделано для моего простого примера. Но теперь я смотрю на чье-то реальное репо, и мне приходит в голову, что для правильного использования этой команды мне нужно знать, из какой ветки была создана моя текущая ветка. Может быть, я смогу сказать это по gitk, но для меня это не очевидно. Есть предположения?
Marplesoft 07

@Marplesoft Это может быть сложно понять. См. Этот вопрос .
Alex

Не могли бы вы вкратце объяснить, как это работает? Что git log master..говорит Git?
tonix

2
@tonix Перейдите по ссылке в ответе для получения дополнительной информации о том, как работает диапазон ( master..часть).
Alex

7

git merge-baseКоманда может быть использована для поиска общего предка. Итак, если my_experiment еще не был объединен с мастером, а my_experiment был создан из мастера, вы можете:

git log --oneline `git merge-base my_experiment master`..my_experiment

Если вы хотите включить родителя вашего первого коммита, добавьте ^ и --first-parent : git log --oneline `git merge-base my_experiment master`^..my_experiment --first-parent
Эрик Лавуа

7

Примечание: если вы ограничиваете этот журнал последним n фиксацией (например, последними 3 фиксациями, git log -3), не забудьте поставить пробел между 'n' и вашей веткой:

git log -3 master..

До Git 2.1 (август 2014 г.) эта ошибка: git log -3master..фактически показывала вам последние 3 коммита текущей ветки (здесь my_experiment), игнорируя masterлимит (то есть, если my_experimentсодержит только один коммит, 3 все равно будут перечислены, 2 из них из master)

См. Фиксацию e3fa568 от Junio ​​C Hamano ( gitster) :

редакция: git log -<count>более тщательно проанализируйте " "

Эта неверно введенная командная строка просто игнорирует " master" и в итоге показывает две фиксации из текущего HEAD:

$ git log -2master

потому что мы передаем " 2master", atoi()не проверяя, анализируется ли вся строка как целое число.

strtol_i()Вместо этого используйте вспомогательную функцию.


1

Вы можете использовать только git log --oneline


Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
DebanjanB

1

Думаю вариант для ваших целей есть git log --online --decorate. Это позволяет вам узнать проверенную фиксацию и верхнюю фиксацию для каждой ветки в вашей сюжетной линии. Сделав это, вы получите хорошее представление о структуре вашего репо и коммитах, связанных с конкретной веткой. Думаю, это может помочь.


0

Я знаю, что для этого уже очень поздно ... Но вот (не такой простой) единственный способ получить то, что вы искали:

git show-branch --all 2>/dev/null | grep -E "\[$(git branch | grep -E '^\*' | awk '{ printf $2 }')" | tail -n+2 | sed -E "s/^[^\[]*?\[/[/"
  • Мы перечисляем коммиты с именем ветки и относительными позициями относительно фактических состояний ветки с git show-branch(отправка предупреждений /dev/null).
  • Затем мы сохраняем только те, которые имеют имя нашей ветки внутри скобок с grep -E "\[$BRANCH_NAME".
  • Где действительно $BRANCH_NAMEполучается с git branch | grep -E '^\*' | awk '{ printf $2 }'(ветвь со звездой, отраженная без этой звезды).
  • Из наших результатов мы удалили лишнюю строку в начале с tail -n+2.
  • И потом, мы fianlly очистить выход, удаляя все предшествующее [$BRANCH_NAME]с sed -E "s/^[^\[]*?\[/[/".
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.