Jestem nowy w git i mam pytanie dotyczące dodawania plików w git. Znalazłem wiele pytań stackoverflow o różnicy między git add .
i git add -a
, git add --all
, git add -A
, itd. Ale byłem w stanie znaleźć miejsce, które wyjaśnia co git add *
robi. Przejrzałem nawet stronę podręcznika git add , ale to nie pomogło. Używałem go zamiast git add .
i mój współpracownik zapytał mnie, dlaczego. Nie miałem odpowiedzi. Po prostu zawsze używałem git add *
.
Czy git add .
i git add *
to samo? Czy jeden dodaje zmienione pliki tylko z bieżącego katalogu, a drugi dodaje pliki z bieżącego katalogu i podkatalogów (rekurencyjnie)?
Na jednym z pozostałych pytań dotyczących stosu znajduje się świetny wykres, który pokazuje różnicę między git add -A
git add .
i git add -u
, ale tak nie jest git add *
.
Uwaga: rozumiem, co to znaczy używać gwiazdki jako symbolu wieloznacznego (dodaj wszystkie pliki z podanym rozszerzeniem). Na przykład, git add *.html
by dodać wszystkie pliki, które mają .html
rozszerzenie (ale ignorują .css
, .js
itp).
Dzięki za pomoc!
źródło
git add .
ponownie i bez problemu umieściłem usunięty plik, w przeciwieństwie doX
sugerowanego w tym wierszu.Odpowiedzi:
add *
oznacza dodanie wszystkich plików w bieżącym katalogu, z wyjątkiem plików, których nazwa zaczyna się od kropki. To jest twoja funkcja powłoki, a Git zawsze otrzymuje listę plików.add .
nie ma specjalnego znaczenia w twojej powłoce, dlatego Git dodaje rekurencyjnie cały katalog, który jest prawie taki sam, ale obejmuje pliki, których nazwy zaczynają się od kropki.źródło
git add .
dodaje wszystkie pliki, foldery i podfoldery, w tym .gitignore i wszystko inne zaczynające się od kropki, a jednocześniegit add *
dodaje pliki, foldery i podfoldery, z wyjątkiem tych zaczynających się kropką? Czy to jest dokładne?git add *
nadal będzie dodawać pliki zaczynające się od kropki, jeśli znajdują się w podkatalogu.git add .
szanuje również .gitignore, podczas gdygit add *
zgłosi błąd, jeśli jakiekolwiek pliki inne niż kropki zostaną poddane gitignore. O wiele lepiejgit add .
niżgit add *
.*
. W tym przypadku Git znajdzie pliki z kropkami.*
aby chronić go przed powłoką. Nie jest to kwestia ukrytego fragmentu, po prostu różnią się zasady wkompilowania Gita.*
nie jest częścią git - jest to symbol wieloznaczny interpretowany przez powłokę.*
rozwija się do wszystkich plików w bieżącym katalogu i dopiero wtedy jest przekazywany do git, któryadd
jest nimi wszystkimi..
jest samym bieżącym katalogiem igit add
doda go i wszystkie znajdujące się w nim pliki.źródło
*
unika ukrytych plików (tj. plików, których nazwa zaczyna się od a.
). W każdym razie, jeśli nie dodajesz określonych plików, po prostu użyjęgit add -u
(lubgit add -A
jeśli tworzysz nowe pliki).Użycie kropki
.
w powłoce zwykle oznacza „bieżący katalog”.Gdy używasz gwiazdki
*
na powłoce,file-globbing
używana jest funkcja o nazwie . Np. Na bash funkcja właśnieglob()
to robi. Strona podręcznika dla glob (man 7 glob
) stwierdza:To znaczy, kiedy przekazywać argumenty do dowolnego programu w linii poleceń, które zawierają
'?'
,'*'
lub'['
najpierw masek rozszerza wieloznaczny wzór na liście plików, a następnie daje te pliki jako argument do samego programu.Różnica w znaczeniu między
'git add .'
i'git add *'
jest wyraźnie opisana przez Denisa :git add
oczekuje listy plików do dodania. W powyższym przykładzie powłoka rozwija się odpowiednio*
lub.
i podaje wynik jako parametr do dodania git. Teraz różnica polega na tym, że zgit add .
git rozwija się do bieżącego katalogu, podczas gdygit add *
wyzwala globowanie plików i takie rozwija się do wszystkich plików i katalogów, które nie zaczynają się kropką.źródło
Dla jasności umieściłem odpowiedź w poniższej tabeli:
Dodatkowe uwagi (inspirowane komentarzem @ reka18):
Uwaga 1.
git add -A
agit add -u
komendy wykonywane bez dodatkowych parametrów byłyby dodatkowym uściśleniem (wskazaniem podkatalogu lub maski dla nazwy pliku) działającym w zakresie całego katalogu roboczego (także jeśli wykonamy polecenie w podkatalogu roboczym katalogu).Uwaga 2.
.
i*
są odpowiednio ścieżkę katalogu (katalog bieżący) i wieloznaczny, który wyjaśnienia ścieżkę polecenia. Na przykład, jeśli poleceniegit add .
lubgit add *
jest wykonywane w jakimś podkatalogu katalogu roboczego, ich akcja jest używana tylko w tym podkatalogu, a nie w całym katalogu roboczym.Uwaga 3.
git add -A
igit add -u
polecenia mogą być dalej udoskonalane przez dodanie ścieżki lub maski plików, na przykład,git add -A app/controllers
albogit add -u app\styles\*
.źródło
git add -A
igit add .
są identyczne?git add -A
dotyczy całego katalogu roboczego igit add .
zawsze katalogu bieżącego).git add -A
(--all) Dodaje wszystko, dzięki czemu wszystko w twoim folderze na dysku jest reprezentowane w obszarze przemieszczaniagit add .
Przechowuje wszystko, ale nie usuwa plików, które zostały usunięte z dyskugit add *
Etapuje wszystko, ale nie pliki zaczynające się od kropki i nie usuwa plików, które zostały usunięte z dyskugit add -u
(--update) Przechowuje tylko zmodyfikowane pliki, usuwa pliki, które zostały usunięte z dysku, nie dodaje nowychgit add <file name 1> <file name 2>
Dodaje tylko określone plikiźródło