Devo eseguire il commit di ogni modifica prima di cambiare ramo o sta nascondendo l'opzione migliore?

1

Sono nuovo di git e sto attualmente cercando di imparare il più possibile a riguardo.

Penso che il concetto sia fantastico ed estremamente prezioso per il flusso di lavoro di qualsiasi sviluppatore.

Sono uno scienziato dei dati che programma in R e, data la natura del mio lavoro, lavoro su più progetti contemporaneamente per più persone / dipartimenti.

Trovo che spesso debba passare da un progetto all'altro a causa di query ad hoc / persone che perdono cose / persone che hanno urgentemente bisogno di sapere qualcosa, e come tale mi fa pensare a quale sia la migliore pratica intorno al passaggio < em> rami .

Ciò che mi ha spinto a fare questa domanda è che sto trovando (specialmente di recente) che tendo a modificare diversi file da diversi progetti in un breve lasso di tempo (a volte in 30 minuti posso modificare i file da sei diversi progetti), e poi quando vado a cambiare ramo per lavorare su qualcosa su cui avevo programmato di lavorare, mi viene presentato il problema di immagazzinare o commettere le mie modifiche al ramo corrente prima di poterlo cambiare.

Il problema è che desidero solo trasferire alcune di queste modifiche (di solito solo un singolo file) al ramo specifico su cui sto lavorando attualmente, ma ovviamente non posso cambiare ramo senza stashing o scartando - prima le mie modifiche.

In quanto tale, voglio sapere se è buona / buona pratica eseguire immediatamente nuove modifiche sui rispettivi rami non appena ho finito con loro e poi tornare al mio ramo master / other-work subito dopo o se esiste un altro modo in genere che funziona meglio per la maggior parte delle persone.

La mia domanda è questa: dovrei cambiare ramo ogni volta che ho finito con un progetto / set di modifiche, anche se cambio solo un singolo file, o dovrei fare qualcos'altro?

Ad esempio, se sto lavorando su ProjectX e poi qualcuno mi chiede di fare qualcosa per loro su ProjectY , dovrei passare da project-x-branch a project-y-branch , apportare le modifiche, confermarle e tornare indietro a project-x-branch e continua oppure esiste un modo migliore per gestire tali scenari?

L'idea che ho in mente è che quando controllo la mia copia di lavoro, ci sono solo uno o due file da impegnare nel ramo su cui sto lavorando, al contrario di molti che non sono correlati al mio ramo corrente.

Apprezzo che lo stashing sia stato progettato proprio per questo scopo (almeno penso che sia quello a cui serve - per favore correggimi se sbaglio) ma tuttavia ritengo che sia una pratica migliore (idealmente) evitare di nasconderlo del tutto.

Mi aspetto che commettere e cambiare ramo ogni volta che ho finito con un aggiornamento / modifica sia un'abitudine molto semplice e utile da adottare, ma prima di iniziare a implementare questa abitudine, mi piacerebbe davvero sapere se ci potrebbe essere un modo migliore per gestirlo.

Ho controllato il potenziale duplicato di questa domanda e non sembra proprio lo stesso problema perché il mio non è un caso di sperimentare bug, ma più un caso di dover cambiare codice a caso da uno o due progetti (dove non ho necessariamente bisogno di mantenere le modifiche) in quanto non aggiungono valore.  Le modifiche sono piccole, come l'estrazione di qualche altra informazione invece di / in aggiunta a ciò che stavano già estraendo.

    
posta MusTheDataGuy 19.07.2018 - 10:34
fonte

3 risposte

2

Dovresti impegnarti quando compila il tuo progetto (e passa tutti gli UnitTests).

In questo modo effettuerai il commit ogni 2 minuti (in media). Quindi sei a soli 2 minuti dal cambio di filiale o parti per casa. Questo non è necessario per usare la scorta (il più delle volte).

Questo nel migliore dei casi in combinazione con TDD poiché questo ti dà due eventi distinti da impegnare: dopo aver effettuato l'ultimo (uno e solo fallito) test "verde" e dopo "refactoring", prima di scrivere il prossimo test.

still I don't see the point of commiting that often, – Walfrat

Il più grande vantaggio è quando rebase le tue modifiche da integrare con il tuo upstream: git applica ogni commit in separazione (diversamente da "merging" dove si applica solo i cambiamenti risultanti). Questo ha alcuni vantaggi:

  1. poiché i commit sono (molto) piccoli c'è una possibilità molto bassa di conflitti.
  2. se ci sono conflitti è facile scoprire quale dovrebbe essere il risultato, dal momento che le modifiche sono così ridotte.
  3. puoi verificare la risoluzione del conflitto eseguendo i test unitari prima di continuare il rebase.
  4. Se in seguito dovrai scoprire quando hai introdotto un determinato comportamento, puoi semplicemente cercare tra i messaggi di commit. Il commit trovato ha solo le modifiche rilevanti. Non hai bisogno di ulteriori indagini su quali cambiamenti nel commit sono rilevanti.

