Różnica między „git add -A” a „git add”.

2917

git add [--all|-A]Wydaje się, że polecenie jest identyczne z git add .. Czy to jest poprawne? Jeśli nie, czym się różnią?

cmcginty
źródło

Odpowiedzi:

4240

Odpowiedź ta ma zastosowanie wyłącznie do Git wersji 1.x . W przypadku wersji Git 2.x zobacz inne odpowiedzi.


Podsumowanie:

  • git add -Aetapy wszystkie zmiany

  • git add .przygotowuje nowe pliki i modyfikacje, bez usuwania

  • git add -umodyfikuje i usuwa etapy, bez nowych plików


Szczegół:

git add -Ajest równoważne z git add .; git add -u.

Ważną kwestią git add .jest to, że patrzy na działające drzewo i dodaje wszystkie te ścieżki do zmian etapowych, jeśli są one zmienione lub są nowe i nie są ignorowane, nie wykonuje żadnych działań „rm”.

git add -uprzegląda wszystkie już śledzone pliki i wprowadza zmiany w tych plikach, jeśli są one inne lub zostały usunięte. Nie dodaje żadnych nowych plików, jedynie zmienia zmiany w już śledzonych plikach.

git add -A jest przydatnym skrótem do wykonywania obu tych czynności.

Możesz przetestować różnice za pomocą czegoś takiego (zwróć uwagę, że dla Git w wersji 2.x twój wynik git add . git status będzie inny):

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
CB Bailey
źródło
41
Co powiesz na różnicę między git add *?
Jared
3
szkoda, git add -A -pże nie działa zgodnie z oczekiwaniami (pytaj interaktywnie o nieśledzone pliki)
Erik Kaplun
2
Zaktualizuj odpowiedź. Powinien to być: git add -A :/lubgit add -A .
Gabriel Llamas
5
Dla informacji, w nowszych wersjach git git add -ustał się git add -u :/z tym ostatnim parametrem będącym ścieżką, pozwalającą na -u niektórych katalogów, :/obsługuje całe drzewo.
Brizee
15
@CharlesBailey, Git naprawdę uwielbia komplikować sprawy bez powodu. Czy istnieje prawdziwy przypadek użycia którym ktoś konkretnie trzeba git add -ualbo git add .i robiąc to, że sprawia, że jego życie łatwiejszym nawet po uwzględnieniu dodatkowego podatku psychicznego dodanej w celu zapewnienia, że są tam żadnych problemów z synchronizacją? Zastanawiam się, dlaczego Git nie furthur podzielone add -una dwa odrębne poleceń add -u1i add-u2mocy których jeden działa dla plików zaczynające się cyframi, a drugi dla plików zaczynając niebędących cyframi
Pacerier
946

Oto tabela szybkiego zrozumienia:

Wersja Git 1.x :

Wpisz opis zdjęcia tutaj

Wersja Git 2.x :

Wpisz opis zdjęcia tutaj

Flagi o długich kształtach:

  • git add -A jest równa git add --all
  • git add -u jest równa git add --update

Dalsza lektura:

Deweloper
źródło
1
Dzięki za stół. Czy istnieje sposób na dodanie tylko zmodyfikowanych plików? Brak nowych plików lub usuniętych plików
Gokul NK
3
@Gokul: Zgodnie z tym postem można git diff-files -z --diff-filter=M --name-only | xargs -0 git adddodawać tylko zmodyfikowane pliki, ale nie nowe pliki ani usunięcia.
Ville,
93
Nie jest to do końca prawdą, ponieważ git add .dodaje tylko nowe pliki, które znajdują się w bieżącej ścieżce. To znaczy, jeśli masz nowy katalog ../foo, git add -Awystawisz go, git add .nie zrobisz.
Milo Wielondek,
2
Tak więc git add .jest równoważne git add -A ., co jest równoważnegit add "*"
flow2k
Nadal jestem zdezorientowany co do git add „*”, czy mógłbyś bardziej szczegółowo to rozwinąć?
HS Umer farooq
176

W Git 2.0 git add -Awartość domyślna: git add .równa sięgit add -A . .

git add <path>jest taki sam jak git add -A <path>teraz „ ”, dzięki czemu „ git add dir/” zauważy ścieżki usunięte z katalogu i zarejestruje usunięcie.
W starszych wersjach Git „ git add <path>” ignorowano usuwanie.

Możesz powiedzieć „ git add --ignore-removal <path>”, aby dodać tylko dodane lub zmodyfikowane ścieżki <path>, jeśli naprawdę chcesz.

git add -Ajest jak git add :/( dodaj wszystko z górnego folderu repozytorium git ).
Pamiętaj, że git 2.7 (listopad 2015) pozwoli ci dodać folder o nazwie „ :”!
Zobacz commit 29abb33 (25 października 2015) autor: Junio ​​C Hamano ( gitster) .


Zauważ, że zaczynając od git 2.0 (Q1 lub Q2 2014) , kiedy mówisz o git add .(bieżąca ścieżka w działającym drzewie), musisz również użyć ' .' w innych git addpoleceniach.

