Как узнать, какие коммиты в одной ветке не находятся в другом?
У меня две ветки 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.