Скажем, я сделал кучу изменений в master. Но я хочу добавить к нему все те, что не в ветке: выпуск-5.
Какой хороший способ выбрать все отсутствующие коммиты автора в одной ветке в другую
Ответы (2)
Вы можете выбрать вишню, но было бы намного проще, если бы вы перебазировали:
git checkout -b missing-commits master
git rebase -i --author=me release-5
Все коммиты уже в версии 5 не будут выбраны, а будут выбраны только ваши коммиты. После этого вы можете объединить недостающие коммиты ветки с выпуском 5.
При этом вы можете использовать вишневый выбор:
git cherry-pick --skip-empty --cherry-pick --no-merges --right-only --topo-order --do-walk master...release-5
Как вы можете видеть, гораздо проще использовать git rebase
, который делает все за вас.
cherry-pick --skip-empty
, здесь что-то не так?
- person William Leung; 06.12.2016
rev-list
для фильтрации пустых коммитов, см. stackoverflow.com/questions/40988113/
- person William Leung; 22.12.2016
--skip-empty
(и нет пустых коммитов). Я ответил на вопрос и объяснил, что Git делает внутри, и как вы могли бы сделать то же самое, если сообщество Git применило мой патч, но они этого не сделали. У меня применено 400 коммитов, конкретно этого не было. Что еще вы хотите, чтобы я сделал?
- person FelipeC; 28.03.2019
Весь смысл вишневого выбора заключается в том, что вы можете выбрать конкретное подмножество коммитов, которые хотите скопировать в свою ветку. Он существует явно, потому что есть ситуации, в которых вы не хотите интегрировать все коммиты из другой ветки с помощью слияния.
Теперь, если вы окажетесь в ситуации, когда вы хотите выбрать все коммиты, которые находятся в какой-то другой ветке, то вы точно находитесь в ситуации слияния, когда вы просто хотите объединить эту ветку в ваша текущая ветка для интеграции всех изменений:
git checkout release-5
git merge master
При этом синтаксис диапазона ревизий A..B
позволяет указать коммиты, доступные из B
, но не доступные из A
. Итак, в вашем случае вы хотели бы использовать release-5..master
для выбора всех коммитов, которые находятся на master
, но недоступны из вашей ветки release-5
:
git cherry-pick release-5..master
Но опять же, если вам просто нужно все это, слияние — абсолютно лучший вариант, потому что он не будет дублировать коммиты и сохранит реальную доступную историю.