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

2918

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

cmcginty
quelle

Antworten:

4241

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


Zusammenfassung:

  • git add -Ainszeniert alle Änderungen

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

  • git add -uStellt Änderungen und Löschungen ohne neue Dateien bereit


Detail:

git add -Aist äquivalent zu git add .; git add -u.

Der wichtige Punkt dabei git add .ist, dass der Arbeitsbaum betrachtet und alle diese Pfade zu den bereitgestellten Änderungen hinzugefügt werden, wenn sie entweder geändert oder neu sind und nicht ignoriert werden. Es werden keine "rm" -Aktionen ausgeführt.

git add -uÜberprüft 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 verfolgten Dateien vorgenommen.

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

Sie können die Unterschiede testen , mit so etwas wie dieses (beachten Sie, dass für Git - Version Ihrer Ausgabe 2.x für git add . git status wird anders sein):

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
CB Bailey
quelle
41
Wie wäre es mit dem Unterschied zwischen git add *?
Jared
3
Schade, git add -A -pfunktioniert nicht wie erwartet (fragen Sie interaktiv nach nicht verfolgten Dateien)
Erik Kaplun
2
Bitte aktualisieren Sie die Antwort. Es sollte sein: git add -A :/odergit add -A .
Gabriel Llamas
5
Zur Information, in neueren Versionen von git git add -uwurde git add -u :/der letztere Parameter als Pfad verwendet, der es Ihnen ermöglicht, bestimmte Verzeichnisse zu verwenden und :/den gesamten Baum zu behandeln.
Brizee
15
@ CharlesBailey, Git liebt es wirklich , Dinge ohne guten Grund kompliziert zu machen. Gibt es einen realen Anwendungsfall, bei dem jemand etwas speziell benötigt git add -uoder oder auf git add .diese Weise sein Leben erleichtert, selbst nachdem die zusätzliche mentale Steuer berücksichtigt wurde, um sicherzustellen, dass keine Synchronisierungsprobleme auftreten? Ich frage mich, warum Git nicht weiter add -uin zwei separate Befehle aufgeteilt wird add -u1und add-u2wobei einer für Dateien funktioniert, die mit Ziffern beginnen, und der andere für Dateien, die mit Nicht-Ziffern beginnen
Pacerier
946

Hier ist eine Tabelle zum schnellen Verständnis:

Git Version 1.x :

Geben Sie hier die Bildbeschreibung ein

Git Version 2.x :

Geben Sie hier die Bildbeschreibung ein

Langform-Flags:

  • git add -A ist äquivalent zu git add --all
  • git add -u ist äquivalent zu git add --update

Weiterführende Literatur:

Entwickler
quelle
1
Danke für den Tisch. Gibt es eine Möglichkeit, nur die geänderten Dateien hinzuzufügen? Keine neuen Dateien oder gelöschten Dateien
Gokul NK
3
@Gokul: Laut diesem Beitrag können Sie git diff-files -z --diff-filter=M --name-only | xargs -0 git addnur die geänderten Dateien hinzufügen, nicht aber die neuen Dateien oder die Löschungen.
Ville
93
Dies ist nicht ganz richtig, da git add .nur neue Dateien hinzugefügt werden, die sich auf dem aktuellen Pfad befinden. Dh wenn Sie ein neues Verzeichnis haben ../foo, git add -Awird es inszeniert, git add .nicht.
Milo Wielondek
2
Also, git add .ist äquivalent zu git add -A ., was äquivalent istgit add "*"
flow2k
Ich bin immer noch verwirrt über git add "*", können Sie es bitte etwas näher erläutern?
HS Umer farooq
176

Bei Git 2.0 git add -Aist Standard: git add .gleichgit add -A . .

git add <path>ist dasselbe wie " git add -A <path>" jetzt, so dass " git add dir/" Pfade bemerkt, die Sie aus dem Verzeichnis entfernt haben, und das Entfernen aufzeichnet.
In älteren Versionen von Git wurden " git add <path>" Entfernungen ignoriert.

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

git add -Aist wie git add :/( füge alles aus dem Top-Git-Repo-Ordner hinzu ).
Beachten Sie, dass Sie mit Git 2.7 (Nov. 2015) einen Ordner mit dem Namen " :" hinzufügen können !
Siehe Commit 29abb33 (25. Oktober 2015) von Junio ​​C Hamano ( gitster) .


Beachten Sie, dass Sie ab Git 2.0 (Q1 oder Q2 2014) , wenn Sie über git add .(aktueller Pfad innerhalb des Arbeitsbaums) sprechen , ' .' auch in den anderen git addBefehlen verwenden müssen.

Das bedeutet:

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

(Beachten Sie das zusätzliche ' .' für git add -Aund git add -u)

Weil git add -Aoder git add -uwürde (nur ab Git 2.0) für den gesamten Arbeitsbaum und nicht nur für den aktuellen Pfad arbeiten.

