Pytanie Różnica między "git add -A" i "git add."


Komenda git add [--all|-A] wydaje się być identyczna z git add .. Czy to jest poprawne? Jeśli nie, jak się różnią?


2398
2018-02-21 06:51


pochodzenie




Odpowiedzi:


Dla Wersja Git 2.xzobacz też odpowiedzi poniżej.


Podsumowanie:

  • git add -A gradacja Wszystko

  • git add . etapy nowe i zmodyfikowane, bez usuniętych

  • git add -u etapy zmodyfikowane i usunięte, bez nowych


Szczegół:

git add -A jest równa git add .; git add -u.

Ważny punkt o git add . jest to, że patrzy na drzewo robocze i dodaje wszystkie te ścieżki do etapowych zmian, jeśli są one zmienione lub są nowe i nie są ignorowane, nie wykonuje żadnych akcji "rm".

git add -u wygląda na wszystkich już śledzone pliki i etapy zmiany tych plików, jeśli są one różne lub zostały one usunięte. Nie dodaje żadnych nowych plików, tylko wprowadza zmiany w już zapisanych plikach.

git add -A jest przydatnym skrótem do robienia obu tych rzeczy.

Możesz przetestować różnice za pomocą czegoś podobnego (zauważ, że dla wersji Git 2.x twój wynik dla git add .  git status  będzie być innym):

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

3658
2018-02-21 09:00



Co powiesz na różnicę między git add *? - Jared
@Jared, dodano wyjaśnienie gwiazdką, aby odpowiedzieć na twoje pytanie - Geo
Dla uproszczenia, usuń wszystko powyżej części podsumowania w tej odpowiedzi. Jeśli nie, przenieś podsumowanie na górę. - maliayas
Aby uzyskać więcej informacji, w nowszych wersjach git git add -u stał się git add -u :/ z tym ostatnim parametrem będącym ścieżką, pozwalającą na -u pewnych katalogów, :/ obsługuje całe drzewo. - Brizee
@CharlesBailey, Git naprawdę miłość robienie rzeczy skomplikowanych bez ważnego powodu. Czy istnieje real wykorzystaj przypadek, w którym ktoś by tego potrzebował git add -u lub git add . Czyniąc to ułatwia mu to życie, nawet po uwzględnieniu dodatkowego podatku psychicznego, aby uniknąć problemów z synchronizacją? Zastanawiam się, dlaczego Git nie podzielił się add -u w dwa oddzielne polecenia add -u1 i add-u2 przy czym jeden działa dla plików zaczynających się od cyfr, a drugi dla plików rozpoczynających się od cyfr - Pacerier


Oto tabela do szybkiego zrozumienia:

Wersja Git 1.x: enter image description here

Wersja Git 2.x: enter image description here

Długie flagi:

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

Dalsze czytanie:


648
2017-09-25 12:45



Dzięki za stół. Czy istnieje sposób na dodanie tylko tych plików, które zostały zmodyfikowane. Brak nowych plików lub usuniętych plików - Gokul N K
@Gokul: Według ten post, możesz użyć git diff-files -z --diff-filter=M --name-only | xargs -0 git add aby dodać tylko zmodyfikowane pliki, ale nie nowe pliki ani usunięcia. - Ville
To nie do końca prawda, jak git add . dodaje tylko nowe pliki, które znajdują się w aktualnej ścieżce. To znaczy. jeśli masz nowy katalog ../foo, git add -A to wystawi, git add . nie będzie. - 0sh
Więc, git add . jest równa git add -A ., co jest równoważne git add "*" - flow2k


Z Git 2.0, git add -A jest domyślnie: git add . równa się git add -A ..

git add <path> jest taki sam jak "git add -A <path>"teraz, tak   "git add dir/"zauważy ścieżki usunięte z katalogu i   zanotuj usunięcie.
  W starszych wersjach Gita "git add <path>"używane do ignorowania przeprowadzek.

