Frage Warum gibt es 2 Möglichkeiten, eine Datei in Git aufzulösen?


Manchmal schlägt Git vor git rm --cached manchmal eine Datei aufheben git reset HEAD file. Wann sollte 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
#

833
2017-08-02 21:50


Ursprung


Antworten:


git rm --cached <filePath>  nicht sichtbar eine Datei, eigentlich verschiebt die Entfernung der Datei (en) aus dem Repo (vorausgesetzt, es wurde bereits vorher festgelegt), aber die Datei in Ihrem Arbeitsbaum (Sie mit einer nicht verfolgten Datei verlassen).

git reset <filePath> werden auflösen alle gestuften Änderungen für die angegebene (n) Datei (en).

Das heißt, wenn du benutzt hast git rm --cached Bei einer neuen Datei, die inszeniert wird, würde es im Prinzip so aussehen, als hättest du es gerade inszeniert, da es zuvor noch nie zuvor ausgeführt worden war.


1361
2017-08-02 22:03



git rm --cached wird verwendet, um eine Datei aus dem Index zu entfernen. Falls sich die Datei bereits im Repo befindet, git rm --cached Entfernt die Datei aus dem Index und belässt sie im Arbeitsverzeichnis. Durch ein Commit wird sie nun ebenfalls aus dem Repo entfernt. Nach dem Commit hätten Sie die Datei nicht versioniert und eine lokale Kopie behalten.

git reset HEAD file (die standardmäßig den --mixed flag) unterscheidet sich in dem Fall, in dem sich die Datei bereits in dem Repo befindet, die Indexversion der Datei durch die Datei aus Repo (HEAD), wodurch die Datei effektiv staging wird Änderungen zu ihm.

Im Falle einer nicht versionierten Datei wird die gesamte Datei deaktiviert, da die Datei nicht im HEAD vorhanden war. In dieser Ansicht git reset HEAD file und git rm --cached sind gleich, aber sie sind nicht gleich (wie im Fall von Dateien bereits im Repo erläutert)

Auf die Frage von 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 die Schönheit davon :)


303
2017-08-02 23:00



Recht einfach:

  • git rm --cached <file>  macht git aufhören, die Datei vollständig zu verfolgen (Verlassen Sie es im Dateisystem, im Gegensatz zu schlicht git rm*)
  • git reset HEAD <file>  Versetzt alle Änderungen, die seit dem letzten Commit an der Datei vorgenommen wurden (setzt sie aber nicht im Dateisystem zurück, im Gegensatz zu dem, was der Befehlsname möglicherweise andeutet **). Die Datei bleibt unter Versionskontrolle.

Wenn die Datei zuvor nicht in der Revisionskontrolle war (d. H., Sie haben gerade eine Datei hochgeladen, die Sie gerade hatten) git addZum ersten Mal haben die beiden Befehle die gleiche Wirkung, daher ist das Auftreten dieser "zwei Arten, etwas zu tun".

* Beachten Sie den Vorbehalt, den @DrewT in seiner Antwort erwähnt git rm --cached einer Datei, die war zuvor begangen zum Repository. Im Zusammenhang mit dieser Frage ist von einer gerade hinzugefügten und noch nicht festgeschriebenen Datei nichts zu befürchten.

** Ich hatte peinlich lange Angst, den git reset-Befehl wegen seines Namens zu benutzen - und trotzdem schaue ich heute oft nach der Syntax, um sicherzustellen, dass ich nichts vermassele. (aktualisieren: Endlich habe ich mir die Zeit genommen fasse die Verwendung von zusammen git reset in einer TLD-Seite, jetzt habe ich ein besseres mentales Modell, wie es funktioniert, und eine schnelle Referenz, wenn ich ein Detail vergessen habe.)


86
2017-10-17 21:16



Dieser Thread ist ein bisschen alt, aber ich möchte noch eine kleine Demonstration hinzufügen, da es immer noch kein intuitives Problem ist:

me$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   to-be-added
#   modified:   to-be-modified
#   deleted:    to-be-removed
#

me$ git reset -q HEAD to-be-added

    # ok

me$ git reset -q HEAD to-be-modified

    # ok

me$ git reset -q HEAD to-be-removed

    # ok

# or alternatively:

