Dal Git SCM Book :
Often, when you’ve been working on part of your project, things are in a messy state and you want to switch branches for a bit to work on something else. The problem is, you don’t want to do a commit of half-done work just so you can get back to this point later. The answer to this issue is the git stash command.
Stashing takes the dirty state of your working directory — that is, your modified tracked files and staged changes — and saves it on a stack of unfinished changes that you can reapply at any time.
Data questa descrizione, direi che questo è un Anti Pattern. Una spiegazione eccessivamente semplificata di Git Stash sarebbe che si tratta del "Taglia e incolla" del controllo del codice sorgente. Prendi un mucchio di file modificati, li "riponi" in una penna di tenuta al di fuori del normale flusso di lavoro di branching di Git e poi riapplichi quelle modifiche a un altro ramo in un secondo momento.
Tornando un po 'oltre, impegnarsi a padroneggiare è il modello anti qui. Usa i rami. Questo è quello per cui sono stati progettati.
Si riduce davvero a questo:
Puoi martellare una vite nel muro e questo mostrerà un'immagine, ma usare un cacciavite è ciò che dovresti fare. Non usare un martello quando il cacciavite è seduto proprio accanto a te.
Informazioni sulla registrazione del codice "interrotto"
Mentre il seguente è opinione, sono giunto a questa opinione per esperienza.
Impegnati presto e commetti spesso. Impegna tanto codice spezzato quanto vuoi. Visualizza la tua cronologia di commit locale come "salva punti" mentre fai a pezzi qualcosa. Una volta che hai fatto un lavoro logico, fai un commit. Certo, potrebbe rompere tutto, ma non importa finché non spinge quei commit. Prima di spingere, rebase e schiaccia i tuoi commit.
- Crea nuovo ramo
- Hack hack hack
- Impegna il codice danneggiato
- Lucida il codice e fallo funzionare
- Impegna codice di lavoro
- Rebase e Squash
- Prova
- Spingi quando i test stanno passando
Per l'OP, questo thread di messaggi kernal di Linux potrebbe essere interessante, perché è un tipo di suoni come alcuni membri del team dell'OP utilizzano Git in modo simile.
@RibaldEddie ha detto in un commento qui sotto:
First of all, a stash is not outside of a "branching workflow" since under the hood a stash is just another branch.
(a rischio di incorrere nell'ira di molte persone)
Linus ha detto:
With "git stash", you can have multiple different stashed things too, but
they don't queue up on each other - they are just random independent
patches that you've stashed away because they were inconvenient at some
point.
Quello che penso che @RibaldEddie stia cercando di dire è che puoi usare git stash
in un flusso di lavoro di una feature branch - e questo è vero. Non è l'uso di git stash
che è il problema. È la combinazione di commit su master e utilizzo di git stash
. Questo è un pattern anti.
Chiarire git rebase
Dal commento di @ RibaldEddie:
Rebasing is much more like copy-pasting and even worse modifies committed history.
(Enfasi mia)
La modifica della cronologia dei commit non è una cosa negativa, purché sia cronologia dei commit locali . Se esegui il rebase di commit che hai già spinto, sarai praticamente orfano di chiunque altro usando il tuo branch. Questo è male.
Ora, dì che hai commesso diversi commit nel corso della giornata. Alcuni commit erano buoni. Alcuni ... non così buoni. Il comando git rebase
in combinazione con lo schiacciamento dei tuoi commit è un buon modo per ripulire la cronologia dei commit locale. È bello unire un solo commit ai rami pubblici perché mantiene pulita la cronologia dei commit dei rami condivisi del tuo team. Dopo la ridefinizione, dovrai testare di nuovo, ma se i test passano, puoi spingere un commit pulito invece di alcuni dirty.
C'è un altro interessante thread del kernel di Linux su cancella la cronologia dei commit .
Di nuovo, da Linus:
I want clean history, but that really means (a) clean and (b) history.
People can (and probably should) rebase their private trees (their own work). That's a cleanup. But never other peoples code. That's a "destroy history"
So the history part is fairly easy. There's only one major rule, and one
minor clarification:
-
You must never EVER destroy other peoples history. You must not rebase
commits other people did. Basically, if it doesn't have your sign-off
on it, it's off limits: you can't rebase it, because it's not yours.
Notice that this really is about other peoples history, not about
other peoples code. If they sent stuff to you as an emailed patch,
and you applied it with "git am -s", then it's their code, but it's
your history.
So you can go wild on the "git rebase" thing on it, even though you
didn't write the code, as long as the commit itself is your private
one.
-
Minor clarification to the rule: once you've published your history in
some public site, other people may be using it, and so now it's clearly
not your private history any more.
So the minor clarification really is that it's not just about "your
commit", it's also about it being private to your tree, and you haven't
pushed it out and announced it yet.
...
Now the "clean" part is a bit more subtle, although the first rules are
pretty obvious and easy:
-
Keep your own history readable
Some people do this by just working things out in their head first, and
not making mistakes. but that's very rare, and for the rest of us, we
use "git rebase" etc while we work on our problems.
So "git rebase" is not wrong. But it's right only if it's YOUR VERY OWN
PRIVATE git tree.
-
Don't expose your crap.
This means: if you're still in the "git rebase" phase, you don't push
it out. If it's not ready, you send patches around, or use private git
trees (just as a "patch series replacement") that you don't tell the
public at large about.
(sottolineatura mia)
Conclusione
Alla fine, l'OP ha alcuni sviluppatori che fanno questo:
git checkout master
(edit files)
git commit -am "..."
(edit files)
git stash
git pull
git stash (pop|apply)
Qui ci sono due problemi:
- Gli sviluppatori si stanno impegnando a padroneggiare. Bloccalo subito. In realtà, questo è il il più grande problema.
- Gli sviluppatori utilizzano costantemente
git stash
e git pull
sul livello principale quando devono utilizzare i rami di funzionalità.
Non c'è niente di sbagliato nell'usare git stash
- specialmente prima di un pull - ma usare git stash
in questo modo è un pattern anti quando ci sono migliori flussi di lavoro in Git.
Il loro uso di git stash
un'aringa rossa. Non è il problema. Il commit del master è il problema.