Manchmal schlägt git vor git rm --cached
, eine Datei zu entfernen, manchmal git reset HEAD file
. Wann soll ich welche verwenden?
BEARBEITEN:
D:\code\gt2>git init
Initialized empty Git repository in D:/code/gt2/.git/
D:\code\gt2>touch a
D:\code\gt2>git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# a
nothing added to commit but untracked files present (use "git add" to track)
D:\code\gt2>git add a
D:\code\gt2>git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: a
#
D:\code\gt2>git commit -m a
[master (root-commit) c271e05] a
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 a
D:\code\gt2>touch b
D:\code\gt2>git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# b
nothing added to commit but untracked files present (use "git add" to track)
D:\code\gt2>git add b
D:\code\gt2>git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: b
#
git rm
können beide Stufe eine Löschung und auch unstage ein Zusatz )rm
, sie rückgängig zu machenadd
? Wie solltest du dichrm
verhalten?git init
keinHEAD
Zurücksetzen möglich ist.rm
impliziert das Löschen in einem Unix-Kontext. Es ist nicht das Gegenteil von Hinzufügen zum Index. Eine Funktion zum Entfernen von Dateien sollte nicht mit Funktionen zum Ändern des Staging-Status überladen werden. Wenn es Implementierungsdetails gibt, die das Kombinieren vereinfachen, deutet dies einfach auf das Fehlen einer durchdachten Abstraktionsebene in git hin, was die Benutzerfreundlichkeit klar machen würde.Antworten:
git rm --cached <filePath>
Löst eine Datei nicht ab, sondern entfernt tatsächlich die Datei (en) aus dem Repo (vorausgesetzt, sie wurde bereits zuvor festgeschrieben), belässt die Datei jedoch in Ihrem Arbeitsbaum (sodass Sie eine nicht verfolgte Datei erhalten).git reset -- <filePath>
wird unstage abgestufte Änderungen für die jeweilige Datei (en).Wenn Sie jedoch
git rm --cached
eine neue Datei verwenden, die bereitgestellt wird, sieht es im Grunde so aus, als hätten Sie sie gerade nicht bereitgestellt, da sie noch nie festgeschrieben wurde.Update git 2.24
In dieser neueren Version von git können Sie
git restore --staged
stattdessen verwendengit reset
. Siehe Git-Dokumente .quelle
git rm --cached
dass die Datei nicht bereitgestellt wird, aber nicht aus dem Arbeitsverzeichnis entfernt wird.git rm --cached <filePath>
einige Dateien aus dem Repo entfernt, nachdem festgestellt wurde, dass sie niemals im Repo enthalten sein sollten. Führen Sie diesen Befehl also höchstwahrscheinlich aus und fügen Sie dann die entsprechenden Dateien hinzugitignore
. Hab ich recht?unstage
Befehl haben wollengit
.git rm --cached
wird verwendet, um eine Datei aus dem Index zu entfernen. Wenn sich die Datei bereits im Repo befindet,git rm --cached
wird die Datei aus dem Index entfernt und im Arbeitsverzeichnis belassen. Durch ein Commit wird sie nun auch aus dem Repo entfernt. Grundsätzlich hätten Sie nach dem Festschreiben die Version deversioniert und eine lokale Kopie aufbewahrt.git reset HEAD file
(das standardmäßig das--mixed
Flag verwendet) unterscheidet sich darin, dass in dem Fall, in dem sich die Datei bereits im Repo befindet, die Indexversion der Datei durch die aus dem Repo (HEAD) ersetzt wird, wodurch die Änderungen an der Datei effektiv aufgehoben werden .Im Fall einer nicht versionierten Datei wird die gesamte Datei freigegeben, da die Datei nicht im HEAD vorhanden war. In dieser Hinsicht
git reset HEAD file
undgit rm --cached
sind gleich, aber sie sind nicht gleich (wie im Fall von Dateien erklärt, die bereits im Repo sind)Auf die Frage
Why are there 2 ways to unstage a file in git?
- es gibt nie wirklich nur einen Weg, etwas in Git zu tun. das ist das Schöne daran :)quelle
there is never really only one way to do anything in git. that is the beauty of it
- Hmm warum ? Es ist immer toll, wenn es nur einen offensichtlichen Weg gibt. Dies spart viel Zeit und Gedächtnis im Gehirn))Recht einfach:
git rm --cached <file>
macht git auf, die Datei vollständig zu verfolgen (belässt sie im Gegensatz zu normalemgit rm
* im Dateisystem )git reset HEAD <file>
Stellt alle Änderungen fest, die seit dem letzten Festschreiben an der Datei vorgenommen wurden (setzt sie jedoch nicht im Dateisystem zurück, entgegen dem Befehlsnamen **). Die Datei bleibt unter Revisionskontrolle.Wenn die Datei zuvor nicht in der Revisionskontrolle war (dh Sie stellen eine Datei wieder auf, die Sie gerade
git add
zum ersten Mal bearbeitet haben), haben die beiden Befehle den gleichen Effekt, sodass diese "zwei Möglichkeiten" sind, etwas zu tun ".* Beachten Sie den Vorbehalt, den @DrewT in seiner Antwort in Bezug
git rm --cached
auf eine Datei erwähnt, die zuvor im Repository festgeschrieben wurde . Im Zusammenhang mit dieser Frage, einer Datei, die gerade hinzugefügt und noch nicht festgeschrieben wurde, besteht kein Grund zur Sorge.** Ich hatte eine peinlich lange Zeit Angst, den Befehl git reset wegen seines Namens zu verwenden - und noch heute schaue ich oft in der Syntax nach, um sicherzugehen, dass ich es nicht vermassle. ( Update : Ich habe mir endlich die Zeit genommen, die Verwendung von
git reset
auf einer tldr-Seite zusammenzufassen . Jetzt habe ich ein besseres mentales Modell der Funktionsweise und eine Kurzreferenz , wenn ich einige Details vergesse.)quelle
git rm <file> --cached
rm --cached
und Drücken von Daten, die denselben Zweig ziehen, die Dateien tatsächlich aus ihrem Arbeitsbaum entfernt werden.Dieser Thread ist etwas alt, aber ich möchte noch eine kleine Demonstration hinzufügen, da es sich immer noch nicht um ein intuitives Problem handelt:
git reset HEAD
(ohne-q
) gibt eine Warnung über die geänderte Datei aus und ihr Exit-Code ist 1, was als Fehler in einem Skript betrachtet wird.Bearbeiten: Funktioniert
git checkout HEAD to-be-modified to-be-removed
auch zum Aufheben der Bereitstellung, entfernt die Änderung jedoch vollständig aus dem ArbeitsbereichUpdate Git 2.23.0: Von Zeit zu Zeit ändern sich die Befehle. Jetzt
git status
sagt:... was für alle drei Arten von Änderungen funktioniert
quelle
Wenn Sie versehentlich Dateien bereitgestellt haben, die Sie nicht festschreiben möchten, und sicher sein möchten, dass Sie die Änderungen beibehalten, können Sie auch Folgendes verwenden:
Dadurch wird HEAD zurückgesetzt und Ihre Änderungen werden erneut angewendet, sodass Sie einzelne Dateien für das Festschreiben erneut bereitstellen können. Dies ist auch hilfreich, wenn Sie vergessen haben, einen Feature-Zweig für Pull-Anforderungen zu erstellen (
git stash ; git checkout -b <feature> ; git stash pop
).quelle
git stash
hat andere damit verbundene Vorteile, da es Einträge im Reflog erstellt, die dann in Zukunft verfügbar sind. Wenn Sie Zweifel haben, machen Sie eingit stash
(z. B.git stash save -u "WIP notes to self"
(das '-u' soll alle neuen / nicht verfolgten Dateien in das Stash-Commit aufnehmen) ... und versuchen Sie danngit reflog show stash
, die Liste der Stash-Commits und ihrer shas anzuzeigen. Ich empfehle eine Shell Alias wiealias grs="git reflog show stash"
Diese beiden Befehle weisen einige geringfügige Unterschiede auf, wenn sich die betreffende Datei bereits im Repo befindet und unter Versionskontrolle steht (zuvor festgeschrieben usw.):
git reset HEAD <file>
Stellt die Datei im aktuellen Commit bereit.git rm --cached <file>
wird die Datei auch für zukünftige Commits freigeben. Es ist nicht inszeniert, bis es wieder hinzugefügt wirdgit add <file>
.Und es gibt noch einen wichtigen Unterschied:
git rm --cached <file>
und Verschieben Ihres Zweigs auf die Fernbedienung wird die Datei von jedem, der Ihren Zweig von der Fernbedienung abruft, WIRKLICH aus seinem Ordner gelöscht, obwohl die Datei in Ihrem lokalen Arbeitssatz nur nicht mehr verfolgt wird (dh nicht physisch aus dem Ordner gelöscht wird).Dieser letzte Unterschied ist wichtig für Projekte, die eine Konfigurationsdatei enthalten, in der jeder Entwickler im Team eine andere Konfiguration hat (dh eine andere Basis-URL, IP- oder Porteinstellung). Wenn Sie also
git rm --cached <file>
jemanden verwenden , der Ihren Zweig zieht, muss dieser manuell neu erstellt werden Erstellen Sie die Konfiguration, oder Sie können ihnen Ihre senden und sie können sie wieder auf ihre IP-Einstellungen (usw.) zurückarbeiten, da das Löschen nur Personen betrifft, die Ihren Zweig von der Fernbedienung abrufen.quelle
Angenommen , Sie haben
stage
ein ganzes Verzeichnis übergit add <folder>
, aber Sie wollen eine Datei ausschließen aus der Liste aufgeführt (dh die Liste , die beim Laufen erzeugtgit status
) und halten Sie die Änderungen innerhalb der ausgeschlossenen Datei (Sie auf etwas gearbeitet haben und es ist nicht bereit für begehen, aber du willst deine Arbeit nicht verlieren ...). Sie könnten einfach verwenden:git reset <file>
Wenn Sie ausführen
git status
, werden Sie sehen, welche Datei (en) Siereset
sindunstaged
und welche anderen Dateien Sieadded
noch in derstaged
Liste haben.quelle
1.
(benutze "git rm --cached ..." um die Bühne zu verlassen)
Git ist ein System von Zeigern
Sie haben noch kein Commit, auf das Sie Ihren Zeiger ändern können
Die einzige Möglichkeit, Dateien aus dem Eimer zu entfernen , auf den verwiesen wird, besteht darin , Dateien zu entfernen, die Sie git angewiesen haben, auf Änderungen zu achten
2.
git commit -ma
3.
(benutze "git reset HEAD ..." um die Bühne zu verlassen)
quelle
git init
zum ersten mal.Ich bin überrascht, dass niemand das Git-Reflog erwähnt hat ( http://git-scm.com/docs/git-reflog ):
Das Reflog ist ein Git-Verlauf, der nicht nur die Änderungen am Repo verfolgt, sondern auch die Benutzeraktionen (z. B. Ziehen, Auschecken in einen anderen Zweig usw.) und das Rückgängigmachen dieser Aktionen ermöglicht. Anstatt die irrtümlich bereitgestellte Datei zu deaktivieren, können Sie zu dem Punkt zurückkehren, an dem Sie die Dateien nicht bereitgestellt haben.
Dies ist ähnlich wie
git reset HEAD <file>
jedoch in bestimmten Fällen detaillierter sein.Tut mir leid - ich beantworte deine Frage nicht wirklich, sondern zeige nur einen anderen Weg, um Dateien, die ich ziemlich oft benutze, zu entfernen (ich mag Antworten von Ryan Stewart und waldyrious sehr.);) Ich hoffe, es hilft.
quelle
Benutz einfach:
git reset HEAD <filename>
Dadurch wird die Datei freigegeben und die Änderungen, die Sie daran vorgenommen haben, bleiben erhalten, sodass Sie wiederum die Zweige ändern können, wenn Sie möchten, und
git add
diese Dateien stattdessen in einen anderen Zweig. Alle Änderungen bleiben erhalten.quelle
Es scheint mir, dass
git rm --cached <file>
die Datei aus dem Index entfernt wird, ohne sie aus dem Verzeichnis zu entfernen, in dem eine Ebenegit rm <file>
beides tun würde, genauso wie ein Betriebssystemrm <file>
die Datei aus dem Verzeichnis entfernen würde, ohne ihre Versionierung zu entfernen.quelle
Nur für Versionen 2.23 und höher
Anstelle dieser Vorschläge könnten Sie verwenden ,
git restore --staged <file>
umunstage
die Datei (en).quelle
--stage
als auch--staged
.