Как объединить конкретный коммит в Git - PullRequest
911 голосов
/ 19 мая 2009

Я разветвил ветку из репозитория в 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

Ответы [ 3 ]

1077 голосов
/ 19 мая 2009

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

Применить изменения, внесенные существующим коммитом.

Не забудьте прочитать ответ bdonlan о последствиях сбора вишни в этом посте:
«Извлечь все коммиты из ветви, нажать указанные коммиты в другую» , где:

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

становится:

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

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

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

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

638 голосов
/ 19 мая 2009

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

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

25 голосов
/ 27 мая 2016

Давайте попробуем взять пример и понять:

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

Где Y <идентификатор-коммита> = фиксация ветки - мало коммитов

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

Шаг 1:

git checkout -b local origin/new

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

Шаг 2:

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

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

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

git merge --help

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

git cherry-pick <commit-id>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...