У меня есть две ветви devel
и next
. В devel у меня более или менее огромное количество коммитов. Некоторые из коммитов выбраны из вишни next
. Также я добавил несколько коммитов к следующему, которые объединены с devel
.
Теперь я хотел бы увидеть, чего не хватает next
, чтобы я мог подробно протестировать изменения, прежде чем вносить их next
. Мой вопрос сейчас, как я могу увидеть, какие коммиты есть, devel
а какие нет?
Ответы:
Маленькая команда
git cherry
показывает вам коммиты, которые еще не были выбраны. Документацияgit cherry
находится здесь , но, в общем, вы просто должны быть в состоянии сделать:... и посмотреть вывод примерно так:
Коммиты, которые начинаются с
+
тех, которые вы еще не выбралиnext
. В этом случае, я бы выбрал только один вишневый коммит. Возможно, вы захотите добавить-v
параметр вgit cherry
команду, чтобы он также выводил строку темы каждого коммита.источник
git checkout devel
, вы можете просто сделатьgit cherry next devel
.-v
» ? Вишня без,-v
какls
без-la
. ; -Jcherry
пометить или исключить эквивалентные коммиты?cherry
похоже на сантехническую команду, но не предлагает (кажется) много вариантов. То, что я сейчас нахожусь в центре,git cherry
дает мне ложные срабатывания, но @ sehe'sgit log --cherry-pick
правильно исключает ранее выбранные / перебазированные коммиты.Также вы можете использовать
чтобы получить хороший список фактических различных коммитов, не разделяемых между ветвями.
Оперативное слово
--cherry-pick
Обновить Как упоминалось в комментарии, добавлены последние версии git
--cherry-mark
:источник
Вы можете попробовать сделать подмножества журнала git:
источник
--left-only
было бы лучше). Тем не менее, этот можно немного улучшить, добавив,--no-merges
чтобы пропустить любые коммиты слияния (например, если функция или ветвь исправления были объединены (отдельно) как в devel, так и в next). Строго говоря, конечно, разрешение конфликтов в слияниях может создавать другие различия, но обычно это не так.--no-merges
Вариант может быть успешно применен для других ответов , а также.Как насчет
Результат аналогичен ответу Бирана (различный порядок коммитов), но оба наших ответа приведут к коммитам, которые отличаются между ветвями, скорее просто показывая, что находится в одной ветви, а не в другой.
источник
git log next..
Чтобы получить список коммитов, которые не были интегрированы в ветку релиза (далее), вы можете использовать:
Проверьте git-rev-list для получения дополнительной информации.
источник
next...devel
@Mark Longair прибил это в своем ответе здесь , но я хотел бы добавить некоторую дополнительную информацию.
Связанный и отвечающий на вопрос о том, как разбить большой запрос на извлечение (PR), особенно когда сжатие ваших коммитов нецелесообразно из-за одного или нескольких слияний мастера в ваш feature_branch
Моя ситуация:
я заработал
feature_branch
30 коммитов и открыл запрос на извлечение (PR) на GitHub, чтобы объединить егоmaster
. Филиалmaster
изменил тонну подо мной и получил 200 коммитов, которых у меняfeature_branch
не было. Чтобы разрешить конфликты, которые я сделал,git checkout feature_branch
иgit merge master
объединитьmaster
изменения в своиfeature_branch
. Я предпочел,merge
а не потому, что это может стереть историю комментариев GitHub в PR. Итак, я слил master в свою ветку функций и разрешил конфликты один раз. Все было хорошо. Мой PR, однако, был слишком большим для моих коллег, чтобы рассмотреть. Мне нужно было разделить это. Я пошел, чтобы раздавить мои 30 коммитов и ОН НЕТ! ГДЕ ОНИ? ОНИ ВСЕ ЗАПРЕЩЕНЫ с 200 недавними коммитами, потому что я слился с моимrebase
последнего мастера, поэтому мне придется разрешать конфликты только один раз, а не 30 раз (по одному разу для каждого из моих коммитов). Я не хотел сначала раздавить свои 30 коммитов в 1, а затем перенести на последнийmaster
master
master
feature_branch
! ЧТО МНЕ ДЕЛАТЬ?git cherry
использование в случае, если вы хотите попробоватьgit cherry-pick
отдельные коммиты:git cherry
на помощь (вроде)!Чтобы увидеть все коммиты, которые находятся в,
feature_branch
но НЕ вmaster
я могу сделать:ИЛИ, я могу проверить коммиты из ЛЮБОГО ветвления с ВНИМАНИЕМ, гарантируя, что я
feature_branch
первым делаюgit cherry [upstream_branch] [feature_branch]
, как это. Опять же, это проверяет, какие коммиты есть,feature_branch
но нетupstream_branch
(master
в этом случае):Добавление
-v
также показывает строки темы сообщения о коммите:Трубопровод к «подсчету слов» «-lines» (
wc -l
) подсчитывает, сколько существует коммитов :Вы можете сравнить это количество с номером коммита, показанным в вашем GithHub PR, чтобы почувствовать себя лучше, зная, что он
git cherry
действительно работает. Вы также можете сравнить git-хэши один за другим и посмотреть, совпадают ли они сgit cherry
GitHub. Обратите внимание , чтоgit cherry
не будет рассчитывать любые слияния фиксаций, вы слитыmaster
вfeature_branch
, но GitHub ВОЛЯ. Так что, если вы видите небольшое расхождение в подсчете, поищите на странице коммита GitHub PR слово «слияние», и вы, вероятно, увидите, что это виновник, которого не видноgit cherry
. Пример: коммит под названием «Объединить ветку 'master' в feature_branch" будет отображаться в GitHub PR, но не при запускеgit cherry master feature_branch
. Это нормально и ожидаемо.Итак, теперь у меня есть способ выяснить, какие различия я хочу выбрать из вишни на новую ветку функций, чтобы разделить эту разницу: я могу использовать
git cherry master feature_branch
локально или посмотреть коммиты в GitHub PR.Как может помочь раздавливание - если бы мы только могли раздавить:
Однако, чтобы разделить мой большой дифференциал, нужно разделить все 30 моих коммитов на один, залатать их в новую ветвь функций, мягко сбросить коммит патча, а затем использовать
git gui
для добавления фрагментов файл за файлом, кусок за кусок или построчно. Как только я получу одну подфункцию, я могу зафиксировать то, что я добавил, затем проверить новую ветку, добавить еще несколько, зафиксировать, проверить новую ветку и т. Д., Пока моя большая функция не будет разбита на несколько подфункций. , Проблема в том, что мои 30 коммитов смешаны с другими 200 коммитами от других людей из-за моегоgit merge master
в мойfeature_branch
, поэтому перебазировка нецелесообразна, так как мне пришлось бы просеять 230 коммитов, чтобы переупорядочить и раздавить мои 30 коммитов.Как использовать файл патча как гораздо более простую замену сквошу:
Обходной путь - просто получить файл патча, содержащий «эквивалент сквоша» из всех 30 моих коммитов, патчить его на новый
master
ветвь (новую ветвь подфункции) и работать оттуда следующим образом:Теперь у меня есть 30-коммитный патч, примененный локально, но без изменений и без изменений.
Теперь используйте,
git gui
чтобы добавить файлы, чанки и / или строки и разбить ваш большой PR или «diff»:Обратите внимание, что если у вас его нет
git gui
, вы можете легко установить его в Ubuntu с помощьюsudo apt install git-gui
.Теперь я могу запустить
git gui
и начать добавлять файлы, чанки и / или строки (щелкнув правой кнопкой мыши в программе git GUI), и разбить ветвь функции 30 коммитов на подветви, как описано выше, многократно добавляя, фиксируя, затем разветвляясь ветвь новой функции и повторение этого цикла, пока все изменения не будут добавлены в ветку подфункции, и моя функция 30 коммитов успешно разбита на 3 или 4 подфункции. Теперь я могу открыть отдельный PR для каждой из этих подфункций, и моей команде будет легче их просматривать.Ссылки:
источник