To znaczy:

git add -A .” jest równoważne z „ git add .; git add -u .

(Uwaga na dodatkowe „ .” dla git add -Ai git add -u)

Ponieważ git add -Alub git add -udziałałoby (tylko git 2.0) na całym drzewie roboczym , a nie tylko na bieżącej ścieżce.

Te polecenia będą działać na całym drzewie w Git 2.0, aby zachować spójność z „ git commit -a” i innymi poleceniami . Ponieważ nie będzie mechanizmu, który sprawi, że „ git add -u” będzie się zachowywał tak, jakby „ git add -u .”, ważne jest, aby osoby przyzwyczajone do „ git add -u” (bez specyfikacji ścieżki) aktualizujące indeks tylko dla ścieżek w bieżącym podkatalogu zaczęły trenować palce, aby wyraźnie mówić „” git add -u .„kiedy mają to na myśli, zanim pojawi się Git 2.0.

Ostrzeżenie jest wydawane, gdy te polecenia są uruchamiane bez specyfikacji ścieżki i gdy masz lokalne zmiany poza bieżącym katalogiem , ponieważ zachowanie w Git 2.0 będzie w takiej sytuacji inne niż dzisiejsza wersja.

VonC
źródło
3
@NickVolynkin To świetnie! Cieszę się, że międzynarodowa społeczność SO działa zgodnie z przeznaczeniem. Dla odniesienia: ru.stackoverflow.com/a/431840
VonC
@VonC, Nicea, ludzie z Git naprawdę mieli ochotę powiedzieć, że ich aktualizacja „poprawi spójność”. To, co zrobili, spowodowało więcej zamieszania i niespójności. Jest 26 alfabetów i musieli ponownie użyć flagi, która była już używana.
Pacerier,
136

Z instrukcji Charlesa po przetestowaniu moje proponowane rozumienie wyglądałoby następująco:

# 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

Ten post na blogu może również pomóc zrozumieć, w jakiej sytuacji można zastosować te polecenia: Usuwanie usuniętych plików z katalogu roboczego Git .

Richard
źródło
6
nie jest to już prawdą w wersji 2.0. Dodaj . równa się dodać -A dla tej samej ścieżki, jedyną różnicą jest to, że w innych ścieżkach drzewa są nowe pliki
Claudiu Creanga
41

Sytuacja zmieniła się wraz z Git 2.0 ( 2014-05-28 ):

  • -A jest teraz domyślny
  • Stare zachowanie jest teraz dostępne z --ignore-removal.
  • git add -uaw git add -Apodkatalogu bez ścieżek w wierszu poleceń działają na całym drzewie.

W przypadku Git 2 odpowiedź brzmi:

  • git add .i git add -A .dodaj nowe / zmodyfikowane / usunięte pliki w bieżącym katalogu
  • git add --ignore-removal . dodaje nowe / zmodyfikowane pliki w bieżącym katalogu
  • git add -u . dodaje zmodyfikowane / usunięte pliki do bieżącego katalogu
  • Bez kropki dodaj wszystkie pliki do projektu, niezależnie od bieżącego katalogu.
0xF
źródło
4
Nie sądzę, żeby to było poprawne. Korzystanie z git v2.10.windows.2 'git add' zwraca 'Nic nie określono, nic nie dodano'. „git add -A” dodaje wszystkie zmienione pliki. Co sugeruje, że „-A” nie jest wartością domyślną.
Neutrino
34

Bardziej destylowana szybka odpowiedź:

Czy oba poniżej (to samo co git add --all )

git add -A

Stages nowe + zmodyfikowane pliki

git add .

Etapy zmodyfikowane + usunięte pliki

git add -u
K. Kilian Lindberg
źródło
5
Cześć, co jeśli chciałbyś wystawić tylko zmodyfikowane pliki? Jak byś to zrobił?
TheGrapeBeyond
2
Witam, dobre pytanie. O ile mi wiadomo, nie ma na to łatwej flagi. Git diff-files -z --diff-filter = M - tylko nazwa | xargs -0 git add from -> stackoverflow.com/questions/14368093/…
K. Kilian Lindberg
2
Właściwie to git add :/+git add -u :/
Nick Volynkin
27

W Git 2.x :

  • Jeśli znajdujesz się bezpośrednio w katalogu roboczym , to git add -Ai git add .pracuj bez różnicy.

  • Jeśli znajdujesz się w dowolnym podkatalogu katalogu roboczego , git add -Adoda wszystkie pliki z całego katalogu roboczego i git add .doda pliki z bieżącego katalogu .

I to wszystko.

simhumileco
źródło
12

Mam nadzieję, że to doda więcej jasności.

!The syntax is
git add <limiters> <pathspec>
! Aka
git add (nil/-u/-A) (nil/./pathspec)

Ogranicznikami mogą być -u lub -A lub zero.

Ścieżka może być ścieżką do pliku lub kropką, „.” wskazać bieżący katalog.

