2009-09-30 16 views
8

Come un git noob che prova su un progetto Rails, mi chiedo se sia una cattiva pratica fare git add . (aggiungere la directory corrente) prima di ogni commit. Le esercitazioni introduttive che ho visto mostrano inizialmente l'aggiunta della directory corrente, quindi utilizzando git add new_file per aggiungere file dopo. Se sto aggiungendo un mucchio di file da un gruppo di directory diverse, questo sembra troppo difficile.Un modo migliore di usare git add?

In sostanza, se si aggiungono più di uno o due file, è OK utilizzare git add . ogni volta che si desidera eseguire il commit? Sta usando git add . come fare esplicitamente git add new_file per ogni file che è stato creato dall'ultimo commit?

risposta

11

git add . aggiungerà tutto ciò che c'è nella gerarchia, tra cui i nuovi file. Se vuoi tenere traccia di tutti i file presenti nella directory, va bene.

Un altro utilizzo (forse più comune) è fare git commit -a, che aggiunge solo i file modificati dall'ultimo commit prima di eseguire il commit e non include nuovi file.

MODIFICA: git add . non rimuoverà alcun file eliminato dall'ultimo commit. Se si eliminano i file, utilizzerei lo git rm <myfile> in modo che git venga informato del file rimosso e non si dimentichi di accertarsi che Git sappia che è stato eliminato. Come menzionato in un altro commento, git commit -acorrisponderà ai file di avviso eliminati.

+0

Grazie James. Quindi non è inefficiente o ridondante usare 'git add .' anziché aggiungere i file singolarmente? Non è male "ri-aggiungere" i file che sono già stati aggiunti? –

+0

"ri-aggiungendo" un file che non è cambiato non ha alcun effetto su nulla, quindi no, non è male. Non so di inefficienza - git add . è istantaneo quando lo uso, ma non so se questo rimane il caso in una gerarchia di cartelle di grandi dimensioni. –

+0

Tuttavia, 'git add .' aggiungerà file che probabilmente non dovrebbero essere, come i backup dell'editor e altri cruft casuali effimeri. – Novelocrat

4

Forse git-commit -a fa quello che vuoi? Metterà in scena e impegnerà tutti i file modificati e/o eliminati che sono sotto controllo di versione.

4

è possibile utilizzare git commit -a per impegnare tutte le modifiche ai file già in SourceControl (questo è come comando commit di Subversion)

+0

Una spiegazione tra 'git commit -a' e' git add -u' sarebbe in ordine. l'uso di 'git commit -a' può portare all'aggiunta inconsapevole di file che non si intendeva. – Sukima

+0

@Sukima: 'git commit -a' impegnerà solo i file già tracciati. Non aggiungerà mai nuovi file non tracciati. – knittl

2

Inoltre, si potrebbe apprezzare la modalità interattiva ('git add -i'), in grado di accelerare le cose, se avete bisogno di aggiungere in modo selettivo un gruppo di file. Puoi vederlo in azione in this GitCast.

+0

È stato spostato o è stato sostituito. Trovato questo invece: http://blip.tv/scott-chacon/c3-add-interactive-4113507 –

+0

Grazie @adifferentben - buona cattura. Aggiornerò la mia risposta con la tua correzione – ewall

+0

@wall: ma la risposta non è stata aggiornata ?! il collegamento è ancora 404. – Sukima

8

Non c'è niente di sbagliato nell'usare "git add ." se il tuo .gitignore è aggiornato e sei sicuro che non aggiungerà nulla che non intendi tracciare. Fai prima un "git status" per verificarlo.

Non consiglierei di farlo prima di ogni commit, tuttavia, come la maggior parte delle volte (almeno per la maggior parte dei casi d'uso) modificherete i file esistenti e aggiungerete solo uno o due file completamente nuovi. In questi casi, "git add -u" e "git add <file>" spesso funzionano meno come con "git add ." o "git add -A" è sempre necessario verificare che non si aggiunga per errore nuovi file che erano in realtà file temporanei e che avrebbero dovuto essere ignorati o cancellato.

"git add ." sarebbe molto utile se si sa che sono stati aggiunti molti nuovi file nella gerarchia a partire dalla directory corrente e non si desidera specificarli tutti esplicitamente. Devi essere sicuro che tutto ciò che non vuoi aggiungere sia correttamente ignorato.

0

Se i tuoi progressi sono "single-threaded" o single branched, non c'è alcun problema intrinseco, sebbene varie altre opzioni abbiano i vantaggi che altre persone hanno suggerito.Tuttavia, se in questo ramo ci sono più di una "caratteristica" che potreste voler incorporare in modo selettivo in qualche ramo correlato, allora questo tipo di approccio "commit ogni volta" renderà più lavoro in quel momento. Probabilmente esistono altri vantaggi del genere (ad esempio utilizzando git bisect). Se c'è più di un filo logico nel lavoro che sta accadendo, separarli al momento del commit può pagare in seguito dei bei dividendi.