Możesz powiedzieć "git add --ignore-removal <path>" do   dodawać tylko dodane lub zmodyfikowane ścieżki w <path>, jeśli naprawdę chcesz.

git add jest jak git add :/ (dodaj wszystko z katalogu najlepszych repozytoriów git).
Zauważ, że git 2.7 (listopad 2015) pozwoli ci dodać folder o nazwie ":"!
Widzieć commit 29abb33 (25 października 2015 r.) Wg Junio ​​C Hamano (gitster).


Zauważ, że uruchomienie git 2.0 (Q1 lub Q2 2014), kiedy mówisz git add . (obecna ścieżka w drzewie roboczym), musisz użyć ".' w innym git add także polecenia.

To znaczy:

"git add -A ." jest równa "git add .; git add -u ."

(Uwaga na dodatkowe ".' dla git add -A i git add -u)

Bo git add -A lub git add -u działał (tylko uruchamianie git 2.0) na całe drzewo robocze, a nie tylko na obecnej ścieżce.

Te polecenia będą działają na całym drzewie w Git 2.0 dla spójności z "git commit -a"i inne polecenia.   Ponieważ nie będzie mechanizmu do zrobienia "git add -u"zachowywać się jak gdyby"git add -u .", ważne jest dla tych, którzy są przyzwyczajeni do"git add -u"(bez pathspec) aktualizowanie indeksu tylko dla ścieżek w bieżącym podkatalogu, aby rozpocząć szkolenie swoich palców, aby wyraźnie powiedzieć"git add -u ."kiedy mają na myśli, zanim pojawi się Git 2.0.

Ostrzeżenie jest generowane, gdy te komendy są uruchamiane bez parametru pathspec i gdy lokalne zmiany znajdują się poza bieżącym katalogiem, ponieważ zachowanie w Git 2.0 będzie inne   z dzisiejszej wersji w takiej sytuacji.


136
2018-04-23 06:32



Dzięki za szczegóły na temat .. Zawarłem je w mojej kompilacji add na RU.SO. - Nick Volynkin
@NickVolynkin To świetnie! Cieszę się, że międzynarodowa społeczność SO działa zgodnie z przeznaczeniem. Na przykład: ru.stackoverflow.com/a/431840 - VonC
@VonC, Nicea, ludzie z Git naprawdę mieli ochotę powiedzieć, że ich aktualizacja "sprawi, że rzeczy będą bardziej spójne". To, co zrobili, spowodowało więcej zamieszania i niekonsekwencji. Jest 26 alfabetów i oni miał aby ponownie użyć flagi, która jest już używana. - Pacerier


Tak więc z powyższych instrukcji Charlesa, po przetestowaniu mojego proponowanego zrozumienia byłby następujący:

# For the next commit
$ git add .   # add to index only files created/modified and not those deleted
$ git add -u  # add to index only files deleted/modified and not those created
$ git add -A  # do both operation at once, add to index all files

Ten link może również pomóc zrozumieć, w jakiej sytuacji mogą być stosowane te polecenia: Usuwanie usuniętych plików z katalogu roboczego Git.


126
2018-06-01 09:27



nie jest to już prawdą w wersji 2.0. Dodaj . równa się, aby dodać -A dla tej samej ścieżki, jedyną różnicą jest to, czy istnieją nowe pliki w innych ścieżkach drzewa - Claudiu Creanga


Późno na imprezę, ale to pytanie zasługuje również na bardziej destylowaną szybką odpowiedź.

git add -A 

Czy oba poniżej (takie same jak git add - all)

git add . 

Wprowadza nowe + zmodyfikowane pliki

git add -u 

Etapy zmodyfikowane + usunięte pliki


27
2018-04-06 12:56



Cześć, co, jeśli chcesz tylko przesuwać tylko zmodyfikowane pliki? Jak byś to zrobił? - TheGrapeBeyond
Witaj, dobre pytanie. Nie ma na to łatwej flagi, o ile wiem. Git diff-files -z --diff-filter = M -name-only | xargs -0 git add from -> stackoverflow.com/questions/14368093/... - K. Kilian Lindberg
Właściwie to jest git add :/ + git add -u :/ - Nick Volynkin


Rzeczy się zmieniają z Git 2.0:

  • -A jest teraz domyślny
  • stare zachowanie jest teraz dostępne z --ignore-removal
  • git add -u i git add -A w podkatalogu bez ścieżek w linii poleceń działają na całym drzewie

Więc dla 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 w bieżącym katalogu
  • bez kropki dodaj wszystkie pliki w projekcie niezależnie od bieżącego katalogu

23
2017-10-13 15:29



Nie sądzę, że to jest poprawne. Używanie git v2.10.windows.2 'git add' zwraca 'Nic nie zostało określone, nic nie dodano'. 'git add -A' dodaje wszystkie zmienione pliki. Co sugeruje, że "-A" nie jest domyślne. - Neutrino


W końcu myślę, że to rozumiem, wielkie dzięki wam wszystkim. Mam nadzieję, że może to dodać trochę więcej jasności.

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

Ograniczniki mogą wynosić -u lub -A lub zero.

Pathspec może być ścieżką do pliku lub kropką, "." wskazać bieżący katalog.

Ważna wiedza na temat tego, jak git "dodaje".

  • Niewidoczne pliki, poprzedzone kropką, (dotfiles) 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ście polega na dodaniu pustego pliku, być może niewidocznego, do śledzonych plików.)
  • Status Git nie wyświetla informacji podfolderu, tzn. Plików nieśledzonych, chyba że śledzony jest co najmniej jeden plik w tym podfolderze. Wcześniej git traktuje cały folder poza zakresem, a la "empty". Jest on pusty z śledzonych elementów.
  • Określanie plikuspec = "." (kropka) lub katalog bieżący nie jest rekursywny, chyba że podano również -A. Dot odnosi się wyłącznie do bieżącego katalogu - pomija ścieżki znalezione powyżej i poniżej.

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