Ważna podstawowa wiedza o tym, jak Git „dodaje”:

  • Pliki niewidoczne, poprzedzone kropką (pliki dot) nigdy nie są automatycznie rozpoznawane przez Git. Nigdy nie są nawet wymienione jako „nieśledzone”.
  • Puste foldery nigdy nie są dodawane przez Git. Nigdy nie są nawet wymienione jako „nieśledzone”. (Obejściem tego problemu jest dodanie pustego pliku, być może niewidocznego do śledzonych plików).
  • Status Git nie wyświetli informacji o podfolderze, czyli nieśledzonych plikach, chyba że co najmniej jeden plik w tym podfolderze jest śledzony. Przed tym czasem Git uważa, że ​​cały folder jest poza zakresem, a la „pusty”. Jest pusty od śledzonych przedmiotów.
  • Określanie pliku filespec = '.' (kropka) lub bieżący katalog nie jest rekurencyjny, chyba że -Azostanie również określony. Kropka odnosi się wyłącznie do bieżącego katalogu - pomija ścieżki znalezione powyżej i poniżej.

Biorąc pod uwagę tę wiedzę, możemy zastosować powyższe odpowiedzi.

Ograniczniki są następujące.

  • -u= --update= podzbiór śledzonych plików => Dodaj = Nie; Zmień = Tak; Usuń = Tak. => jeśli element jest śledzony.
  • -A= --all(nie ma takiego -a, co powoduje błąd składniowy) = nadzbiór wszystkich nieśledzonych / śledzonych plików, chyba że w Git przed 2.0, przy czym jeśli podano specyfikację pliku kropki, to brany jest pod uwagę tylko ten konkretny folder. => jeśli element zostanie rozpoznany, git add -Aznajdzie go i doda.

Ścieżka jest następująca.

  • W Git przed 2.0, dla dwóch limiterów (aktualizacja i wszystkie), nową domyślną funkcją jest działanie na całym drzewie roboczym, zamiast na bieżącej ścieżce (Git 1.9 lub wcześniejszy),
  • Jednak w wersji 2.0 operacja może być ograniczona do bieżącej ścieżki: wystarczy dodać wyraźny przyrostek kropki (który jest również poprawny w Git 1.9 lub wcześniejszej);

git add -A .

git add -u .

Podsumowując, moja polityka jest następująca:

  1. Upewnij się, że wszelkie porcje / pliki, które mają zostać dodane, są uwzględnione w git status.
  2. Jeśli brakuje któregoś elementu z powodu niewidocznych plików / folderów, dodaj je osobno.
  3. Miej dobry .gitignoreplik, aby normalnie tylko pliki będące przedmiotem zainteresowania nie były śledzone i / lub nierozpoznawane.
  4. Z najwyższego poziomu repozytorium „git add -A”, aby dodać wszystkie elementy. Działa to we wszystkich wersjach Git.
  5. W razie potrzeby usuń wszystkie wymagane elementy z indeksu.
  6. Jeśli występuje duży błąd, wykonaj polecenie „git reset”, aby całkowicie wyczyścić indeks.
AnneTheAgile
źródło
12

git add .równa się git add -A .dodaje pliki do indeksu tylko z folderów bieżących i potomnych.

git add -A dodaje pliki do indeksu ze wszystkich folderów w działającym drzewie.

PS: informacje dotyczą Git 2.0 (2014-05-28).

Alex78191
źródło
9

Zarówno git add .i wprowadzi git add -Awszystkie nowe, zmodyfikowane i usunięte pliki w nowszych wersjach Git.

Różnica polega na tym, że git add -Apliki etapów znajdują się w „wyższych, bieżących i podkatalogach” należących do działającego repozytorium Git. Ale robienie git add .tylko etapów plików w bieżącym katalogu i następujących po nim podkatalogach ( nie plików leżących na zewnątrz, tj. Wyższych katalogów).

Oto przykład:

/my-repo
  .git/
  subfolder/
    nested-file.txt
  rootfile.txt

Jeśli bieżący katalog roboczy jest /my-repo, a ty rm rootfile.txt, a następnie cd subfolder, po git add ., to będzie nie wystawić usuniętego pliku. Ale robienie git add -Atego z pewnością wprowadzi tę zmianę bez względu na to, skąd wykonasz polecenie.

sbr_amd
źródło
3

-AOpcja Dodaje, modyfikuje i usuwa wpisy indeksu dopasować drzewo roboczą.

W Git 2 -Aopcja jest teraz domyślna.

Po .dodaniu a, który ogranicza zakres aktualizacji do katalogu, w którym aktualnie się znajdujesz, zgodnie z dokumentacją Git

Jeśli nie <pathspec>podano nie, gdy użyto opcji -A, wszystkie pliki w całym drzewie roboczym są aktualizowane (stare wersje Git służyły do ​​ograniczania aktualizacji do bieżącego katalogu i jego podkatalogów).

Jedną rzeczą, którą chciałbym dodać, jest to, że jeśli używany jest tryb --interactivelub -p, wówczas git addzachowuje się tak, jakby -uużywana była flaga update ( ) i nie dodaje nowych plików.

Yehuda Schwartz
źródło