in average I commit once or twice a day. I fail to see how I can perform meaningful commit on a lower scale. – Walfrat

Quando si esegue TDD, la fine del micro ciclo è un evento un po '"naturale" da impegnare:
Hai il tuo progetto in uno stato consegnabile.

Se è necessario eseguire un "rollback", è molto probabile che si desideri tornare a tale stato sapendo che tutte le funzionalità implementate finora funzionano davvero. Quando si esegue TDD, questo è tipicamente ogni 30 secondi, a volte più lungo e circa 2 minuti in media.

Il messaggio di commit descrive l'ipotesi di test sul codice di produzione che verifica.

    
risposta data 19.07.2018 - 10:42
fonte
2

Git ha tre caratteristiche rilevanti qui:

  1. Git non impone un flusso di lavoro e incoraggia (richiede?) a trovare il proprio.
  2. Git è distribuito: ciò che fai localmente non influenza le altre persone.
  3. Git ha commits super economici (infatti la memorizzazione crea un commit, semplicemente non lo aggiunge al ramo).

È perfettamente corretto creare molti micro-commit, anche se non rappresentano uno stato operativo del tuo software. Prima di spingere il tuo lavoro per renderlo visibile agli altri, puoi git-rebase i tuoi commit per schiacciare (combinare), riordinare o riformulare. Ciò ti consente di lavorare come preferisci, ma in seguito organizzare quel lavoro in un modo che abbia senso per gli altri.

Una variante di questo è il commit di un WIP (work in progress) e continuamente git commit --amend con nuove modifiche. Questo mostra meno commit nella tua storia di micro-commit separati. Una volta che il commit è pronto, puoi modificarlo un'ultima volta per correggere il messaggio di commit. Questo è il mio approccio preferito.

Lo stash è solo un modo conveniente per creare e riapplicare un commit WIP senza influire direttamente sul ramo corrente. Questa è una questione di gusti, personalmente non mi piace la scorta perché fornisce poca visibilità sui cambiamenti nascosti.

Un'altra ottima alternativa che puoi considerare è la verifica del progetto più volte in directory separate. Tutti i checkout possono ancora condividere lo stesso database git locale, ma possono funzionare su diversi rami. Il modo semplice per farlo è quello di git-clone del repository locale invece di un URL remoto, nel qual caso i repository sono concettualmente separati. L'approccio più sofisticato consiste nell'utilizzare git-worktree . La documentazione mostra questo meraviglioso esempio che crea un nuovo albero di lavoro con un nuovo ramo:

You are in the middle of a refactoring session and your boss comes in and demands that you fix something immediately. You might typically use git-stash to store your changes away temporarily, however, your working tree is in such a state of disarray (with new, moved, and removed files, and other bits and pieces strewn around) that you don’t want to risk disturbing any of it. Instead, you create a temporary linked working tree to make the emergency fix, remove it when done, and then resume your earlier refactoring session.

$ git worktree add -b emergency-fix ../temp master
$ pushd ../temp
# ... hack hack hack ...
$ git commit -a -m 'emergency fix for boss'
$ popd
$ git worktree remove ../temp

L'inconveniente? Questa funzione è ancora sperimentale e il checkout extra potrebbe consumare spazio significativo (e tempo, se il nuovo albero di lavoro implica una costruzione pulita).

Quindi sperimenta un po 'e trova un flusso di lavoro Git personale che funzioni per te. Una volta stabilito, considera l'aggiunta di alias (scorciatoie) per il tuo comune operazioni.

    
risposta data 21.07.2018 - 15:10
fonte
1

Puoi semplicemente avere due directory contenenti il repository git completo. Immagina di avere due computer, e fai il tuo lavoro principale su uno, e quando ti interrompi usi l'altro. Puoi fare lo stesso usando solo due directory. Quindi non è necessario cambiare i progetti.

Il modo migliore per organizzare i commit nel tuo lavoro principale dipende da te. Se esegui revisioni di codice (come dovresti), ogni commit dovrebbe essere abbastanza facile da essere facilmente rivedibile. "Ogni volta che compila" è troppo spesso; "ogni volta che viene apportato un cambiamento significativo" è meglio, "una volta terminata la funzione completa" è troppo raro.

    
risposta data 21.07.2018 - 19:58
fonte

Leggi altre domande sui tag