Puncte:13

Care este diferența dintre git add * și git add .?

drapel us

Care este diferența dintre comenzi git add * și git add . cand pun parametri * și . în consecinţă? Ce listă de sistem de fișiere returnează în ambele cazuri?

drapel in
eis
Vezi: [stackoverflow: git add * (asterisc) vs git add . (perioada)](https://stackoverflow.com/questions/26042390/git-add-asterisk-vs-git-add-period)
drapel ag
Aceasta depinde de ce interpret de comandă utilizați pentru a executa git.
Puncte:32
drapel jp
Dan
  • * este un bash glob. Se va extinde la toate fișierele din directorul în care vă aflați, cu excepția fișierelor cu puncte (fișierele care încep cu un punct (.)).
  • . înseamnă directorul curent.

Rezultatul poate fi destul de diferit în funcție de conținutul directorului dvs. și dacă aveți un .gitignore fişier.

Luați în considerare că aveți următoarele fișiere și directoare în directorul dvs.:

.dotfile-care-trebuie-fie-commit
.git/
.gitignore
un-fișier-care-este-în-gitignore
vreun-alt-dosar

Când alergi git add *, globul este extins înainte ca comanda git să ruleze. Deci, ceea ce primește comanda git este următorul:

git adăugați un fișier-care-este-în-gitignore un alt fișier

Acest lucru provoacă patru probleme aici.

  1. Git se va plânge de asta un-fișier-care-este-în-gitignore nu poate fi adăugat și vă va cere să adăugați forța (-f) argument dacă chiar doriți să-l adăugați.
  2. ambii .dotfile-care-trebuie-fie-commit și .gitignore nu au fost adăugate ca * nu se extinde la dotfiles.
  3. Dacă ați șters fișiere din directorul în care vă aflați, * nu se pot extinde niciodată la acestea, așa că fișierele șterse nu vor fi puse în scenă.
  4. Dacă ați redenumit fișierele din directorul în care vă aflați, * nu se poate extinde niciodată la vechiul nume, dar se va extinde la cel nou. Deci, ceea ce va vedea git este că ați adăugat un fișier nou și, din moment ce vechiul nume nu a fost pus în scenă, veți ajunge cu același fișier existent de două ori, cu vechiul nume și noul nume.

Cu toate acestea, alergând git add . îi spune lui git să adauge directorul curent în care vă aflați fără a specifica ce fișier să adăugați. În acest caz, git va verifica .gitignore fișier și adăugați recursiv toate fișierele care nu sunt menționate în .gitignore.

În concluzie:

  • Ar trebui să folosești git add . nu git add *.

Chiar mai bine:

  • Utilizare git add full/file/paths astfel încât să nu adăugați lucruri din greșeală care nu sunt gata să fie adăugate.

Si chiar mai bine:

  • Utilizare git add -p pentru a vă revizui modificările și pentru a alege ce patch-uri doriți să fie adăugate.
drapel in
Și mai bine: `git add be/explicit`. Nu ar trebui să utilizați nici `git add *` nici `git add .`, deoarece ar trebui să fiți mult mai deliberat cu privire la ceea ce adăugați la git.
drapel st
Deși personal sunt un mare fan al lui `git add -p` și îl folosesc tot timpul, trebuie remarcat că există un mare pericol asociat cu acesta, și anume că puneți în scenă o stare care nu a existat niciodată în acest sens. se formează pe disc și, prin urmare, probabil că nu a fost niciodată testat. Din acest motiv, este interzis în unele ghiduri de utilizare Git din unele organizații.
John C avatar
drapel tr
De asemenea, sunt de acord cu utilizarea `git add .`, dar voi reține că este directorul curent și în jos - așa că dacă se întâmplă să fiți în jos într-un subdir (să zicem, la linia de comandă, nu un instrument GUI), ați" nu adăugați modificări în directoarele de nivel superior. În continuare, tind să fac un `git status`, doar pentru a mă asigura că nu am ratat nimic.
David Z avatar
drapel es
@JörgWMittag Interesant... deși aș susține că pericolul apare numai dacă nu te întorci și nu testezi comiterea rezultată.A face acest test este un lucru cu totul rezonabil de făcut și de așteptat de la oameni. Deci, personal, nu sunt de acord cu faptul că ar trebui notat; Cred că ar fi mai mult o distragere a atenției decât ar merita să adăugați asta la răspuns.
drapel in
eis
acest răspuns este relativ lung și încă omite toate lucrurile importante. cele mai importante cazuri de utilizare pentru utilizarea punctului sunt 1) toate subdirectoarele și 2) toate ștergerile/redenumirile, care nici măcar nu sunt menționate aici.
drapel jp
Dan
@eis Ai dreptate în privința ștergerii/redenumirilor. Voi adăuga detalii despre acestea. Dar în ceea ce privește subdirectoarele, `git add .` și `git add *` se comportă la fel pentru acelea atâta timp cât numele lor nu are un punct.
Puncte:3
drapel in

Altceva care nu este subliniat de răspunsurile curente ar fi că git add * nu va observa dacă ați șters sau redenumit fișiere, dar git add . voi.

Puncte:2
drapel my

Rezumat scurt

git add * înseamnă adăugarea tuturor fișierelor din directorul curent, cu excepția fișierelor al căror nume începe cu un punct. Aceasta este funcționalitatea ta shell și Git primește doar o listă de fișiere.


git add . nu are o semnificație specială în shell-ul dvs. și, astfel, Git adaugă întregul director în mod recursiv, care este aproape același, dar incluzând fișiere ale căror nume încep cu un punct.


Răspuns adaptat din stackoverflow

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.