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

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

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

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

Ответ 1

Вы можете использовать range.

git log master..

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

Ответ 2

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

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

Ответ 3

Примечание: если вы ограничиваете этот журнал последним n commit (последние 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):

версия: parse "git log -<count>" более внимательно

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

$ git log -2master

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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.
  • И затем мы в целом очищаем вывод, удаляя все, что предшествует [$BRANCH_NAME] с sed -E "s/^[^\[]*?\[/[/".