me$ git reset -q HEAD to-be-added to-be-removed to-be-modified

    # ok

me$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   to-be-modified
#   deleted:    to-be-removed
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   to-be-added
no changes added to commit (use "git add" and/or "git commit -a")

git reset HEAD(ohne -q) gibt eine Warnung über die geänderte Datei ab und ihr Beendigungscode ist 1, der als Fehler in einem Skript betrachtet wird.

Bearbeiten: git checkout HEAD to-be-modified to-be-removed funktioniert auch für das Staging, entfernt jedoch die Änderung vollständig aus dem Arbeitsbereich


35
2018-04-16 19:00



Wenn Sie versehentlich Dateien inszeniert haben, die Sie nicht festschreiben möchten, und sicherstellen möchten, dass Sie die Änderungen beibehalten, können Sie auch Folgendes verwenden:

git stash
git stash pop

Dadurch wird ein Reset auf HEAD durchgeführt und die Änderungen werden erneut angewendet, sodass Sie einzelne Dateien für das Commit neu einstufen können. Dies ist auch hilfreich, wenn Sie vergessen haben, einen Feature-Zweig für Pull-Requests zu erstellen (git stash ; git checkout -b <feature> ; git stash pop).


27
2018-02-10 17:06



Diese 2 Befehle haben einige feine Unterschiede, wenn die fragliche Datei bereits im Repo und unter Versionskontrolle ist (zuvor committed etc.):

  • git reset HEAD <file> verschiebt die Datei im aktuellen Commit.
  • git rm --cached <file> wird die Datei für zukünftige Commits auch unsichtbar machen. Es ist nicht gespeichert, bis es wieder hinzugefügt wird git add <file>.

Und noch ein wichtiger Unterschied:

  • Nach dem Rennen git rm --cached <file> und drücken Sie Ihren Zweig zur Fernbedienung, jeder, der Ihren Zweig von der Fernbedienung zieht, wird die Datei bekommen TATSÄCHLICH aus ihrem Ordner gelöscht, obwohl in Ihrem lokalen Arbeitssatz die Datei gerade nicht geparkt wird (d. h. 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 (d. H. Eine andere Basis-URL, eine andere IP- oder Port-Einstellung), wenn Sie ihn verwenden git rm --cached <file> Jeder, der Ihre Zweigstelle anzieht, muss die Konfiguration manuell neu erstellen, oder Sie können sie Ihren senden, und sie können sie wieder auf ihre IP-Einstellungen (usw.) bearbeiten, da das Löschen nur Personen beeinflusst, die Ihre Zweigstelle aus der Ferne ziehen .


14
2017-08-10 20:04



Lass uns dich sagen stage ein ganzes Verzeichnis via git add <folder>, aber Sie möchten eine Datei von der bereitgestellten Liste ausschließen (d. h. die Liste, die beim Ausführen generiert wird git status) und behalten die Änderungen innerhalb der ausgeschlossenen Datei (Sie haben an etwas gearbeitet und es ist nicht bereit zum Festschreiben, aber Sie wollen Ihre Arbeit nicht verlieren ...). Sie könnten einfach verwenden:

git reset <file>

Wenn du rennst git status, Sie werden sehen, dass die Datei (en) Sie reset sind unstaged und der Rest der Dateien Sie added sind noch in der staged Liste.


8
2017-08-28 16:08



1.

D:\code\gt2>git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file:   a

(benutze "git rm --cached ..." um zu inszenieren)

  • Git ist ein System von Zeigern

  • Sie haben noch kein Commit, um den Zeiger zu ändern

  • Der einzige Weg, "Dateien aus dem Bucket zu nehmen, auf den verwiesen wird", ist der Entferne Dateien, die du Git gesagt hast, um auf Änderungen zu achten

2.

D:\code\gt2>git commit -m a
[master (root-commit) c271e05] a
0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 a

git commit -m a

  • Sie haben zugesagt 'Gerettet"

3.

D:\code\gt2>git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   b
#

(benutze "git reset HEAD ..." um zu deaktivieren)

  • Sie haben zu diesem Zeitpunkt einen Commit in Ihrem Code vorgenommen
  • Jetzt können Sie Ihren Zeiger auf Ihr Commit zurücksetzen 'Zurück zum letzten Speichern"

6
2017-09-08 16:26