Слить конкретное изменение в коммите из другой ветки

Я хочу объединить изменение в фиксации ветки разработки с другой веткой, используя git. Я пробовал git cherry-pick, но это приводит к изменению всего файла, а не отдельных изменений. Кто-нибудь может с этим помочь?


1
105
1

Ответ:

Следует иметь в виду, что фиксация - это наименьшая единица, учитываемая при принятии решения о том, что «уже слито». Таким образом, существует компромисс: если вы не создадите отношения слияния, вы вполне можете получить ложный конфликт слияния в дальнейшем, но если вы делать создадите отношения слияния между ветвями только для одного изменения, это, скорее всего, привести к тому, что какое-то будущее слияние не сможет принять другие изменения.

В 99% случаев не создание отношений слияния - меньшее зло здесь, и поэтому я бы сказал, что вы на правильном пути с cherry-pick.

Следующим шагом будет получение Только желаемого изменения. Самый простой способ - использовать опцию --no-commit (или -n):

git cherry-pick -n <commit-id>

Тогда изменения из целевой фиксации будут поставлены, но не зафиксированы. Вы можете удалить изменения в других файлах с помощью

git reset HEAD -- path/to/other/file
git checkout -- path/to/other/file

Если нужное изменение находится в том же файле, что и другие изменения, вы можете деактивировать файл, а затем повторно выполнить его в «интерактивном» режиме с помощью

git reset HEAD -- path/to/file
git add -i path/to/file

(Подробнее об интерфейсе «интерактивного добавления» см. https://git-scm.com/docs/git-add. У него есть несколько способов выбрать, какие изменения следует включить.

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