Ich habe derzeit drei geänderte Dateien in meinem Arbeitsverzeichnis. Ich möchte jedoch, dass einer von ihnen auf den HEAD-Status zurückgesetzt wird.
In SVN würde ich verwenden svn revert <filename>
(gefolgt von, svn update <filename>
falls erforderlich), aber in Git sollte ich verwenden git reset --hard
. Dieser Befehl kann jedoch nicht für eine einzelne Datei ausgeführt werden.
Gibt es in Git eine Möglichkeit, die Änderungen an einer einzelnen Datei zu verwerfen und mit einer neuen HEAD-Kopie zu überschreiben?
git checkout
Unten ist die Antwort. In git ist "Zurücksetzen" etwas, was Sie einem Commit antun. "Zurücksetzen" spielt die Umkehrung eines historischen Commits in Ihrem Arbeitsverzeichnis ab, sodass Sie ein neues Commit erstellen können, das das zurückgesetzte Commit "rückgängig macht". Ich finde, dies ist ein häufiger Punkt der Verwirrung für Leute, die von SVN zu Git kommen.Antworten:
Sie können den folgenden Befehl verwenden:
... wodurch sowohl die Arbeitskopie
my-file.txt
als auch ihr Status im Index mit der von HEAD aktualisiert werden .--
bedeutet im Grunde: Behandle jedes Argument nach diesem Punkt als Dateinamen . Weitere Details in dieser Antwort . Vielen Dank an VonC für diesen Hinweis.quelle
HEAD~1
, um das vorletzte Commit anzugeben.HEAD
wenn Sie an der Spitze der aktuellen Niederlassung stehen - siehe norbauer.com/rails-consulting/notes/…reset
Befehl (wie es heißt) "kein Hard-Reset mit Pfaden durchführen kann" und warum dercheckout
Befehl dann nicht (kann nicht?) Zum Hard-Reset des gesamten Satzes verwendet wird? (Ich meine, warum es so entworfen wurde.)git checkout
: "Überschreiben Sie Pfade im Arbeitsbaum, indem Sie sie durch den Inhalt im Index oder im <baum> ersetzen." Das heißt, wenn nicht angegeben,<tree-ish>
wird der Inhalt des Index zum Aktualisieren des Arbeitsbaums verwendet. Dies kann von HEAD abweichen oder nicht.Auf Kopf zurücksetzen:
So setzen Sie eine einzelne Datei auf HEAD zurück:
Beachten Sie, dass
@
die Abkürzung fürHEAD
. Eine ältere Version von git unterstützt die Kurzform möglicherweise nicht.Auf Index zurücksetzen:
So setzen Sie eine einzelne Datei auf den Index zurück , vorausgesetzt, der Index ist nicht leer, andernfalls auf HEAD:
Der Punkt ist, dass Sie aus
@
HEAD
Sicherheitsgründen nicht aus dem Befehl auslassen oder ihn verlassen möchten, es sei denn , Sie möchten ausdrücklich nur auf den Index zurücksetzen .quelle
man bash
Seite. Auch in dieser Antwort erwähnt: unix.stackexchange.com/a/187548/142855--
verwendet, um das Programm zu informierenI've finished specifying "options", and from here on, everything will be a positional argument.
. Herkömmlicherweise sind "Optionen" die Token,--recursive
die in beliebiger Reihenfolge erscheinen oder sogar in ihrer Kurzform wie mit kombiniert werden könnenrm -rf
. Im Gegenteil, "Positionsargumente" ähneln eher Argumenten, die an eine Funktion in einer Programmiersprache übergeben werden: Ihre Position in der Liste der Token definiert, was genau das Programm mit ihnen tun wird (dies sind häufig Dateinamen).--
beseitigt Unklarheiten darüber, was was ist.Um zu Upstream / Master zurückzukehren, gehen Sie wie folgt vor:
quelle
Seit Git 2.23 (August 2019) können Sie verwenden
restore
( weitere Informationen ):Das oben Gesagte wird
MyFile
beimHEAD
(letzten Commit) des aktuellen Zweigs wiederhergestellt .Wenn Sie die Änderungen von einem anderen Commit erhalten möchten, können Sie den Commit-Verlauf rückwärts bearbeiten. Der folgende Befehl erhält
MyFile
zwei Commits vor dem letzten. Sie benötigen jetzt die Option-s
(--source
), die Sie jetzt verwenden,master~2
und nichtmaster
(die Standardoption), wenn Sie die Quelle wiederherstellen:Sie können die Datei auch von einem anderen Zweig erhalten!
quelle
Ein Verweis auf HEAD ist nicht erforderlich.
git checkout -- file.js
ist ausreichendquelle
Sie können den folgenden Befehl zum Zurücksetzen einer einzelnen Datei verwenden
Listen Sie alle geänderten Dateien auf, um den
path_to_file/filename
folgenden Befehl zu erhaltenquelle
Sie können den folgenden Befehl verwenden:
git reset -- my-file.txt
Dadurch wird die Arbeitskopie
my-file.txt
beim Hinzufügen aktualisiert .quelle
Sie können den folgenden Befehl verwenden:
Wenn Sie einen Zweig mit demselben Dateinamen haben, müssen Sie diesen Befehl verwenden:
quelle
Ein einfacher, einfacher und praktischer Weg, um Sie aus dem heißen Wasser zu holen, besonders wenn Sie sich mit Git nicht so wohl fühlen:
Zeigen Sie das Protokoll Ihrer Datei an
git log myFile.js
Commit 1023057173029091u23f01w276931f7f42595f84f Autor: kmiklas Datum: Di Aug 7 09:29:34 2018 -0400
JIRA-12345 - Refactor mit neuer Architektur.
Hinweis Hash der Datei:
1023057173029091u23f01w276931f7f42595f84f
Zeigen Sie die Datei mit dem Hash an. Stellen Sie sicher, dass es das ist, was Sie wollen:
git show 1023057173029091u23f01w276931f7f42595f84f: ./ myFile.js
Leiten Sie die Datei auf eine lokale Kopie um
git show 1023057173029091u23f01w276931f7f42595f84f: ./ myFile.js> myFile.07aug2018.js
Sichern Sie Ihre aktuelle Datei.
cp myFile.js myFile.bak.js
Öffnen Sie beide Dateien in Ihrem bevorzugten Texteditor.
vim myFile.js
vim myFile.07aug2018.js
Kopieren Sie den Code zum Einfügen und Einfügen von myFile.07aug2018.js in myFile.js und speichern Sie ihn.
Commit und Push myFile.js
Zeigen Sie das Protokoll erneut an und vergewissern Sie sich, dass Ihre Datei ordnungsgemäß vorhanden ist.
Bitten Sie Ihre Kunden, die neueste Version abzurufen, und beobachten Sie, wie sie mit der alten Version funktioniert.
Nicht die sexieste oder git-zentrierteste Lösung und definitiv ein "manuelles" Zurücksetzen / Umkehren, aber es funktioniert. Es erfordert nur minimale Git-Kenntnisse und stört den Commit-Verlauf nicht.
quelle