Dal libro Git SCM :
Spesso, quando hai lavorato su una parte del tuo progetto, le cose sono in uno stato disordinato e vuoi cambiare un po 'i rami per lavorare su qualcos'altro. Il problema è che non vuoi impegnarti a metà del lavoro solo per tornare più tardi a questo punto. La risposta a questo problema è il comando git stash.
Lo stashing prende lo stato sporco della directory di lavoro, ovvero i file tracciati modificati e le modifiche graduali, e lo salva su una serie di modifiche non completate che è possibile riapplicare in qualsiasi momento.
Data questa descrizione, direi che si tratta di un modello anti. Una spiegazione eccessivamente semplificata di Git Stash sarebbe che si tratta del "taglia e incolla" del controllo del codice sorgente. Prendi un sacco di file modificati, li "nascondi" in una penna di tenuta al di fuori del normale flusso di lavoro di ramificazione di Git, quindi riapplica quelle modifiche a un ramo diverso in un secondo momento.
Tornando un po 'oltre, impegnarsi a padroneggiare è l'anti schema qui. Usa i rami. Questo è quello per cui sono stati progettati.
Si riduce davvero a questo:
Puoi martellare una vite nel muro e si terrà una foto, ma usare un cacciavite è ciò che dovresti fare. Non usare un martello quando il cacciavite è seduto proprio accanto a te.
Informazioni sul commit del codice "non funzionante"
Mentre quanto segue è opinione, sono arrivato a questa opinione per esperienza.
Impegnarsi presto e impegnarsi spesso. Impegna tutto il codice non funzionante che desideri. Visualizza la cronologia di commit locale come "punti di salvataggio" mentre fai qualcosa. Dopo aver svolto un lavoro logico, fai un commit. Certo, potrebbe spezzare tutto, ma non importa se non spingi questi impegni. Prima di spingere, rebase e schiaccia i tuoi commit.
- Crea una nuova filiale
- Hack hack hack
- Commettere codice non funzionante
- Lucida il codice e fallo funzionare
- Commettere il codice di lavoro
- Rebase e Squash
- Test
- Spingere al superamento dei test
Per l'OP, questo thread di messaggi kernal di Linux potrebbe essere interessante, perché sembra che alcuni membri del team dell'OP stiano usando Git in modo simile.
@RibaldEddie ha detto in un commento qui sotto:
Prima di tutto, una scorta non è al di fuori di un "flusso di lavoro ramificato" poiché sotto il cofano una scorta è solo un altro ramo.
(a rischio di incorrere nell'ira di molte persone)
Linus disse:
Con "git stash", puoi avere anche più cose stash diverse, ma non si mettono in coda l'una sull'altra - sono solo patch indipendenti casuali che hai nascosto perché erano scomode a un certo punto.
Quello che penso che @RibaldEddie sta cercando di dire è che è possibile utilizzare git stash
in un flusso di lavoro del ramo delle funzionalità - e questo è vero. Non è l'uso di git stash
questo è il problema. È la combinazione di impegnarsi a padroneggiare e usare git stash
. Questo è un modello anti.
chiarire git rebase
Dal commento di @ RibaldEddie:
Il rifacimento è molto più simile al copia-incolla e ancora peggio modifica la cronologia impegnata.
(Enfasi mia)
La modifica della cronologia di commit non è una cosa negativa, purché si tratti di cronologia di commit locale . Se rebase si impegna per aver già spinto, in sostanza rimarrai orfano chiunque utilizzi il tuo ramo. Questo non va bene.
Ora, supponi di aver fatto diversi commit nel corso di una giornata. Alcuni impegni sono stati buoni. Alcuni ... non così bene. Il git rebase
comando in combinazione con la compressione dei commit è un buon modo per ripulire la cronologia dei commit locali. È bello unirsi in un commit per le filiali pubbliche perché mantiene pulita la cronologia delle commit delle filiali condivise del tuo team. Dopo il rebasing, ti consigliamo di eseguire nuovamente il test, ma se i test vengono superati puoi eseguire un commit pulito anziché più sporco.
C'è un altro thread del kernel Linux interessante nella cronologia di commit pulita .
Ancora una volta, da Linus:
Voglio una storia pulita, ma ciò significa davvero (a) storia pulita (b).
Le persone possono (e probabilmente dovrebbero) rifare il proprio albero privato (il proprio lavoro). Questa è una pulizia . Ma mai il codice di altre persone. Questa è una "storia distrutta"
Quindi la parte della storia è abbastanza semplice. C'è solo una regola principale e un piccolo chiarimento:
Non devi mai MAI distruggere la storia di altre persone. Non devi reimpostare gli impegni presi da altre persone. Fondamentalmente, se non ha il tuo consenso, è vietato: non puoi rifarlo, perché non è tuo.
Si noti che si tratta davvero della storia di altre persone , non del codice di altre persone . Se ti hanno inviato materiale come patch via e-mail e l'hai applicato con "git am -s", allora è il loro codice, ma è la
tua cronologia.
Quindi puoi scatenarti sulla cosa "git rebase", anche se non hai scritto il codice, purché il commit stesso sia il tuo privato.
Minori chiarimenti sulla regola: una volta che hai pubblicato la tua cronologia in un sito pubblico, altre persone potrebbero usarla, quindi ora chiaramente non è più la tua storia privata .
Quindi il piccolo chiarimento è che non si tratta solo del "tuo impegno", ma anche del fatto che è privato per il tuo albero, e non l'hai spinto fuori e non lo hai ancora annunciato.
...
Ora la parte "pulita" è un po 'più sottile, sebbene le prime regole siano abbastanza ovvie e facili:
Mantieni la tua cronologia leggibile
Alcune persone lo fanno semplicemente risolvendo prima le cose e non commettendo errori. ma è molto raro, e per il resto di noi, usiamo "git rebase" ecc. mentre lavoriamo sui nostri problemi.
Quindi "git rebase" non è sbagliato. Ma è giusto solo se è il tuo albero git PRIVATO MOLTO PROPRIO.
Non esporre la tua merda.
Questo significa: se sei ancora nella fase di "git rebase", non lo spingi fuori. Se non è pronto, invii patch in giro o usi git tree privati (proprio come una "sostituzione di serie di patch") di cui non parli al grande pubblico.
(enfatizzare il mio)
Conclusione
Alla fine, l'OP ha alcuni sviluppatori che lo fanno:
git checkout master
(edit files)
git commit -am "..."
(edit files)
git stash
git pull
git stash (pop|apply)
Ci sono due problemi qui:
- Gli sviluppatori si stanno impegnando a padroneggiare. Bloccalo immediatamente. Davvero, questo è il problema più grande .
- Gli sviluppatori utilizzano
git stash
e git pull
padroneggiano costantemente quando dovrebbero utilizzare i rami delle funzionalità.
Non c'è niente di sbagliato nell'usare git stash
- specialmente prima di un pull - ma usare git stash
in questo modo è un anti pattern quando ci sono flussi di lavoro migliori in Git.
Il loro uso di git stash
un'aringa rossa. Non è il problema. Impegnarsi a padroneggiare è il problema.