Ograniczniki są następujące.

  • -u = --update = podzbiór na śledzone pliki => Dodaj = Nie; Zmień = Tak; Usuń = Tak. => iff element jest śledzony.
  • -A = --all (brak takiego -a, co daje błąd składni) = nadzbiór wszystkich nieśledzonych / śledzonych plików, chyba że w Git <2.0, w którym jeśli podano specyfikację punktową, to brany jest pod uwagę tylko ten konkretny folder. => iff element zostanie rozpoznany, git add -A go odnajdzie i doda.

Ścieżka patrzenia jest następująca.

  • W Git <2.0, dla dwóch ograniczników (aktualizacja i wszystkie), nową wartością domyślną jest operowanie na całym drzewie roboczym, zamiast na bieżącej ścieżce (git <= 1,9),
  • Jednak w wersji 2.0 operacja może być ograniczona do bieżącej ścieżki: wystarczy dodać przyrostek kropki jawnej (który jest również ważny w Git <= 1,9);

git add -A .

git add -u .

Podsumowując, moja polityka jest;

  • 1. Upewnij się, że wszystkie porcje / pliki do dodania są rozliczane w statusie git.
  • 1A. Jeśli brakuje jakichkolwiek elementów, z powodu niewidocznych plików / folderów dodaj je osobno.
  • 2.Dobrze dobrej gitignore, aby normalnie tylko interesujące pliki były nieśledzone i / lub nierozpoznane.
  • 3. Z najwyższego poziomu repozytu, "git add -A", aby dodać wszystkie przedmioty. Działa to we wszystkich wersjach git.
  • 4. Usuń pożądane elementy z indeksu, jeśli chcesz.
  • 6. Jeśli występuje duży błąd, wykonaj "git reset", aby całkowicie wyczyścić indeks.

11
2018-04-06 02:03





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

git add -A dodaje pliki do indeksu ze wszystkich folderów w drzewie roboczym.

P.S .: informacje dotyczą Git 2.0.


7
2018-06-03 19:12