показать коммиты с момента создания ветки

Есть ли способ увидеть с помощью git log или какой-либо другой команды только те коммиты, которые были добавлены после создания ветки?

usage: git log [<options>] [<since>..<until>] [[--] <path>...]
   or: git show [options] <object>...

    --quiet               suppress diff output
    --source              show source
    --decorate[=...]      decorate options

person lurscher    schedule 15.03.2012    source источник
comment
По теме: Как получить изменения в ветке в git   -  person John Bartholomew    schedule 15.03.2012
comment
связанные: stackoverflow.com/q/7251477/52074, stackoverflow.com/q/462974/52074   -  person Trevor Boyd Smith    schedule 03.04.2019


Ответы (7)


Полная документация находится здесь: https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html.

Предположим, у вас есть репо, которое выглядит так:

base  -  A  -  B  -  C  -  D   (master)
                \
                 \-  X  -  Y  -  Z   (myBranch)

Проверить статус репо:

> git checkout master
Already on 'master'
> git status ; git log --oneline
On branch master
nothing to commit, working directory clean
d9addce D
110a9ab C
5f3f8db B
0f26e69 A
e764ffa base

и для myBranch:

> git checkout myBranch
> git status ; git log --oneline
On branch myBranch
nothing to commit, working directory clean
3bc0d40 Z
917ac8d Y
3e65f72 X
5f3f8db B
0f26e69 A
e764ffa base

Предположим, вы находитесь на myBranch и хотите вносить изменения только ПОСКОЛЬКУ мастера. Используйте версию с двумя точками:

> git log --oneline master..myBranch
3bc0d40 Z
917ac8d Y
3e65f72 X

Версия с тремя точками отображает все изменения от кончика мастера до кончика myBranch. Однако обратите внимание, что общий коммит B не включен:

> git log --oneline master...myBranch
d9addce D
110a9ab C
3bc0d40 Z
917ac8d Y
3e65f72 X

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: git log и git diff ВЕДУТ ПО-РАЗНОМУ! Поведение не совсем противоположное, но почти:

> git diff master..myBranch
diff --git a/rev.txt b/rev.txt
index 1784810..e900b1c 100644
--- a/rev.txt
+++ b/rev.txt
@@ -1 +1 @@
-D
+Z

> git diff master...myBranch
diff --git a/rev.txt b/rev.txt
index 223b783..e900b1c 100644
--- a/rev.txt
+++ b/rev.txt
@@ -1 +1 @@
-B
+Z

Итак, версия с двумя точками показывает разницу от кончика мастера (то есть D) до кончика myBranch (Z). Версия с тремя точками показывает разницу от основания myBranch (то есть B) до конца myBranch (Z).

person Alan Thompson    schedule 15.07.2014
comment
Если бы вы сделали git log --oneline myBranch..master, это дало бы вам D и C? - person MiniGod; 01.12.2015
comment
Проголосуйте за описание разницы между .. и ... и предоставление примеров. Отличный ответ! - person Gui Lima; 20.01.2016
comment
Спасибо, что указали, что log и diff ведут себя по-разному (почти противоположно). Почему это могло быть? - person onlyanegg; 26.05.2020

Я ошибся в своем первоначальном ответе. Вам нужна запись с двумя точками:

git log master..<your_branch_name>

Я получил результаты, отличные от ожиданий, поэтому провел тест со следующей структурой репо:

a - - c - e - - g - i   master
  \ b - d / \ f - h     test

Затем я попробовал git log master..test:

f - h

А потом git log master...test:

  - g - i
  f - h

Таким образом, двойная точка показывает коммиты в test, но не в master (^master temp), а тройная точка показывает коммиты в master И test, но не в обоих.

