2010-03-19 13 views
455

Ho due rami dal mio maestro:Come copiare i commit da un ramo all'altro?

  • v2.1: (versione 2) Ho lavorato per diversi mesi
  • WSS: che ho creato ieri aggiungere una caratteristica specifica per il mio master (in produzione)

C'è un modo per copiare i commit di ieri da wss a v2.1?

+0

Per copiare semplicemente i commit (o un intervallo di commit) da un ramo all'altro, questa risposta mi ha aiutato meglio: http://stackoverflow.com/questions/1994463/how-to-cherry-pick-a-range-of -commits-and-merge-into-another-branch/1994491 # 1994491 – caramba

+0

[Cherry-Picking commits specifici da un altro ramo] (https://ariejan.net/2010/06/10/cherry-picking-specific-commits- from-another-branch /) – KyleMit

risposta

391

Si dovrebbe davvero avere un flusso di lavoro che ti permette di fare tutto questo con la fusione:

- x - x - x (v2) - x - x - x (v2.1) 
      \ 
      x - x - x (wss) 

Quindi tutto quello che dovete fare è git checkout v2.1 e git merge wss. Se per qualche motivo non puoi davvero farlo, e non puoi usare git rebase per spostare il tuo ramo wss nel posto giusto, il comando per prendere un singolo commit da qualche parte e applicarlo altrove è git cherry-pick. Basta controllare il ramo su cui si desidera applicarlo ed eseguire git cherry-pick <SHA of commit to cherry-pick>.

Alcuni dei modi REBASE potrebbe risparmiare:

Se la vostra storia è simile al seguente:

- x - x - x (v2) - x - x - x (v2.1) 
      \ 
      x - x - x (v2-only) - x - x - x (wss) 

Si potrebbe utilizzare git rebase --onto v2 v2-only wss per spostare WSS direttamente su v2:

- x - x - x (v2) - x - x - x (v2.1) 
      |\ 
      | x - x - x (v2-only) 
      \ 
      x - x - x (wss) 

Poi puoi unire! Se davvero, davvero, davvero non può arrivare al punto in cui è possibile unire, è ancora possibile utilizzare rebase per fare in modo efficace diversi ciliegio-picks in una sola volta:

# wss-starting-point is the SHA1/branch immediately before the first commit to rebase 
git branch wss-to-rebase wss 
git rebase --onto v2.1 wss-starting-point wss-to-rebase 
git checkout v2.1 
git merge wss-to-rebase 

Nota: la ragione che ci vuole un po 'di lavoro in più per farlo è che sta creando commit duplicati nel tuo repository. Non è davvero una buona cosa - l'intero punto di facile ramificazione e fusione è di essere in grado di fare qualsiasi cosa, commettendo uno o più ordini e unendoli in qualunque posto siano necessari. Duplicate commits significano l'intento di non unire mai questi due rami (se decidi di volere più tardi, otterrai conflitti).

+1

Non potrei essere più d'accordo con questa risposta. +1. Vedi anche la mia vecchia risposta per illustrare le conseguenze del cherry-picking: http://stackoverflow.com/questions/881092/how-to-merge-a-specific-commit-in-git/881112#881112 – VonC

+9

Risposta superba su come per fare questo il modo * corretto *! Vorrei poter votare due volte anche per lo sforzo di creare diagrammi ASCII. – gotgenes

+0

@VonC: Grazie per il supporto e le informazioni aggiuntive sul perché non scegliere il ciliegio - So di aver lesinato un po 'lì. @gotgenes: Grazie! Penso che ne valga la pena, basta guardare la pagina man di git-rebase. Non c'è modo migliore di spiegarlo. – Cascabel

12

È possibile create a patch dai commit che si desidera copiare e apply the patch nel ramo di destinazione.

+12

Anche se per qualche motivo vuoi veramente usare patch (es) invece di cherry-pick (s)/rebase, il modo più semplice per farlo è con 'git format-patch 'e' git am * .patch'. – Cascabel

559

Usa

git cherry-pick <commit> 

da applicare al vostro <commit>ramo corrente.

Io stesso probabilmente verificherei i controlli che seleziono in gitk e li seleziono con clic destro sulla voce di commit.


Se vuoi andare più automatico (con tutti i suoi pericoli) e assumendo tutti i commit da ieri è accaduto il WSS si potrebbe generare l'elenco dei commit che utilizzano git log con (--pretty suggerito da Jefromi)

git log --reverse --since=yesterday --pretty=%H 

quindi tutto insieme a patto di utilizzare bash

for commit in $(git log --reverse --since=yesterday --pretty=%H); 
do 
    git cherry-pick $commit 
done 

Se qualcosa va storto qui (c'è un sacco di potenziale) sei nei guai visto che questo funziona sulla cassa del live, quindi o fai dei cherry-pick manuali o usa rebase come suggerito da Jefromi.

+1

La versione più breve che stai cercando è 'git log --since = yesterday --reverse --pretty =% H'. – Cascabel

+9

@Jefromi Grazie, questa è una bandiera utile 'carina'. Risposta aggiornata –

+0

Tutti i segnaposto per l'opzione --pretty si trovano nella manpage git-log. È possibile ottenere qualsiasi formato desiderato, particolarmente utile per ottenere i campi desiderati per uno script in un formato facilmente analizzabile. – Cascabel

9

Oppure se sei poco meno dalla parte dell'evangelista, puoi usare un po 'brutto che sto usando. In deploy_template ci sono impegna voglio copiare il mio padrone come ramo distribuire

git branch deploy deploy_template 
git checkout deploy 
git rebase master 

Questo creerà nuova Deploy ramo (io uso -f sovrascrivere esistente distribuire ramo) su deploy_template, allora REBASE questo nuovo ramo sul maestro, lasciando deploy_template non toccato.

Problemi correlati