Ho BranchA
113 impegni in anticipo BranchB
.
Ma voglio solo gli ultimi 10 o giù di lì impegna da BranchA
fuse in BranchB
.
C'è un modo per fare questo?
Ho BranchA
113 impegni in anticipo BranchB
.
Ma voglio solo gli ultimi 10 o giù di lì impegna da BranchA
fuse in BranchB
.
C'è un modo per fare questo?
Risposte:
Il git cherry-pick <commit>
comando ti consente di eseguire un singolo commit (da qualsiasi ramo) e, essenzialmente, di modificarlo nel tuo ramo di lavoro.
Il capitolo 5 del libro Pro Git lo spiega meglio di me , completo di diagrammi e simili. ( Anche il capitolo su Rebasing è una buona lettura.)
Infine, ci sono alcuni buoni commenti sulla raccolta delle ciliegie contro la fusione e la riformulazione in un'altra domanda SO .
A
è ramificata fuori di master
e fare un po 'di lavoro su di esso, creando commit bambino B
attraverso E
. Say E
ha solo 1 riga aggiunta da D
. Se git cherry-pick E
in master
, non si applica tutti i cambiamenti da A
tramite E
nel master
ramo, o lo fa solo applicare la modifica da D
a E
, vale a dire, ma aggiunge solo che 1 linea per master
? Se il caso è il primo, come posso ottenere il secondo? (a parte copiare e incollare manualmente)
Se BranchA non è stato trasferito su un telecomando, è possibile riordinare i commit utilizzando rebase
e quindi semplicemente merge
. E 'preferibile utilizzare merge
più di rebase
quando possibile, poiché non crea commit duplicati.
git checkout BranchA
git rebase -i HEAD~113
... reorder the commits so the 10 you want are first ...
git checkout BranchB
git merge [the 10th commit]
FONTE: https://git-scm.com/book/en/v2/Distributed-Git-Maintain-a-Project#Integrating-Contributed-Work
L'altro modo per spostare il lavoro introdotto da un ramo all'altro è quello di selezionarlo. Una scelta di ciliegie in Git è come un rebase per un singolo commit. Prende la patch introdotta in un commit e tenta di riapplicarla sul ramo in cui ci si trova attualmente. Questo è utile se hai un certo numero di commit su un ramo di argomento e vuoi integrarne solo uno o se hai un solo commit su un ramo di argomento e preferisci selezionarlo piuttosto che eseguire rebase. Ad esempio, supponiamo di avere un progetto simile al seguente:
Se vuoi inserire commit e43a6 nel tuo ramo master, puoi eseguirlo
$ git cherry-pick e43a6
Finished one cherry-pick.
[master]: created a0a41a9: "More friendly message when locking the index fails."
3 files changed, 17 insertions(+), 3 deletions(-)
Questo tira la stessa modifica introdotta in e43a6, ma ottieni un nuovo valore di commit SHA-1, perché la data applicata è diversa. Ora la tua storia è simile a questa:
Ora puoi rimuovere il ramo dell'argomento e rilasciare i commit che non volevi inserire.