È assolutamente necessario lavorare su più bug contemporaneamente? E per "subito" intendo "avere file modificati per più bug contemporaneamente". Perché a meno che tu non ne abbia assolutamente bisogno, lavorerei solo su un bug alla volta nel tuo ambiente. In questo modo è possibile utilizzare filiali e rebase locali, che trovo molto più facili rispetto alla gestione di una scorta / fase complessa.
Supponiamo che il master sia in commit B. Ora lavora al bug n. 1.
git checkout -b bug1
Ora sei sul branch bug1. Apporta alcune modifiche, esegui il commit, attendi la revisione del codice. Questo è locale, quindi non stai influenzando nessun altro, e dovrebbe essere abbastanza facile creare una patch da git diffs.
A-B < master
\
C < bug1
Ora stai lavorando su bug2. Andare di nuovo a letto con git checkout master
. Fare un nuovo ramo, git checkout -b bug2
. Apporta modifiche, esegui il commit, attendi la revisione del codice.
D < bug2
/
A-B < master
\
C < bug1
Facciamo finta che qualcun altro impegna E&F sul master mentre stai aspettando la revisione.
D < bug2
/
A-B-E-F < master
\
C < bug1
Quando il tuo codice è stato approvato, puoi rifarlo su Master per procedere come segue:
git checkout bug1
git rebase master
git checkout master
git merge bug1
Ciò comporterà quanto segue:
D < bug2
/
A-B-E-F-C' < master, bug1
Quindi è possibile inviare, eliminare il ramo bug1 locale e il gioco è fatto. Un bug alla volta nell'area di lavoro, ma con l'utilizzo di filiali locali il repository può gestire più bug. E questo evita un complicato ballo di scena / scorta.
Rispondi alla domanda di ctote nei commenti:
Bene, puoi tornare allo stashing per ogni bug e lavorare solo con un bug alla volta. Atleast che ti salva il problema della messa in scena. Ma dopo averlo provato, lo trovo personalmente problematico. Gli stash sono un po 'disordinati in un grafico di log git. E, soprattutto, se rovini qualcosa non puoi tornare indietro. Se hai una directory di lavoro sporca e fai scoppiare una scorta, non puoi "annullare" quel pop. È molto più difficile rovinare i commit già esistenti.
Così git rebase -i
.
Quando si ribatte un ramo su un altro, è possibile farlo in modo interattivo (il flag -i). Quando lo fai, hai la possibilità di scegliere cosa vuoi fare con ogni commit. Pro Git è un libro fantastico che è anche online in formato HTML e ha una bella sezione su rebasing e squashing:
http://git-scm.com/book/ch6-4.html
Ruberò il loro esempio alla lettera per comodità. Fai finta di avere la seguente cronologia di commit e desideri rifare e schiacciare il bug1 sul master:
F < bug2
/
A-B-G-H < master
\
C-D-E < bug1
Ecco cosa vedrai quando digiti git rebase -i master bug1
pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Per schiacciare tutti i commit di una diramazione in un singolo commit, mantieni il primo commit come "pick" e sostituisci tutte le successive voci "pick" con "squash" o semplicemente "s". Avrai anche l'opportunità di cambiare il messaggio di commit.
pick f7f3f6d changed my name a bit
s 310154e updated README formatting and added blame
s a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
Quindi sì, schiacciare è un po 'una seccatura, ma lo consiglierei comunque su un uso pesante delle scorte.