Odpowiedzi:
Odpowiedź ta ma zastosowanie wyłącznie do Git wersji 1.x . W przypadku wersji Git 2.x zobacz inne odpowiedzi.
Podsumowanie:
git add -A
etapy wszystkie zmiany
git add .
przygotowuje nowe pliki i modyfikacje, bez usuwania
git add -u
modyfikuje i usuwa etapy, bez nowych plików
Szczegół:
git add -A
jest 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 -u
przeglą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
git add -A -p
że nie działa zgodnie z oczekiwaniami (pytaj interaktywnie o nieśledzone pliki)
git add -A :/
lubgit add -A .
git add -u
stał 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.
git add -u
albo 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 -u
na dwa odrębne poleceń add -u1
i add-u2
mocy których jeden działa dla plików zaczynające się cyframi, a drugi dla plików zaczynając niebędących cyframi
Oto tabela szybkiego zrozumienia:
Wersja Git 1.x :
Wersja Git 2.x :
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:
git diff-files -z --diff-filter=M --name-only | xargs -0 git add
dodawać tylko zmodyfikowane pliki, ale nie nowe pliki ani usunięcia.
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 -A
wystawisz go, git add .
nie zrobisz.
git add .
jest równoważne git add -A .
, co jest równoważnegit add "*"
W Git 2.0 git add -A
wartość domyślna: git add .
równa sięgit add -A .
.
git add <path>
jest taki sam jakgit 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 -A
jest 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 add
poleceniach.
To znaczy:
„
git add -A .
” jest równoważne z „git add .; git add -u .
”
(Uwaga na dodatkowe „ .
” dla git add -A
i git add -u
)
Ponieważ git add -A
lub git add -u
dział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.
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 .
Sytuacja zmieniła się wraz z Git 2.0 ( 2014-05-28 ):
-A
jest teraz domyślny--ignore-removal
.git add -u
aw git add -A
podkatalogu 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 katalogugit add --ignore-removal .
dodaje nowe / zmodyfikowane pliki w bieżącym katalogugit add -u .
dodaje zmodyfikowane / usunięte pliki do bieżącego kataloguBardziej destylowana szybka odpowiedź:
git add -A
git add .
git add -u
git add :/
+git add -u :/
W Git 2.x :
Jeśli znajdujesz się bezpośrednio w katalogu roboczym , to git add -A
i git add .
pracuj bez różnicy.
Jeśli znajdujesz się w dowolnym podkatalogu katalogu roboczego , git add -A
doda wszystkie pliki z całego katalogu roboczego i git add .
doda pliki z bieżącego katalogu .
I to wszystko.
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”:
-A
zostanie 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 -A
znajdzie go i doda.Ścieżka jest następująca.
git add -A .
git add -u .
Podsumowując, moja polityka jest następująca:
git status
..gitignore
plik, aby normalnie tylko pliki będące przedmiotem zainteresowania nie były śledzone i / lub nierozpoznawane.Zarówno git add .
i wprowadzi git add -A
wszystkie nowe, zmodyfikowane i usunięte pliki w nowszych wersjach Git.
Różnica polega na tym, że git add -A
pliki 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 -A
tego z pewnością wprowadzi tę zmianę bez względu na to, skąd wykonasz polecenie.
-A
Opcja Dodaje, modyfikuje i usuwa wpisy indeksu dopasować drzewo roboczą.
W Git 2 -A
opcja 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 --interactive
lub -p
, wówczas git add
zachowuje się tak, jakby -u
używana była flaga update ( ) i nie dodaje nowych plików.
git add *
?