Как узнать, какие коммиты в одной ветке не находятся в другом?

У меня две ветки devel и next. В devel у меня есть более или менее огромное количество коммитов. Некоторые из коммитов - это вишня, собранная в next. Также я добавил некоторые коммиты для следующего, которые объединены с devel.

Теперь я хотел бы видеть, чего не хватает в next, поэтому я могу проверить изменения подробно, прежде чем приносить их в next. Теперь мой вопрос: как я могу узнать, какие коммиты находятся в devel, но не в следующем?

Ответ 1

Маленькая команда git cherry показывает вам фиксации, которые еще не выбраны. Документация для git cherry здесь, но, короче говоря, вы должны просто иметь возможность:

git checkout devel
git cherry next

... и см. вывод немного так:

+ 492508acab7b454eee8b805f8ba906056eede0ff
- 5ceb5a9077ddb9e78b1e8f24bfc70e674c627949
+ b4459544c000f4d51d1ec23f279d9cdb19c1d32b
+ b6ce3b78e938644a293b2dd2a15b2fecb1b54cd9

Комиты, начинающиеся с +, будут теми, что вы еще не выбрали в червях в next. В этом случае я бы только вишневый захват до сих пор. Возможно, вы захотите добавить параметр -v в команду git cherry, чтобы он также выводил строку темы каждой фиксации.

Ответ 2

Кроме того, вы можете использовать

git log --left-right --graph --cherry-pick --oneline devel...next

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

Оперативное слово --cherry-pick

--cherry-pick

Опустить любое коммитирование, которое вводит то же изменение, что и другое совершение на "другой стороне", когда набор коммитов ограничен симметричной разницей. Например, если у вас есть две ветки, A и B, обычный способ перечислить все коммиты только с одной стороны - с -left-right, как в приведенном выше примере описания этого параметра. Тем не менее, он показывает фиксации, которые были выбраны из другой ветки (например, "3-й на b" может быть выбран из вишни из ветки A). С помощью этой опции такие пары коммитов исключаются из вывода.

Обновить Как упоминалось в комментарии, последние версии git добавлены --cherry-mark:

--cherry-mark

Подобно -cherry-pick (см. ниже), но отмечайте эквивалентные коммиты с =, а не опуская их, и неэквивалентные с +.

Ответ 3

Вы могли бы попробовать сделать git лог-подмножества:

git log --oneline devel ^next

Ответ 4

Как насчет

git log next..devel

Результат аналогичен ответу Byran (разный порядок коммитов), но оба наших ответа будут создавать коммиты, которые отличаются между ветвями, а просто показывают, что в одной ветки, а не в другой.

Ответ 5

Чтобы получить список коммитов, которые не были интегрированы в ветвь выпуска (далее), вы можете использовать:

git rev-list --reverse --pretty="TO_TEST %h (<%ae>) %s" --cherry-pick --right-only origin/release_branch...origin/development_branch | grep "^TO_TEST " > NotIntegratedYet.txt

Подробнее о git-rev-list.