Ich bin neu in Git und habe eine Frage zum Hinzufügen von Dateien in Git. Ich habe mehrere Fragen Stackoverflow über den Unterschied zwischen gefunden git add .
und git add -a
, git add --all
, git add -A
etc. Aber ich habe es nicht gelungen , einen Platz zu finden, der erklärt , was der git add *
Fall ist. Ich habe mir sogar die git add manpage angesehen , aber es hat nicht geholfen. Ich habe es anstelle von verwendet git add .
und mein Kollege fragte mich warum. Ich hatte keine Antwort. Ich habe es einfach immer benutzt git add *
.
Sind git add .
und git add *
das gleiche? Fügt einer nur geänderte Dateien aus dem aktuellen Verzeichnis hinzu, während der andere Dateien aus dem aktuellen Verzeichnis und den Unterverzeichnissen hinzufügt (rekursiv)?
Auf einer der anderen Stapelfragen ist ein großartiges Diagramm aufgeführt, das den Unterschied zwischen git add -A
git add .
und zeigt git add -u
, aber nicht git add *
.
Hinweis: Ich verstehe, was es bedeutet, das Sternchen als Platzhalter zu verwenden (alle Dateien mit einer bestimmten Erweiterung hinzufügen). Zum Beispiel git add *.html
würde alle Dateien hinzufügen , die eine haben .html
Erweiterung (aber ignorieren .css
, .js
usw.).
Danke für die Hilfe!
quelle
git add .
einmal versucht , und es stellte eine gelöschte Datei kein Problem bereit, anders als dieX
in dieser Zeile vorschlagen würde.Antworten:
add *
bedeutet, dass alle Dateien im aktuellen Verzeichnis hinzugefügt werden, mit Ausnahme von Dateien, deren Name mit einem Punkt beginnt. Dies ist Ihre Shell-Funktionalität und Git erhält immer nur eine Liste von Dateien.add .
hat keine besondere Bedeutung in Ihrer Shell, und daher fügt Git das gesamte Verzeichnis rekursiv hinzu, was fast gleich ist, jedoch Dateien enthält, deren Namen mit einem Punkt beginnen.quelle
git add .
Fügt also alle Dateien, Ordner und Unterordner hinzu, einschließlich .gitignore und alles andere, was mit einem Punkt beginnt, währendgit add *
Dateien, Ordner und Unterordner hinzugefügt werden, außer denen, die mit einem Punkt beginnen? Ist das richtig?git add *
würden weiterhin Dateien hinzugefügt, die mit einem Punkt beginnen, wenn sie sich in einem Unterverzeichnis befinden.git add .
respektiert auch .gitignore, wohingegengit add *
ein Fehler ausgelöst wird, wenn Nicht-Punkt-Dateien gitignored werden. Viel besser zu bedienengit add .
alsgit add *
.*
. In diesem Fall findet Git Punktedateien.*
, um sie vor der Shell zu schützen. Es geht nicht um das Verborgene, sondern nur darum, dass sich die kompilierten Regeln von Git unterscheiden.*
ist nicht Teil von git - es ist ein Platzhalter, der von der Shell interpretiert wird.*
Erweitert sich auf alle Dateien im aktuellen Verzeichnis und wird erst dann an git übergeben, dasadd
sie alle sind..
ist das aktuelle Verzeichnis selbst, undgit add
wenn es hinzugefügt wird, werden es und alle Dateien darunter hinzugefügt.quelle
*
vermeidet versteckte Dateien (dh Dateien, deren Name mit a beginnt.
). In jedem Fall würde ich nur verwenden, wenn Sie keine bestimmten Dateien hinzufügengit add -u
(odergit add -A
wenn Sie neue Dateien erstellen).Die Verwendung des Punkts
.
in der Shell bedeutet normalerweise "das aktuelle Verzeichnis".Wenn Sie das Sternchen
*
in einer Shell verwenden, wird eine Funktion namens aufgerufenfile-globbing
. ZB bei Bash macht die Funktionglob()
genau das. Die Manpage für glob (man 7 glob
) lautet:Das heißt, wenn Sie Argumente an ein Programm in der Befehlszeile übergeben, die das Platzhaltermuster enthalten
'?'
,'*'
oder wenn Sie'['
zuerst das Platzhaltermuster in eine Liste von Dateien erweitern, geben Sie diese Dateien dann als Argument an das Programm selbst weiter.Der Unterschied in der Bedeutung zwischen
'git add .'
und'git add *'
wird von Denis klar beschrieben :git add
erwartet, dass eine Liste von Dateien hinzugefügt wird. Im obigen Beispiel wird die Shell erweitert*
bzw..
gibt das Ergebnis als Parameter für git add an. Der Unterschied besteht nun darin, dass mitgit add .
git das aktuelle Verzeichnis erweitert wird, während dasgit add *
Globbing von Dateien ausgelöst wird und dies auf alle Dateien und Verzeichnisse erweitert wird, die nicht mit einem Punkt beginnen.quelle
Aus Gründen der Klarheit habe ich die Antwort in die folgende Tabelle eingetragen:
Zusätzliche Hinweise (inspiriert vom @ reka18-Kommentar):
Hinweis 1.
git add -A
undgit add -u
Befehle, die ohne zusätzliche Parameter ausgeführt werden, sind zusätzliche Verfeinerungen (Unterverzeichnis oder Maskenangabe für den Dateinamen) im Bereich des gesamten Arbeitsverzeichnisses (auch wenn wir den Befehl im Arbeitsunterverzeichnis des Verzeichnisses ausführen).Hinweis 2. Das
.
und*
sind jeweils der Verzeichnispfad (aktuelles Verzeichnis) und der Platzhalter, die den Pfad des Befehls verdeutlichen. Wenn der Befehlgit add .
oder beispielsweisegit add *
in einem Unterverzeichnis eines Arbeitsverzeichnisses ausgeführt wird, wird deren Aktion nur in diesem Unterverzeichnis verwendet, nicht im gesamten Arbeitsverzeichnis.Hinweis 3. Der
git add -A
undgit add -u
Befehle können durch einen Pfad hinzufügen oder für Dateien, beispielsweise Maske verfeinert werdengit add -A app/controllers
odergit add -u app\styles\*
.quelle
git add -A
undgit add .
sind identisch?git add -A
gilt für das gesamte Arbeitsverzeichnis undgit add .
immer für das aktuelle Verzeichnis).git add -A
(--all) Fügt alles hinzu, sodass alles in Ihrem Ordner auf der Festplatte im Staging-Bereich dargestellt wirdgit add .
Stuft alles bereit, entfernt jedoch keine Dateien, die von der Festplatte gelöscht wurdengit add *
Stuft alles bereit, aber keine Dateien, die mit einem Punkt beginnen, und entfernt keine Dateien, die von der Festplatte gelöscht wurdengit add -u
(--update) Stuft nur geänderte Dateien ein, entfernt Dateien, die von der Festplatte gelöscht wurden, fügt keine neuen hinzugit add <file name 1> <file name 2>
Fügt nur bestimmte Dateien hinzuquelle