Ведущие ответы описывают, как применить изменения от конкретного коммита к текущей ветви. Если это то, что вы подразумеваете под «как объединить», тогда просто используйте cherry-pick, как они предлагают.
Но если вы действительно хотите слияние , то есть вы хотите новый коммит с двумя родителями - существующий коммит в текущей ветке и коммит, из которого вы хотите применить изменения - тогда вишневый выбор этого не сделает.
Наличие истинной истории слияния может быть желательным, например, если ваш процесс сборки использует преимущество git-предков для автоматической установки строк версий на основе последнего тега (using git describe
).
Вместо cherry-pick вы можете сделать фактический git merge --no-commit
, а затем вручную настроить индекс, чтобы удалить любые изменения, которые вам не нужны.
Предположим, вы находитесь на ветке A
и хотите объединить коммит в конце ветки B
:
git checkout A
git merge --no-commit B
Теперь вы настроены на создание коммита с двумя родителями, с текущим коммитом коммитов A
и B
. Однако к вам может быть применено больше изменений, чем вы хотите, в том числе от предыдущих коммитов в ветке B. Вам нужно отменить эти нежелательные изменения, а затем зафиксировать.
(Там может быть простой способ установить состояние рабочего каталога и индекса обратно, как это было до слияния, так что у вас есть чистый лист, на котором можно выбрать коммит, который вы хотели в первую очередь. Но Я не знаю, как добиться этого с чистого листа. git checkout HEAD
И git reset HEAD
оба уберут состояние слияния, нанося поражение цели этого метода.)
Так что вручную отмените нежелательные изменения. Например, вы могли бы
git revert --no-commit 012ea56
за каждый нежелательный коммит 012ea56
.
Когда вы закончите настройку, создайте свой коммит:
git commit -m "Merge in commit 823749a from B which tweaked the timeout code"
Теперь у вас есть только то изменение, которое вы хотели, и дерево предков показывает, что вы технически слились с B.