2009-05-19 25 views
745

Ho biforcato un ramo da un repository in GitHub e ho commesso qualcosa di specifico per me. Ora ho trovato che il repository originale aveva una buona funzionalità che era a HEAD.Come unire un commit specifico in Git

Voglio unirlo solo senza precedenti commit. Cosa dovrei fare? Ho saputo unire tutti i commit:

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

Se stai cercando per fare questo in relazione a Github, questo articolo ti guiderà attraverso. http://markosullivan.ca/how-to-handle-a-pull-request-from-github/ – johndpope

risposta

910

'git cherry-pick' dovrebbe essere la risposta qui.

Applicare la modifica introdotta da un commit esistente.

Non dimenticate di leggere la risposta bdonlan s' circa la conseguenza di cherry-picking in questo post:
"Pull all commits from a branch, push specified commits to another", dove:

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

diventa:

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

Il problema con questo commit è che git considera commit di includere tutta la cronologia prima di loro

Dove C 'ha un ID diverso SHA-1.
Allo stesso modo, il cherry picking di un commit da un ramo ad un altro consiste essenzialmente nel generare una patch, quindi nell'applicarla, perdendo così anche la cronologia.

Questa modifica degli ID di commit interrompe le funzionalità di fusione di git tra le altre cose (anche se se usato con parsimonia ci sono euristiche che copriranno questo aspetto).
Ancora più importante, tuttavia, ignora le dipendenze funzionali: se C ha effettivamente utilizzato una funzione definita in B, non si conoscerà mai.

+1

@ openid000: "rami grana più fine": che è davvero esattamente quello bdonlan suggerito nella sua risposta. – VonC

+5

Nota: "git rebase" cambia anche SHA-1. Vedi anche "git rebase vs. git merge" (http://stackoverflow.com/questions/804115/git-rebase-vs-git-merge) e "git workflow" (http://stackoverflow.com/questions/457927/ git-workflow-and-rebase-vs-merge-questions) per i casi in cui "git rebase" è legittimo – VonC

+1

Tra "rami a grana fine", "cherry-pick" e "rebase", avrai tutte le possibilità per gestire il codice nelle filiali con git. – VonC

487

È possibile utilizzare git cherry-pick per applicare un singolo commit da solo al ramo corrente.

Esempio: git cherry-pick d42c389f

+47

+1 per il tuo precedente post su cherry picking (http: // stackove rflow.com/questions/880957/pull-all-commits-from-a-branch-push-specified-commits-to-another/881014#881014). Mi sono preso la libertà di copiare un estratto di esso nella mia risposta sopra. – VonC

+1

Probabilmente 'git cherry-pick d42c' o' git cherry-pick d42c3' funzionerà. Git è intelligente. ;) – guneysus

+2

sì, questo mi ha aiutato! – Roboblob

9

Proviamo a fare un esempio e capire:

ho un ramo, dire maestro, indicando X < commit-id>, e ho una nuova punta ramo a Y < sha1>.

Dove Y < commit-id> = < maestro> ramo impegna - pochi commit

Ora dire alla succursale Y devo gap da vicino i commit tra il ramo principale e la nuova filiale. Qui di seguito è la procedura possiamo seguire:

Fase 1:

git checkout -b local origin/new 

dove locale è il nome del ramo. Qualsiasi nome può essere dato.

Fase 2:

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

unire i commit dal branch master per nuova filiale e anche creare una stampa di commit di messaggio di log con le descrizioni di una sola riga da al massimo < n> commit reali che sono stati uniti.

Per ulteriori informazioni e parametri su Git unione, si prega di fare riferimento a:

git merge --help 

Inoltre se avete bisogno di unire una specifica commit, quindi è possibile utilizzare:

git cherry-pick <commit-id> 
Problemi correlati