Es gibt drei Stellen, an denen sich beispielsweise eine Datei befinden kann - den Baum, den Index und die Arbeitskopie. Wenn Sie einem Ordner nur eine Datei hinzufügen, fügen Sie sie der Arbeitskopie hinzu.
Wenn Sie so etwas tun, git add file
fügen Sie es dem Index hinzu. Und wenn Sie es festschreiben, fügen Sie es auch dem Baum hinzu.
Es wird Ihnen wahrscheinlich helfen, die drei häufigsten Flags beim Zurücksetzen von Git zu kennen:
Git Reset [- <mode>
] [ <commit>
]
Dieses Formular setzt den aktuellen Verzweigungskopf zurück <commit>
und aktualisiert möglicherweise den Index (Zurücksetzen auf den Baum von <commit>
) und den Arbeitsbaum, je nachdem <mode>
, welcher der folgenden Werte sein muss:
--soft
Berührt weder die Indexdatei noch den Arbeitsbaum (setzt jedoch den Kopf auf zurück <commit>
, genau wie in allen Modi). Dadurch bleiben alle geänderten Dateien "Änderungen müssen festgeschrieben werden", wie der Git-Status es ausdrücken würde.
--gemischt
Setzt den Index, aber nicht den Arbeitsbaum zurück (dh die geänderten Dateien werden beibehalten, aber nicht für das Festschreiben markiert) und meldet, was nicht aktualisiert wurde. Dies ist die Standardaktion.
--schwer
Setzt den Index und den Arbeitsbaum zurück. Alle Änderungen an nachverfolgten Dateien im Arbeitsbaum seitdem <commit>
werden verworfen.
Wenn Sie nun so etwas tun git reset HEAD
- was Sie tatsächlich tun, ist, git reset HEAD --mixed
dass der Index auf den Zustand "zurückgesetzt" wird, der vor dem Hinzufügen von Dateien / Hinzufügen von Änderungen zum Index (über git add
) war. In diesem Fall die Arbeitskopie und die Index (oder Staging) waren synchron, aber Sie haben HEAD und Index nach dem Zurücksetzen synchronisiert.
git rm
Auf der anderen Seite wird eine Datei aus dem Arbeitsverzeichnis und dem Index entfernt. Wenn Sie ein Commit ausführen, wird die Datei auch aus dem Baum entfernt. git rm --cached
Entfernt die Datei jedoch nur aus dem Index und behält sie in Ihrer Arbeitskopie. Dies ist das genaue Gegenteil von git add file
In diesem Fall haben Sie den Index so gestaltet, dass er sich vom HEAD und vom funktionierenden unterscheidet. Der HEAD verfügt über die zuvor festgeschriebene Version der Datei. Die Arbeitskopie hatte die letzte Änderung, falls vorhanden, oder den Inhalt von HEAD von die Datei und Sie haben die Datei aus dem Index entfernt. Ein Commit synchronisiert jetzt den Index und den Baum und die Datei wird entfernt.
git rm --cached
demgit diff
Befehl kein Diff angezeigt wird, sonderngit diff --cached
der Diff, als ob er noch zwischengespeichert wäre. Dasgit status
zeigt jedoch die Datei alsUntracked
. Scheint irgendwie inkonsistent.git reset --mixed
. Ich war ein wenig verwirrt von der Aussage,git rm --cached
die das Gegenteil von istgit add
. Wörtlich genommen ist es falsch und kann Schäden verursachen. In meinem Fall habe ichgit add
dem Staging-Bereich eine geänderte Datei hinzugefügt und wollte das Gegenteil von "das Hinzufügen" und nicht das anfängliche Hinzufügen der Datei. + Greg Hewgills Antwort hat mir geholfen, ein klareres Bild zu bekommen.git rm --cached
"ist das genaue Gegenteil vongit add file
".git reset file
ist näher am Gegenteil vongit add file
.Vielleicht hilft ein Beispiel:
gegen
Beachten Sie , dass das zweite Commit nichts bewirkt , wenn Sie nichts anderes geändert haben.
quelle
--
wird Befehlsoptionen von Dateinamen getrennt. Wenn es sowohl einen Zweig als auch eine Datei mit dem Namen gäbeasd
,git reset HEAD asd
wäre dies mehrdeutig. Das--
sagt "alles, was darauf folgt, ist ein Dateiname".git reset HEAD <file>
genau das gleiche wiegit rm --cached <file>
und danngit add --intent-to-add <file>
?git rm --cached file
wird entfernen Sie die Datei von der Bühne. Das heißt, wenn Sie festschreiben, wird die Datei entfernt.git reset HEAD -- file
Setzt die Datei im Staging-Bereich einfach auf den Zustand zurück, in dem sie sich beim HEAD-Commit befand, dh macht alle Änderungen rückgängig, die Sie seit dem letzten Commit daran vorgenommen haben. Wenn diese Änderung die Datei neu hinzufügt, sind sie gleichwertig.quelle
git rm --cached file
das Gegenteil von istgit add
, ergab diese Antwort für mich sehr viel Sinn und war ziemlich prägnant. Fast so kurz wie dieser Kommentar;)git rm --cached file
ist nicht das Gegenteil vongit add file
. Das Verhalten ist genau das Gegenteil von demgit add file
in dem speziellen Fall, in dem Sie eine neue, zuvor nicht verfolgte Datei hinzugefügt haben. In jedem anderen Fall des anderengit add file
istgit reset HEAD file
.git reset HEAD file
kehrt sich auchgit add file
im ersten Fall um (Hinzufügen einer nicht verfolgten Datei) und in jedem Fall, weshalb es das ist, was git vorschlägt, wenn Sie ein git-Add umkehren möchten.