2009-05-19 2 views
745

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

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

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

Если вы пытаетесь для этого в отношении github эта статья проведет вас через это. http://markosullivan.ca/how-to-handle-a-pull-request-from-github/ – johndpope

ответ

910

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

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

Не забудьте прочитать ответ bdonlan «S о результате вишнево-захватывающего в этом посте:
"Pull all commits from a branch, push specified commits to another", где:

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

становится:

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

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

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

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

+1

@ openid000: «более мелкозернистые ветви»: это именно то, что предложил Бдонлан в своем ответе. – VonC

+5

Примечание: «git rebase» также изменяет SHA-1. См. Также «git rebase vs. git merge (http://stackoverflow.com/questions/804115/git-rebase-vs-git-merge) и« git workflow »(http://stackoverflow.com/questions/457927/ git-workflow-and-rebase-vs-merge-questions) для случаев, когда «git rebase» является законным. – VonC

+1

Между «мелкозернистыми ветвями», «вишневым выбором» и «rebase» у вас будут все возможности для управляющий код в ветвях с git. – VonC

487

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

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

+47

+1 для ваш бывший пост по сбору вишни (http: // stackove rflow.com/questions/880957/pull-all-commits-from-a-branch-push-specified-commits-to-another/881014#881014). Я взял на себя смелость скопировать выдержку из моего ответа выше. – VonC

+1

Вероятно, будет работать 'git cherry-pick d42c' или' git cherry-pick d42c3'. Гит умный. ;) – guneysus

+2

да это помогло мне! – Roboblob

9

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

У меня есть филиал, скажем мастер, указывая на X < фиксации-ид>, и у меня есть новый филиал, указывающей до Y < sha1>.

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

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

Шаг 1:

git checkout -b local origin/new 

, где местное это название филиала. Можно указать любое имя.

Шаг 2:

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

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

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

git merge --help 

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

git cherry-pick <commit-id> 
Смежные вопросы