Diese Befehle werden aus Gründen der Konsistenz mit " git commit -a" und anderen Befehlen für den gesamten Baum in Git 2.0 ausgeführt . Da es keinen Mechanismus gibt, mit dem sich " git add -u" so verhält, als ob " git add -u .", ist es wichtig, dass diejenigen, die es gewohnt sind, git add -uden Index "(ohne Pfadangabe)" nur für Pfade im aktuellen Unterverzeichnis zu aktualisieren, damit beginnen, ihre Finger zu trainieren, um explizit zu sagen " git add -u ."wenn sie es ernst 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 haben , da sich das Verhalten in Git 2.0 in einer solchen Situation von der heutigen Version unterscheidet.

VonC
quelle
3
@ NickVolynkin Das ist großartig! Ich bin froh zu sehen, dass die internationale Gemeinschaft von SO wie beabsichtigt funktioniert. Als Referenz: ru.stackoverflow.com/a/431840
VonC
@VonC, Nice, die Git-Leute hatten tatsächlich die Wange zu sagen, dass ihr Update "die Dinge konsistenter machen" wird. Was sie getan hatten, führte zu mehr Verwirrung und Inkonsistenzen. Es gibt 26 Alphabete und sie mussten eine bereits verwendete Flagge wiederverwenden.
Pacerier
136

Von Charles' Anweisungen , nach meinem Vorschlag Verständnis Prüfung würde wie folgt aussehen :

# 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 .

Richard
quelle
6
Dies gilt nicht mehr in 2.0. hinzufügen . Entspricht dem Hinzufügen von -A für denselben Pfad. Der einzige Unterschied besteht darin, dass neue Dateien in anderen Pfaden des Baums vorhanden sind
Claudiu Creanga
41

Mit Git 2.0 ( 28.05.2014 ) haben sich die Dinge geändert :

  • -A ist jetzt die Standardeinstellung
  • Das alte Verhalten ist jetzt mit verfügbar --ignore-removal.
  • git add -uund git add -Ain einem Unterverzeichnis ohne Pfade in der Befehlszeile wird der gesamte Baum bearbeitet.

Für Git 2 lautet die Antwort also:

  • git add .und git add -A .fügen Sie neue / geänderte / gelöschte Dateien im aktuellen Verzeichnis hinzu
  • git add --ignore-removal . Fügt neue / geänderte Dateien zum aktuellen Verzeichnis hinzu
  • git add -u . Fügt geänderte / gelöschte Dateien zum aktuellen Verzeichnis hinzu
  • Fügen Sie ohne Punkt alle Dateien im Projekt hinzu, unabhängig vom aktuellen Verzeichnis.
0xF
quelle
4
Ich denke nicht, dass das richtig ist. Mit git v2.10.windows.2 gibt 'git add' 'Nichts angegeben, nichts hinzugefügt' zurück. 'git add -A' fügt alle geänderten Dateien hinzu. Was darauf hindeutet, dass '-A' nicht die Standardeinstellung ist.
Neutrino
34

Eine schnellere Antwort:

Tut beides unten (wie git add --all )

git add -A

Stuft neue + geänderte Dateien ein

git add .

Stufen geändert + gelöschte Dateien

git add -u
K. Kilian Lindberg
quelle
5
Hallo, was ist, wenn Sie nur geänderte Dateien bereitstellen möchten? Wie würdest du das machen?
TheGrapeBeyond
2
Hallo, gute Frage. Soweit ich weiß, gibt es dafür kein einfaches Flag. Git diff-files -z --diff-filter = M --name-only | xargs -0 git hinzufügen von -> stackoverflow.com/questions/14368093/…
K. Kilian Lindberg
2
Eigentlich ist es git add :/+git add -u :/
Nick Volynkin
27

In Git 2.x :

  • Wenn Sie direkt an der sich das Arbeitsverzeichnis , dann git add -Aund git add .Arbeit ohne Unterschied.

  • Wenn Sie sich in einem Unterverzeichnis des Arbeitsverzeichnisses befinden , git add -Awerden alle Dateien aus dem gesamten Arbeitsverzeichnis und git add .Dateien aus Ihrem aktuellen Verzeichnis hinzugefügt .

Und das ist alles.

simhumileco
quelle
12

Ich hoffe, dass dies mehr Klarheit schafft.

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

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

Pathspec kann ein Dateipfad oder ein Punkt sein. '.' um das aktuelle Verzeichnis anzugeben.

