2010-02-02 13 views
24

Ho cercato qui intorno per cercare una risposta e sembra che io stia facendo solo ipotesi errate su come i rami di git dovrebbero funzionare.File non tracciati tra le filiali in Git

Ho il mio ramo master e ho creato un ramo di funzionalità chiamato profiles dove sto facendo un lavoro specifico ai profili. Mentre lavoravo ai profili, ho modificato 5 o 6 file e aggiunto altri 5 o 6 nuovi file. Avevo bisogno di tornare al ramo master per correggere un bug rapido e ho notato tutti i nuovi file e i file modificati anche lì. Immagino che questo abbia senso dato che git non sta per rimuovere i file non tracciati dal ramo master e portarli indietro per il mio ramo profiles poiché sono, di fatto, non tracciati. Ma per quanto riguarda le modifiche ai file esistenti. Perché si presentano nel ramo principale.

Che cosa è la migliore pratica qui. Non sono ancora pronto ad eseguire le modifiche localmente. Devo semplicemente nascondere tutte queste modifiche, passare a master, fare la piccola correzione, tornare a profiles quindi riapplicare la scorta?

Qualsiasi aiuto è apprezzato. Grazie

risposta

33

"Non sono ancora pronto ad eseguire le modifiche in locale."

I commit in git sono cose locali che possono essere annullate, rifatte e rifatte a volontà. È solo quando spingi il commit da qualche parte che devi prestare attenzione.

Inoltre, i commit sono visibili a strumenti locali come gitk e possono essere presi da essi e possono essere ridefiniti su altri commit, ecc. È uno strumento molto potente. Impara ad usarlo.

Mi capita spesso di fare:

git add .; git commit -a -m 'WIP' 

solo per mettere da parte tutto ciò che nella struttura di lavoro attuale, se penso che potrei essere interrotto. Se apporto qualche modifica in più, utilizzo:

git add .; git commit --amend 

per aggiornare il commit "WIP" sul posto. Quando sono finalmente pronto per il vero impegno, ho appena:

git reset --soft HEAD~; git reset 

e ora posso controllare con attenzione ciò che la finale commit sarà.

+1

Ho una memoria orribile e mi piace usare git per vedere dove sono sul mio lavoro (e con Magit è ancora più facile, ed è incorporato nel mio flusso di lavoro). Davvero, la soluzione ha più senso però. Impegnati più spesso. Ho solo bisogno di modificare leggermente il mio flusso di lavoro. grazie – Clarence

+2

Solo per chiarimenti, c'è qualche differenza tra 'git reset --soft HEAD ~; git reset' e 'git reset HEAD ^'? Per quanto posso vedere, entrambi resettano HEAD e l'indice al genitore del commit "WIP" pronto a fare un vero commit usando alcune o tutte le modifiche dell'albero di lavoro, ma potrei aver perso una sottigliezza. –

+2

@Charles Bailey: "--soft non tocca affatto il file indice o l'albero di lavoro, ma richiede che siano in un buon ordine. Questo lascia tutti i file modificati" Modifiche da eseguire ", come lo stato git metterebbe esso ". se si utilizza "git reset HEAD ^" non si otterrà questo fatale: Impossibile eseguire un soft reset nel mezzo di un'unione. – maletin

5

Non si presentano nel ramo principale: se si eseguiva un reset hardware e un clean, scomparivano. Git sta semplicemente preservando le tue modifiche locali quando cambi succursali.

Questo è comunemente utile; potresti aver capito di voler trasferire tali modifiche su un ramo diverso da quello in cui ti trovi attualmente. Se le modifiche fossero in conflitto con la differenza tra i due rami, git si rifiuterebbe di cambiare ramo.

Hai ragione sull'approccio migliore, tuttavia: il passaggio da una filiale all'altra è nella mia esperienza uno degli usi più comuni di git stash.

3

Sembra che tu abbia creato il ramo con git branch profiles, ma non l'abbia cambiato, quindi sei rimasto in master e ha ottenuto il cambio di file quando hai fatto un commit.

Dopo aver creato il ramo, è necessario passare esplicitamente ad esso con git checkout (basta creare subito un nuovo ramo e passare ad esso in un unico passaggio utilizzando git checkout -b).

Se si dispone di modifiche non si vuole perdere (o di impegnarsi al ramo corrente), ma invece mettere in l'altro ramo, do:

git add -A 
git stash 
git checkout <other branch> 
git stash pop 

Maggiori informazioni git stash È disponibile git-scm.com

Problemi correlati