Come gestirlo quando un commit in corso sembra improvvisamente dipendere da un altro che non c'è ancora?


13

Sono inesperto con Git, ma faccio del mio meglio per abituarmi e finora lo sto usando solo per progetti su cui lavoro da solo.

Quando codifico c'è naturalmente un approccio dall'alto verso il basso (dato che non posso conoscere il futuro), e c'è un tema ricorrente:

Faccio del lavoro.
Scopro che per ottenere il mio lavoro in qualcosa di "impegnabile" ho bisogno di fare altro lavoro.
L'altro lavoro merita il proprio impegno.

Per qualcosa di impegnativo intendo qualcosa che si compila o qualcosa che non è un disastro totale.
E da qualcosa che merita il proprio impegno, mi riferisco al fatto che ho imparato che gli impegni dovrebbero fare solo una cosa.

Il modo in cui lo risolvo è ingombrante. Se l'altro lavoro è in un altro file, creo un nuovo ramo, ci impegno e unisco. Se il lavoro si trova nello stesso file .. ugh .. Faccio una copia locale e resetto il file al suo stato in HEAD, eseguo il commit necessario e quindi inizio a ripristinare il mio lavoro dalla copia. Come dovrei effettivamente gestirlo? Non immagino che sia così, vero? Non lo presumo perché deve venire un po 'spesso a tutti (che almeno non conoscono il futuro). O forse sembra che il mio flusso di lavoro sia probabilmente difettoso?


1
Mi trovo nella stessa situazione abbastanza spesso, di solito quando aggiungo librerie e configurazioni. Uso solo git statusper vedere tutti i file modificati, e faccio due o più commit usando git addfile specifici (anziché git add --all) e commettendo pezzo per pezzo.
Chris Cirefice,

È possibile selezionare parti di file con git add -pe quindi eseguire il commit solo di quelle parti. È una tecnica molto potente e la uso quasi sempre.
eush77,

Risposte:


17

Esistono diversi modi per risolverlo.

Se si desidera apportare le modifiche per il primo commit senza interferire con le modifiche correnti, è possibile utilizzare git stash. Ciò eliminerà tutte le modifiche aperte, consentendoti di ripristinarle in seguito. Usa git statusper vedere che non sono più presenti. Ora crea il primo commit come sei abituato. Successivamente è possibile utilizzare git stash popper ripristinare le modifiche originali e creare il secondo commit, eseguendo il lavoro principale.

Un altro modo sarebbe quello di fare tutte le modifiche necessarie e quindi creare due commit, entrambi contenenti una parte del tuo lavoro. Per fare ciò è possibile utilizzare l'indice (noto anche come area di gestione temporanea) fornito da git. Questa è un'area speciale che puoi usare per preparare i commit. Supponendo di aver modificato più file, è possibile aggiungere ciascuno di essi all'indice utilizzando git add. Quando si esegue, git commitverranno impegnati solo i file aggiunti all'indice. git statusti mostrerà quali parti delle modifiche verranno impegnate e quali no. Ad esempio, sembrerà così dopo aver cambiato i file a.txt, b.txt e c.txt e successivamente facendo git add a.txt:

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   a.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   b.txt
        modified:   c.txt

In git commitquesto stato, solo le modifiche a a.txt verranno aggiunte al commit.

Inoltre puoi rivedere le modifiche esatte da impegnare utilizzando git diff --cached, che ti mostrerà una diff di tutte le modifiche che verranno impegnate.

Se un file contiene modifiche per entrambi i commit, puoi anche aggiungerne solo alcune parti all'indice usando "git add --patch b.txt". git ti fornirà una modalità interattiva che ti chiederà ogni modifica nel file dato se dovesse essere aggiunta all'indice. Questo potrebbe diventare più difficile se hai cambiamenti nelle linee uno accanto all'altro, che devono essere divisi nei due commit, tuttavia ci sono anche modi per risolverlo.

Se vuoi saperne di più sull'area di stadiazione potresti leggere questo: http://gitready.com/beginner/2009/01/18/the-staging-area.html

Potresti anche voler leggere di più sull'aggiunta interattiva qui: http://nuclearsquid.com/writings/git-add/


5

Se usi una GUI per Git, come SourceTree di Atlassian, oppure git guipuoi eseguire il commit di parti di file e lasciare altre parti senza impegno. In effetti, è possibile eseguire il commit di singole righe di codice.

Lo faccio spesso quando cado nella tana del coniglio come tu descrivi. Questo è un ottimo modo per rendere quel commit ragionevole o si impegna come precursore del commit principale.

Puoi farlo dalla riga di comando, ma è un po 'goffo.

Quando è possibile eseguire il commit a livello di patch Git e singole linee, non è necessario creare nuovi rami, stash, commit, stash e unione. Continua a lavorare e non interrompere il flusso. Hai una buona cosa da fare.


@MasterMastic QUESTA dovrebbe essere la tua risposta accettata. Essere in grado di impegnare solo singole righe di codice è una manna dal cielo.
JesseTG,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.