web-dev-qa-db-de.com

Unterschied zwischen "git add -A" und "git add".

Der Befehl git add [--all|-A] scheint identisch zu git add . zu sein. Ist das richtig? Wenn nicht, wie unterscheiden sie sich?

2692
cmcginty

Diese Antwort gilt nur für Git Version 1.x. Für Git Version 2.x, siehe andere Antworten.


Zusammenfassung:

  • git add -A Stadien alle Änderungen

  • git add . stellt neue Dateien und Änderungen bereit, ohne Löschungen

  • git add -u führt Änderungen und Löschungen durch, ohne neue Dateien


Detail:

git add -A entspricht git add .; git add -u.

Der wichtige Punkt bei git add . ist, dass es den Arbeitsbaum betrachtet und all diese Pfade zu den bereitgestellten Änderungen hinzufügt, wenn sie entweder geändert oder neu sind und nicht ignoriert werden. Es werden keine 'rm'-Aktionen durchgeführt.

git add -u betrachtet alle bereits verfolgten Dateien und führt die Änderungen an diesen Dateien durch, wenn sie unterschiedlich sind oder entfernt wurden. Es werden keine neuen Dateien hinzugefügt, sondern nur Änderungen an bereits überwachten Dateien vorgenommen.

git add -A ist eine praktische Abkürzung für beides.

Sie können die Unterschiede mit so etwas testen (beachten Sie, dass für Git Version 2.x Ihre Ausgabe für git add .git statuswird unterschiedlich ist):

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
3989
CB Bailey

Hier ist eine Tabelle zum schnellen Verständnis:

Git Version 1.x enter image description here

Git Version 2.x enter image description here

Langform-Flags:

  • git add -A entspricht git add --all
  • git add -u entspricht git add --update

Weiterführende Literatur:

822
Developer

Bei Git 2.0 ist _git add -A_ der Standardwert: _git add ._ ist gleich _git add -A ._ .

_git add <path>_ ist jetzt dasselbe wie "_git add -A <path>_", sodass "_git add dir/_" Pfade erkennt, die Sie aus dem Verzeichnis entfernt haben, und die Entfernung aufzeichnet.
In älteren Git-Versionen wurde "_git add <path>_" verwendet, um Entfernungen zu ignorieren.

Sie können "_git add --ignore-removal <path>_" sagen, um nur hinzugefügte oder geänderte Pfade in _<path>_ hinzuzufügen, wenn Sie dies wirklich möchten.

_git add_ ist wie _git add :/_ ( alles aus dem Top-Git-Repo-Ordner hinzufügen ).
Beachten Sie, dass Sie mit git 2.7 (Nov. 2015) einen Ordner mit dem Namen "_:_" hinzufügen können!
Siehe Festschreiben 29abb (25. Oktober 2015) von Junio ​​C Hamano (gitster) .


Beachten Sie, dass ab Git 2.0 (Q1 oder Q2 2014) , wenn es um git add . geht (aktueller Pfad innerhalb des Arbeitsbaum), müssen Sie '_._' auch in den anderen _git add_ Befehlen verwenden.

Das bedeutet:

"_git add -A ._" entspricht "_git add .; git add -u ._"

(Beachten Sie das Extra '_._' für _git add -A_ und _git add -u_)

Weil _git add -A_ oder _git add -u_ auf dem gesamten Arbeitsbaum und nicht nur auf dem aktuellen (nur ab git 2.0) funktionieren würde Pfad.

Diese Befehle werden auf den gesamten Baum in Git 2.0 angewendet, um die Konsistenz mit "_git commit -a_" und anderen Befehlen zu gewährleisten. Da es keinen Mechanismus gibt, der bewirkt, dass sich "_git add -u_" so verhält, als ob "_git add -u ._", ist dies wichtig für diejenigen, die es gewohnt sind, "_git add -u_" (ohne Pfadangabe) nur den Index zu aktualisieren Damit Pfade im aktuellen Unterverzeichnis beginnen, ihre Finger so zu trainieren, dass sie explizit "_git add -u ._" sagen, wenn sie es meinen, bevor Git 2.0 kommt.