Другой отличный ответ на этот вопрос сначала дал правильный ответ и имеет лучшее объяснение (https://stackoverflow.com/a/24769534/1185838); вероятно, он должен быть отмечен как ответ вместо моего. Вы также можете сослаться на этот ответ (https://stackoverflow.com/a/463027/1185838), который помог мне лучше понять разница между обозначением двойной и тройной точки.

Приносим извинения за неправильный ответ!


Старый ответ - неверный

Используйте три точки для ссылки на фиксацию, при которой вторая ветвь отклонилась от первой, или в этом случае ваша ветка отклонилась от главной:

git log master...<your_branch_name>

Обязательно используйте в этом случае три периода.

Боковое примечание: вы также можете не указывать имя ветки, поскольку git автоматически ссылается на указатель HEAD в этом случае, например:

git log master...

эквивалентен моему предыдущему примеру. Это работает везде, где доступно сравнение фиксации.

person Matt Meng    schedule 03.01.2013
comment
git log master... у меня НЕ работал, только git log master.. работал. Обратите внимание на две точки вместо трех - person NecipAllef; 08.02.2018
comment
Рад, что это сработало для вас. Double for - это, очевидно, правильный синтаксис. Но будьте осторожны, точки ДЕЙСТВИТЕЛЬНО имеют значение. См. Ответ Алана Томпсона для подробного объяснения разницы между обозначением двойной и тройной точки. - person Matt Meng; 09.02.2018
comment
Это дает мне странные результаты ... В то время как master..mybranch дает 1 (и действительно есть только одна фиксация с момента создания ветки), ваша версия с тремя точками дает мне 35. Откуда это 35, неясно. Похоже, он считает все коммиты, которые произошли master с момента создания ветки. А может и на ветке, и на мастере ... - person Alexander Amelkin; 30.08.2018

Если вы находитесь в созданной вами ветке:

git log master..
person Shaun Luttin    schedule 26.11.2015

Да, можно сравнить вашу «новую» ветку с основной веткой (обычно называемой: «master»):

git log master..<your_branch_name>

Конечно, заменить <your_branch_name>.

person Sandro Munda    schedule 15.03.2012
comment
Это показывает только коммиты с момента последнего извлечения из мастера, или наоборот, что не то же самое, что отображение коммитов с момента создания ветки. - person spiffytech; 21.11.2012

Я мог ошибаться, но я не думаю, что какой-либо из ответов именно запрашивался в OP, поэтому я хотел добавить новый ответ. Я считаю, что это тот же вопрос, что и у меня, поскольку в других системах управления версиями это очень легко сделать.

У меня в МАСТЕРЕ:

«развивать» | -> 'GP603'

В ORIGIN (моя локальная система) у меня есть:

'GP603' [КЛОНИРОВАН из удаленной ветки / GP603]

Затем я выполнил 2 разных коммита. Первая фиксация изменения Файл X. Вторая фиксация изменения Файл X и Файл Y. Через день я хотел просто проверить свое предположение о состоянии локальной ветки ORIGIN / GP603. Это то, что я сделал, чтобы подтвердить, что я помню, как делал только он 2 коммита (которые на самом деле были единственными 2 коммитами в ветке)

$ git log origin / GP.603 ...

(Фиксация 2) фиксация b0ed4b95a14bb1c4438c8b48a31db7a0e9f5c940 (HEAD -> GP.603) Автор: xxxxxxx Дата: Wed xxxxx -0400

1. Fixed defect where the format of the file names and paths were being added to HashTable in such a way that they would never be matched in any comparison.  This was an
defect causing older failed files to never be moved to the correct directory (WindowsServiceApplication.cs)

2. Removing worthless and contextless message as it does nothing but clog the log with garbage making it harder to read (DinoutFileHandler.cs)

(Фиксация 1) фиксация 2c4541ca73eacd4b2e20d89f018d2e3f70332e7e Автор: xxxxxxx Дата: Вт октябрь xxxxx -0400

In ProcessFile() function need to perform a .ToLower() on the file path string when adding it o the failedFiles collection.
person Ethan Hodys    schedule 17.10.2018

Эта команда мне понравилась. Мне было интересно видеть только имена файлов, которые изменились в дельте коммитов между началом и конечной ссылкой,

 git log --no-merges --pretty=oneline --name-only <begin ref>..<end ref>

что дает такой вывод,

<commit hash> <commit subject line>
foo.txtr
bar.txt
person Jose Quijada    schedule 13.10.2020

Я часто попадаю в режим Боже мой, что я наделал. В частности, навязчивый страх касается последних изменений в текущей ветке. Приятно видеть игру коммитов виноватых, которую я делаю следующим образом. (Предполагая, что вы находитесь в текущей ветви интересов и разветвляете ее от dev.)

git log --oneline dev ..

Он дает мне список коммитов, которые я сделал, чтобы вернуться в то место, где хаос, содом и гоморра не являются реальностью. Кроме того, это помогает, если вы одержимы, как обезьяна с СДВГ, на ЛСД. Когда у меня есть список ориентиров, я могу сузить его и проанализировать, как описано в эта статья - внизу есть раздел об ограничении вывода.

person Konrad Viltersten    schedule 15.03.2020