Wichtiges Hintergrundwissen darüber, wie Git 'hinzufügt':

  • Unsichtbare Dateien, denen ein Punkt vorangestellt ist (Punktedateien), werden von Git niemals automatisch erkannt. Sie werden nicht einmal als "nicht verfolgt" aufgeführt.
  • Leere Ordner werden von Git niemals hinzugefügt. Sie werden nicht einmal als "nicht verfolgt" aufgeführt. (Eine Problemumgehung besteht darin, den nachverfolgten Dateien eine möglicherweise unsichtbare leere Datei hinzuzufügen.)
  • Der Git-Status zeigt keine Unterordnerinformationen an, dh nicht verfolgte Dateien, es sei denn, mindestens eine Datei in diesem Unterordner wird verfolgt. Vor dieser Zeit betrachtet Git den gesamten Ordner als außerhalb des Gültigkeitsbereichs, a la 'leer'. Es ist leer von verfolgten Elementen.
  • Angabe einer Dateispezifikation = '.' (Punkt) oder das aktuelle Verzeichnis ist nicht rekursiv, es -Asei denn, dies ist ebenfalls angegeben. Punkt bezieht sich ausschließlich auf das aktuelle Verzeichnis - es werden die oben und unten gefundenen Pfade weggelassen.

Angesichts dieses Wissens können wir nun die obigen Antworten anwenden.

Die Begrenzer sind wie folgt.

  • -u= --update= Teilmenge zu verfolgten Dateien => Hinzufügen = Nein; Ändern = Ja; Löschen = Ja. => wenn der Artikel verfolgt wird.
  • -A= --all(keine solche -a, was zu einem Syntaxfehler führt) = Obermenge aller nicht verfolgten / verfolgten Dateien, außer in Git vor 2.0, wobei, wenn die Punktdateispezifikation angegeben ist, nur dieser bestimmte Ordner berücksichtigt wird. => Wenn das Objekt erkannt wird, git add -Awird es gefunden und hinzugefügt.

Die Pfadangabe lautet wie folgt.

  • In Git vor 2.0 besteht die neue Standardeinstellung für die beiden Begrenzer (Update und alle) darin, den gesamten Arbeitsbaum anstelle des aktuellen Pfads (Git 1.9 oder früher) zu bearbeiten.
  • In Version 2.0 kann die Operation jedoch auf den aktuellen Pfad beschränkt werden: Fügen Sie einfach das explizite Punktsuffix hinzu (das auch in Git 1.9 oder früher gültig ist).

git add -A .

git add -u .

Zusammenfassend lautet meine Politik:

  1. Stellen Sie sicher, dass alle hinzuzufügenden Hunks / Dateien berücksichtigt werden git status.
  2. Wenn Elemente aufgrund unsichtbarer Dateien / Ordner fehlen, fügen Sie sie separat hinzu.
  3. Haben Sie eine gute .gitignoreDatei, damit normalerweise nur Dateien von Interesse nicht verfolgt und / oder nicht erkannt werden.
  4. Klicken Sie auf der obersten Ebene des Repositorys auf "git add -A", um alle Elemente hinzuzufügen. Dies funktioniert in allen Versionen von Git.
  5. Entfernen Sie bei Bedarf alle gewünschten Elemente aus dem Index.
  6. Wenn es einen großen Fehler gibt, führen Sie 'git reset' aus, um den Index vollständig zu löschen.
AnneTheAgile
quelle
12

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

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

PS: Informationen beziehen sich auf Git 2.0 (28.05.2014).

Alex78191
quelle
9

Beide git add .und git add -Awerden alle neuen, geänderten und gelöschten Dateien in den neueren Versionen von Git bereitstellen.

Der Unterschied besteht darin, dass git add -ADateien in "höheren, aktuellen und Unterverzeichnissen" bereitgestellt werden, die zu Ihrem funktionierenden Git-Repository gehören. Wenn Sie jedoch git add .nur Dateien im aktuellen Verzeichnis und in den darauf folgenden Unterverzeichnissen ausführen ( nicht die Dateien, die außerhalb liegen, dh höhere Verzeichnisse).

Hier ist ein Beispiel:

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

Wenn Ihr aktuelles Arbeitsverzeichnis lautet /my-repound Sie dies tun rm rootfile.txt, cd subfoldergefolgt von git add ., wird die gelöschte Datei nicht bereitgestellt. Aber git add -Awenn Sie dies tun, wird diese Änderung sicherlich durchgeführt, unabhängig davon, von wo aus Sie den Befehl ausführen.

sbr_amd
quelle
3

Die -AOption fügt Indexeinträge hinzu, ändert sie und entfernt sie entsprechend dem Arbeitsbaum.

In Git 2 ist die -AOption jetzt die Standardeinstellung.

Wenn a .hinzugefügt wird, wird der Umfang des Updates gemäß der Git-Dokumentation auf das Verzeichnis beschränkt, in dem Sie sich gerade befinden

Wenn <pathspec>bei Verwendung der Option -A kein angegeben wird, 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 würde, ist, dass wenn der Modus --interactiveoder -pverwendet git addwird, sich das Verhalten so verhält, als ob das -uFlag update ( ) verwendet wurde, und keine neuen Dateien hinzugefügt werden.

Yehuda Schwartz
quelle