Eine Warnung wird ausgegeben, wenn diese Befehle ohne Pfadangabe ausgeführt werden und wenn Sie lokale Änderungen außerhalb des aktuellen Verzeichnisses vornehmen , da das Verhalten in Git 2.0 anders sein wird von der heutigen Version in einer solchen Situation.

161
VonC

Nach Charles 'Anweisungen würde mein vorgeschlagenes Verständnis nach dem Testen wie folgt lauten:

# 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

Dieser Blog-Beitrag kann auch hilfreich sein, um zu verstehen, in welcher Situation diese Befehle angewendet werden können: Entfernen gelöschter Dateien aus Ihrem Git-Arbeitsverzeichnis.

131
Richard

Eine noch schnellere Antwort:

Funktioniert beides wie git add --all)

git add -A

Stellt neue + geänderte Dateien bereit

git add .

Stuft geänderte + gelöschte Dateien ein

git add -u
34

Dinge geändert mit Git 2.0:

  • -A ist jetzt die Standardeinstellung
  • das alte Verhalten ist jetzt mit --ignore-removal verfügbar
  • git add -u und git add -A in einem Unterverzeichnis ohne Pfade in der Befehlszeile wirken sich auf den gesamten Baum aus

Für Git 2 lautet die Antwort also:

  • git add . und git add -A . fügen neue/geänderte/gelöschte Dateien zum aktuellen Verzeichnis hinzu
  • git add --ignore-removal . fügt neue/geänderte Dateien in das aktuelle Verzeichnis ein
  • git add -u . fügt geänderte/gelöschte Dateien in das aktuelle Verzeichnis ein
  • fügen Sie ohne Punkt alle Dateien im Projekt hinzu, unabhängig vom aktuellen Verzeichnis
28
0xF

In Git 2.x:

  • Wenn Sie sich direkt im Arbeitsverzeichnis befinden, funktionieren git add -A und git add . ohne Unterschied.

  • Wenn Sie sich in einem Unterverzeichnis des Arbeitsverzeichnisses befinden , fügt git add -A alle Dateien des gesamten Arbeitsverzeichnisses hinzu. Arbeitsverzeichnis und git add . fügen Dateien aus Ihrem aktuellen Verzeichnis hinzu.

Und das ist alles.

24
simhumileco

Endlich denke ich, ich verstehe das, vielen Dank an euch alle. Ich hoffe, dass dies zu mehr Klarheit führt.

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

Begrenzer können -u oder -A oder Null sein.

Pfadangabe kann ein Dateipfad oder Punkt sein, '.' um das aktuelle Verzeichnis anzuzeigen.

Wichtiges Hintergrundwissen darüber, wie Git "hinzufügt".

  • Unsichtbare Dateien, denen ein Punkt vorangestellt ist (Punktdateien), werden von Git nie automatisch erkannt. Sie werden nie als "nicht verfolgt" aufgeführt.
  • Leere Ordner werden von git niemals hinzugefügt. Sie werden nie als "nicht verfolgt" aufgeführt. (Eine Problemumgehung besteht darin, den nachverfolgten Dateien eine leere Datei hinzuzufügen, die möglicherweise unsichtbar ist.)
  • Git-Status zeigt keine Unterordnerinformationen an, dh keine nicht verfolgten Dateien, es sei denn, mindestens eine Datei in diesem Unterordner wird verfolgt. Zuvor betrachtet git den gesamten Ordner als "leer". Es enthält keine nachverfolgten Elemente.
  • Angabe einer Dateispezifikation = '.' (Punkt) oder das aktuelle Verzeichnis ist nicht rekursiv, es sei denn, -A ist ebenfalls angegeben. Punkt bezieht sich ausschließlich auf das aktuelle Verzeichnis - es werden die Pfade oben und unten weggelassen.

Mit diesem Wissen können wir nun die obigen Antworten anwenden.

Die Begrenzer sind wie folgt.

  • -u = --update = Teilmenge der nachverfolgten Dateien => Add = No; Ändern = Ja; Löschen = Ja. => wenn der Artikel verfolgt wird.
  • -A = --all (kein solches -a, was einen Syntaxfehler ergibt) = Obermenge aller nicht verfolgten/verfolgten Dateien, außer in Git <2.0, wobei bei Angabe der Punktdateispezifikation nur dieser bestimmte Ordner berücksichtigt wird. => Wenn das Objekt erkannt wird, wird es mit add -A gefunden und hinzugefügt.

