Какой хороший способ выбрать все отсутствующие коммиты автора в одной ветке в другую

Скажем, я сделал кучу изменений в master. Но я хочу добавить к нему все те, что не в ветке: выпуск-5.


person smartnut007    schedule 09.05.2014    source источник
comment
Почему бы вам просто не объединить master со своей веткой?   -  person poke    schedule 09.05.2014
comment
Не спрашивай... Я задаюсь тем же вопросом. Но, помимо сути.   -  person smartnut007    schedule 09.05.2014
comment
Просто выберите их все, если память не играет со мной гадких трюков, любые уже примененные будут проигнорированы.   -  person jthill    schedule 09.05.2014


Ответы (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, который делает все за вас.

person FelipeC    schedule 10.05.2014
comment
Я не нашел вариантов для cherry-pick --skip-empty, здесь что-то не так? - person William Leung; 06.12.2016
comment
Это один из вариантов, который у меня есть в моем форке Git. К сожалению, исходный Git не объединил патч. Это просто означает, что вам нужно вручную пропускать пустые коммиты. - person FelipeC; 22.12.2016
comment
возможно, я нашел лучшее решение, используя rev-list для фильтрации пустых коммитов, см. stackoverflow.com/questions/40988113/ - person William Leung; 22.12.2016
comment
Святая корова. Это приносит приз. Вот команда, которая работает только в моем частном форке git. - person Warren P; 11.03.2019
comment
Первый кусок - тот, который имеет значение. Второй кусок предназначен только для того, чтобы увидеть, что будет делать первый, и он будет работать, если вы не используете --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

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

person poke    schedule 09.05.2014