Как слить конкретную фиксацию в Git

Я разветкил ветку из репозитория в GitHub и совершил что-то конкретное для меня. Теперь я обнаружил, что исходный репозиторий имел хорошую функцию, которая была в HEAD.

Я хочу объединить его только без предыдущих коммитов. Что я должен делать? Я знаю, как объединить все коммиты:

git branch -b a-good-feature
git pull repository master
git checkout master
git merge a-good-feature
git commit -a
git push

Ответ 1

'git cherry-pick' должен быть вашим ответом здесь.

Применить изменение, введенное существующей фиксацией.

Не забудьте прочитать bdonlan ответ о последствиях вишневого сбора в этом посте:
"Потяните все фиксации из ветки, нажимайте указанные фиксации на другую" , где:

A-----B------C
 \
  \
   D

становится:

A-----B------C
 \
  \
   D-----C'

Проблема с этим коммиттом заключается в том, что git считает, что коммит включает всю историю перед ними

Где C 'имеет другой идентификатор SHA-1.
Аналогично, вишня, собирающая фиксацию из одной ветки в другую, в основном включает в себя создание патча, а затем его применение, тем самым также теряя историю.

Это изменение идентификаторов фиксации ломает git функцию объединения между прочим (хотя, если использовать экономно, есть эвристика, которая будет обрабатывать это). Что еще более важно, но игнорирует функциональные зависимости - если C фактически использовал функцию, определенную в B, вы никогда не узнаете.

Ответ 2

Вы можете использовать git cherry-pick, чтобы применить отдельную фиксацию самостоятельно к вашей текущей ветке.

Пример: git cherry-pick d42c389f

Ответ 3

Попробуем взять пример и понять:

У меня есть ветвь, скажем master, указывая на X < commit-id > , и у меня есть новая ветвь, указывающая на Y < sha1 > .

Где Y < commit-id >= <master> ответвление завершается - несколько коммитов

Теперь скажем, что для ветки Y я должен закрыть закрытие коммитов между главной ветвью и новой ветвью. Ниже приведена процедура, которую мы можем выполнить:

Шаг 1:

git checkout -b local origin/new

где local - имя ветки. Можно указать любое имя.

Шаг 2:

  git merge origin/master --no-ff --stat -v --log=300

Объединить коммиты от главной ветки к новой ветке, а также создать комманду фиксации сообщения журнала с однострочными описаниями не более <n> фактических коммитов, которые объединяются.

Для получения дополнительной информации и параметров о слиянии Git обратитесь к:

git merge --help

Также, если вам нужно объединить определенное коммит, вы можете использовать:

git cherry-pick <commit-id>