Die Pfadangabe lautet wie folgt.

  • In Git <2.0 wird für die beiden Begrenzer (update und all) anstelle des aktuellen Pfads (git <= 1.9) standardmäßig der gesamte Arbeitsbaum bearbeitet.
  • In Version 2.0 kann der Vorgang jedoch auf den aktuellen Pfad beschränkt werden: Fügen Sie einfach das explizite Punktsuffix hinzu (das auch in Git <= 1.9 gültig ist).

git add -A .

git add -u .

Abschließend ist meine Politik;

  • 1.Stellen Sie sicher, dass alle hinzuzufügenden Hunks/Dateien im Git-Status berücksichtigt werden.
  • 1A.Wenn Elemente aufgrund unsichtbarer Dateien/Ordner fehlen, fügen Sie sie separat hinzu.
  • 2.Haben Sie einen guten Gitignore, so dass normalerweise nur Dateien von Interesse nicht verfolgt und/oder nicht erkannt werden.
  • 3.Fügen Sie auf der obersten Ebene des Repos "git add -A" hinzu, um alle Elemente hinzuzufügen. Dies funktioniert in allen Versionen von Git.
  • 4.Entfernen Sie bei Bedarf alle gewünschten Elemente aus dem Index.
  • 6.Wenn es einen großen Fehler gibt, setzen Sie den Git zurück, um den Index vollständig zu löschen.
11
AnneTheAgile

git add . entspricht git add -A . fügt Dateien nur aus aktuellen und untergeordneten Ordnern zum Index hinzu.

git add -A fügt Dateien aus allen Ordnern im Arbeitsbaum zum Index hinzu.

P.S .: Angaben beziehen sich auf Git 2.0.

9
Alex78191

Mit der Option -A werden Indexeinträge hinzugefügt, geändert und entfernt, damit sie mit der Arbeitsstruktur übereinstimmen.

In GIT 2 ist die Option -A jetzt voreingestellt.

Wenn ein . hinzugefügt wird, der den Umfang der Aktualisierung auf das Verzeichnis beschränkt, in dem Sie sich derzeit befinden, wie in der Git-Dokumentation angegeben

Wird bei Verwendung der Option -A kein <pathspec> angegeben, werden alle Dateien im gesamten Arbeitsbaum aktualisiert (alte Versionen von Git beschränken die Aktualisierung auf das aktuelle Verzeichnis und seine Unterverzeichnisse).

Eine Sache, die ich hinzufügen möchte, ist, dass wenn der --interactive oder -p -Modus verwendet wird, sich git add so verhält, als ob das Update-Flag (-u) verwendet wurde und keine neuen Dateien hinzugefügt werden

3
Yehuda Schwartz

Sowohl git add . als auch git add -A stellen alle neuen, geänderten und gelöschten Dateien in den neueren Versionen von git bereit.

Der Unterschied besteht darin, dass git add -A Dateien in "höheren, aktuellen und Unterverzeichnissen" speichert, die zu Ihrem Arbeitsgit-Repository gehören. Mit einem git add . werden jedoch nur Dateien im aktuellen Verzeichnis und den darauf folgenden Unterverzeichnissen (NICHT die Dateien, die sich außerhalb befinden, d. H. Höhere Verzeichnisse) abgelegt.

Hier ist ein Beispiel:

/my-repo
  .git/
  subfolder/
    nested-file.txt
  rootfile.txt

Wenn Ihr aktuelles Arbeitsverzeichnis /my-repo lautet und Sie rm rootfile.txt ausführen, dann cd subfolder, gefolgt von git add ., wird die gelöschte Datei NICHT bereitgestellt. Wenn Sie jedoch git add -A ausführen, wird diese Änderung mit Sicherheit durchgeführt, unabhängig davon, von wo aus Sie den Befehl ausführen.

Hoffe, das macht den Unterschied klar.

2
sbr_amd