Risposte:
Questa risposta si applica solo alla versione 1.x di Git . Per Git versione 2.x, vedi altre risposte.
Sommario:
git add -A
mette in scena tutti i cambiamenti
git add .
mette in scena nuovi file e modifiche, senza eliminazioni
git add -u
mette in scena modifiche ed eliminazioni, senza nuovi file
Dettaglio:
git add -A
è equivalente a git add .; git add -u
.
Il punto importante git add .
è che guarda l'albero di lavoro e aggiunge tutti quei percorsi alle modifiche organizzate se vengono cambiate o sono nuove e non ignorate, non mette in scena alcuna azione "rm".
git add -u
esamina tutti i file già tracciati e mette in scena le modifiche a tali file se sono diverse o se sono state rimosse. Non aggiunge nuovi file, ma mette in scena solo modifiche a file già tracciati.
git add -A
è una scorciatoia utile per fare entrambe.
Puoi testare le differenze con qualcosa del genere (nota che per Git versione 2.x il tuo output git add .
git status
sarà diverso):
git init
echo Change me > change-me
echo Delete me > delete-me
git add change-me delete-me
git commit -m initial
echo OK >> change-me
rm delete-me
echo Add me > add-me
git status
# Changed but not updated:
# modified: change-me
# deleted: delete-me
# Untracked files:
# add-me
git add .
git status
# Changes to be committed:
# new file: add-me
# modified: change-me
# Changed but not updated:
# deleted: delete-me
git reset
git add -u
git status
# Changes to be committed:
# modified: change-me
# deleted: delete-me
# Untracked files:
# add-me
git reset
git add -A
git status
# Changes to be committed:
# new file: add-me
# modified: change-me
# deleted: delete-me
git add -A -p
che non funzioni come ci si aspetterebbe (chiedi in modo interattivo su file non tracciati)
git add -A :/
oppuregit add -A .
git add -u
è diventato git add -u :/
con l'ultimo parametro che è un percorso, che consente di -u alcune directory, :/
gestisce l'intero albero.
git add -u
o, git add .
e facendo ciò, gli semplifica la vita anche dopo aver tenuto conto della tassa mentale aggiuntiva aggiunta per garantire che non ci siano problemi di sincronizzazione? Mi chiedo perché Git non si divida add -u
in due comandi separati add -u1
e add-u2
per cui uno funziona per i file che iniziano con numeri e l'altro per i file che iniziano con non numerali
Ecco una tabella per una rapida comprensione:
Versione Git 1.x :
Git versione 2.x :
Bandiere di forma lunga:
git add -A
è equivalente a git add --all
git add -u
è equivalente a git add --update
Ulteriori letture:
git diff-files -z --diff-filter=M --name-only | xargs -0 git add
per aggiungere solo i file modificati, ma non i nuovi file o le eliminazioni.
git add .
aggiunge solo nuovi file che si trovano sul percorso corrente. Cioè se hai una nuova directory ../foo
, la git add -A
metterai in scena, git add .
no.
git add .
è equivalente a git add -A .
, che è equivalente agit add "*"
Con Git 2.0 git add -A
è l'impostazione predefinita: git add .
uguale agit add -A .
.
git add <path>
è lo stesso di "git add -A <path>
" adesso, quindi "git add dir/
" noterà i percorsi rimossi dalla directory e registrerà la rimozione.
Nelle versioni precedenti di Git, "git add <path>
" ha ignorato le rimozioni.Puoi dire "
git add --ignore-removal <path>
" per aggiungere solo percorsi aggiunti o modificati<path>
, se lo desideri.
git add -A
è come git add :/
( aggiungi tutto dalla cartella top repository git ).
Nota che git 2.7 (novembre 2015) ti permetterà di aggiungere una cartella chiamata " :
"!
Vedi commit 29abb33 (25 ott 2015) di Junio C Hamano ( gitster
) .
Nota che a partire da git 2.0 (Q1 o Q2 2014) , quando parli git add .
(percorso corrente all'interno dell'albero di lavoro), devi usare ' .
' anche negli altri git add
comandi.
Questo significa:
"
git add -A .
" equivale a "git add .; git add -u .
"
(Nota il extra ' .
' per git add -A
e git add -u
)
Perché git add -A
o git add -u
funzionerebbe (solo avviando git 2.0) sull'intero albero di lavoro e non solo sul percorso corrente.
Questi comandi funzioneranno sull'intero albero in Git 2.0 per coerenza con "
git commit -a
" e altri comandi . Poiché non ci sarà alcun meccanismo per far "git add -u
" comportarsi come se "git add -u .
", è importante per coloro che sono abituati a "git add -u
" (senza pathspec) aggiornare l'indice solo per i percorsi nella sottodirectory corrente per iniziare ad allenare le dita per dire esplicitamente ""git add -u .
"quando lo significano prima che arrivi Git 2.0.Viene emesso un avviso quando questi comandi vengono eseguiti senza pathspec e quando sono presenti modifiche locali all'esterno della directory corrente , poiché il comportamento in Git 2.0 sarà diverso dalla versione odierna in tale situazione.
Dalle istruzioni di Charles , dopo aver verificato la mia comprensione proposta sarebbe la seguente:
# For the next commit
$ git add . # Add only files created/modified to the index and not those deleted
$ git add -u # Add only files deleted/modified to the index and not those created
$ git add -A # Do both operations at once, add to all files to the index
Questo post sul blog potrebbe anche essere utile per capire in quale situazione potrebbero essere applicati quei comandi: Rimozione dei file eliminati dalla directory di lavoro di Git .
Le cose sono cambiate con Git 2.0 ( 28/05/2014 ):
-A
è ora l'impostazione predefinita--ignore-removal
.git add -u
e git add -A
in una sottodirectory senza percorsi sulla riga di comando operare sull'intero albero.Quindi per Git 2 la risposta è:
git add .
e git add -A .
aggiungere nuovi file / modificati / eliminati nella directory correntegit add --ignore-removal .
aggiunge i file nuovi / modificati nella directory correntegit add -u .
aggiunge i file modificati / eliminati nella directory correnteUna risposta rapida più distillata:
git add -A
git add .
git add -u
git add :/
+git add -u :/
In Git 2.x :
Se ti trovi direttamente nella directory di lavoro , quindi git add -A
e git add .
lavora senza la differenza.
Se ci si trova in una sottodirectory della directory di lavoro , git add -A
verranno aggiunti tutti i file dell'intera directory di lavoro e git add .
verranno aggiunti i file dalla directory corrente .
E questo è tutto.
Spero che ciò possa aggiungere un po 'più di chiarezza.
!The syntax is
git add <limiters> <pathspec>
! Aka
git add (nil/-u/-A) (nil/./pathspec)
I limitatori possono essere -u o -A o zero.
Pathspec può essere un percorso file o punto, '.' per indicare la directory corrente.
Conoscenze di base importanti su come Git 'aggiunge':
-A
sia specificato anche. Il punto si riferisce strettamente alla directory corrente - omette i percorsi trovati sopra e sotto.Ora, data questa conoscenza, possiamo applicare le risposte sopra.
I limitatori sono i seguenti.
-u
= --update
= sottoinsieme di file tracciati => Aggiungi = No; Modifica = Sì; Elimina = Sì. => se l'elemento viene tracciato.-A
= --all
(Tale -a
, che dà errore di sintassi) = superset di tutti i file non monitorate / rintracciato, a meno che in Git prima di 2.0, in cui se il punto filespec è dato, allora solo quella particolare cartella viene considerato. => se l'elemento viene riconosciuto, git add -A
lo troverà e lo aggiungerà.Pathspec è il seguente.
git add -A .
git add -u .
In conclusione, la mia politica è:
git status
..gitignore
file in modo che normalmente solo i file di interesse non vengano tracciati e / o non riconosciuti.Entrambi git add .
e git add -A
metteranno in scena tutti i file nuovi, modificati ed eliminati nelle versioni più recenti di Git.
La differenza è che mette in git add -A
scena i file in "directory superiori, attuali e secondarie" che appartengono al tuo repository Git funzionante. Ma eseguendo git add .
solo i file di fase nella directory corrente e nelle sottodirectory che seguono ( non i file che si trovano all'esterno, ovvero le directory superiori).
Ecco un esempio:
/my-repo
.git/
subfolder/
nested-file.txt
rootfile.txt
Se la tua directory di lavoro corrente è /my-repo
, e lo fai rm rootfile.txt
, quindi cd subfolder
, seguita da git add .
, allora il file cancellato non verrà messo in scena. Ma fare git add -A
certamente metterà in scena questo cambiamento, indipendentemente da dove esegui il comando.
L' -A
opzione aggiunge, modifica e rimuove le voci di indice in modo che corrispondano all'albero di lavoro.
In Git 2 l' -A
opzione è ora predefinita.
Quando .
viene aggiunto un che limita l'ambito dell'aggiornamento alla directory in cui ci si trova attualmente, secondo la documentazione di Git
Se non
<pathspec>
viene fornita alcuna opzione quando viene utilizzata l'opzione -A, vengono aggiornati tutti i file nell'intero albero di lavoro (le vecchie versioni di Git venivano utilizzate per limitare l'aggiornamento alla directory corrente e alle sue sottodirectory).
Una cosa che aggiungerei è che se viene utilizzata la modalità --interactive
o -p
, git add
si comporterà come se -u
fosse utilizzato il flag update ( ) e non aggiungesse nuovi file.
git add *
?