Wie kann ich eine Datei auf eine bestimmte Revision zurücksetzen oder zurücksetzen?

4515

Ich habe einige Änderungen an einer Datei vorgenommen, die einige Male als Teil einer Gruppe von Dateien festgeschrieben wurde, möchte aber jetzt die Änderungen daran zurücksetzen / auf eine frühere Version zurücksetzen.

Ich habe git logzusammen mit a git diffdie Revision gefunden, die ich benötige, habe aber keine Ahnung, wie ich die Datei in den früheren Zustand zurückversetzen kann.

Hates_
quelle
11
Vergessen Sie nach dem Zurücksetzen --cachedbeim Überprüfen nicht git diff. Link
Geoffrey Hale
5
Ich habe deine Frage gefunden, als ich meine gegoogelt habe. Aber nachdem ich die Lösung gelesen hatte, überprüfte ich mein Protokoll und stellte fest, dass ich die Änderungen als eigenständiges Commit vorgenommen hatte, sodass Git für dieses Commit zurückgesetzt wurde und alles andere so blieb, wie ich es wollte. Keine Lösung, nur eine andere Möglichkeit, es manchmal zu tun.
Sudo97

Antworten:

6134

Angenommen, der Hash des gewünschten Commits lautet c5f567:

git checkout c5f567 -- file1/to/restore file2/to/restore

Die git checkout Manpage gibt weitere Informationen.

Wenn Sie zuvor zum Commit zurückkehren möchten c5f567, hängen Sie an ~1(wobei 1 die Anzahl der Commits ist, die Sie zurückgehen möchten, kann dies alles sein):

git checkout c5f567~1 -- file1/to/restore file2/to/restore

Nebenbei bemerkt, ich habe mich mit diesem Befehl immer unwohl gefühlt, weil er sowohl für gewöhnliche Dinge (Wechsel zwischen Zweigen) als auch für ungewöhnliche, destruktive Dinge (Verwerfen von Änderungen im Arbeitsverzeichnis) verwendet wird.

Greg Hewgill
quelle
12
@shadowhand: Gibt es eine Möglichkeit, das umzukehren, also ist es die Version direkt danach?
Aliteralmind
16
@aliteralmind: Nein, leider geht die Git-Verlaufs-Shortcut-Notation im Verlauf nur rückwärts.
Greg Hewgill
46
Wenn Sie einen Zweignamen für abcde verwendendevelop möchten (z. B. ), möchten Sie git checkout develop -- file/to/restore(beachten Sie den doppelten Strich)
Ohad Schneider
8
@aliteralmind: Ja, es gibt eine Möglichkeit, dies zu tun: "git log --reverse -1 --ancestry-path yourgitrev..master" und dann die entsprechenden Optionen verwenden, um nur die git rev zu erhalten. --ancestry-path "zeichnet eine Linie" zwischen zwei Commits und -1 zeigt nur eine Version an, und --reverse stellt sicher, dass der erste ausgegebene Eintrag der älteste ist.
Chris Cogdon
6
Persönlich finde ich HEAD ^ einfacher zu tippen als HEAD ~ 1 :)
juzzlin
606

Mit dem Befehl diff können Sie die an einer Datei vorgenommenen Änderungen schnell überprüfen:

git diff <commit hash> <filename>

Verwenden Sie dann den Befehl reset, um eine bestimmte Datei auf dieses Commit zurückzusetzen:

git reset <commit hash> <filename>

Möglicherweise müssen Sie die --hardOption verwenden, wenn Sie lokale Änderungen vorgenommen haben.

Ein guter Workflow für die Verwaltung von Wegpunkten besteht darin, Tags zu verwenden, um Punkte in Ihrer Zeitleiste sauber zu markieren. Ich kann Ihren letzten Satz nicht ganz verstehen, aber Sie möchten vielleicht einen Zweig von einem früheren Zeitpunkt abweichen. Verwenden Sie dazu den praktischen Checkout-Befehl:

git checkout <commit hash>
git checkout -b <new branch name>

Sie können dies dann für Ihre Hauptlinie neu festlegen, wenn Sie bereit sind, diese Änderungen zusammenzuführen:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>
Chris Lloyd
quelle
7
Der Befehl 'git checkout <Commit Hash>' hat mir meine ältere Version des Projekts zurückgegeben, genau das, wonach ich gesucht habe. Danke Chris.
Vidur Punj
48
Das Zurücksetzen der Datei git checkout <commit hash> <filename>funktionierte besser für mich alsgit reset
Motti Strom
3
Ich wollte eine frühe Version einer einzelnen Datei, weil ich 150 Zeilen mit einem schlecht gewählten Kopieren / Einfügen überschrieben hatte. git checkout <commit hash> <filename>arbeitete für mich. Dies sollte meiner Meinung nach nicht die akzeptierte Antwort sein. git resetnicht.
Harperville
24
kann nicht verwendet werden git reset, um einzelne Datei zurückzusetzen, erhalten Sie eine Fehlerfatal: Cannot do hard reset with paths
slier
13
Was Slier sagte: Du kannst nicht git reset --hard <commit hash> <filename>. Dies wird Fehler mit dem, fatal: Cannot do hard reset with paths.was Motti Strom sagte: Verwenden Siegit checkout <commit hash> <filename>
Hawkeye Parker
366

Sie können jeden Verweis auf ein Git-Commit verwenden, einschließlich des SHA-1, wenn dies am bequemsten ist. Der Punkt ist, dass der Befehl so aussieht:

git checkout [commit-ref] -- [filename]

foxxtrot
quelle
22
Was ist der Unterschied zwischen dieser Antwort, die hat --, und der akzeptierten, die nicht hat?
2rs2ts
80
In git teilt ein '-' vor der Dateiliste git mit, dass alle nächsten Argumente als Dateinamen interpretiert werden sollen, nicht als Verzweigungsnamen oder irgendetwas anderes. Es ist manchmal ein hilfreicher Disambiguator.
Foxxtrot
49
Das '-' ist nicht nur eine Git-Konvention, sondern etwas, das Sie an verschiedenen Stellen in der * nix-Befehlszeile finden. rm -- -f(Entfernen Sie eine Datei mit dem Namen -f) scheint das kanonische Beispiel zu sein. Weitere Details hier
Hawkeye Parker
7
Fügen Sie einfach zu dem hinzu, was @HawkeyeParker gesagt hat. Der rmBefehl verwendet getopt (3), um seine Argumente zu analysieren. getoptist der Befehl zum Parsen von Befehlsargumenten. gnu.org/software/libc/manual/html_node/Getopt.html
Devy
2
@Honey Ja, das meine ich, und ja, wahrscheinlich überhaupt nicht üblich. Ich habe dieses Beispiel an verschiedenen Orten gesehen, vielleicht nur, um es irgendwie unvergesslich zu machen: rm -f ist bekanntermaßen beängstigend / gefährlich. Aber ist der Punkt, in * nichts ein Dateiname kann mit einem ‚-‘ beginnen, und dies wird verschiedene Kommandozeile Dolmetscher verwirren , die, wenn sie sehen , einen ‚-‘, eine Befehlsoption erwarten zu folgen. Es kann sich um eine beliebige Datei handeln, die mit '-' beginnt. zB "-mySpecialFile".
Hawkeye Parker
288
git checkout -- foo

Das wird fooauf HEAD zurückgesetzt. Du kannst auch:

git checkout HEAD^ foo

für eine Revision zurück usw.

Greg Hewgill
quelle
12
Ich würde vorschlagen, Syntax git checkout -- foozu verwenden, um Fehler zu vermeiden, wenn fooetwas Besonderes ist (wie ein Verzeichnis oder eine aufgerufene Datei -f). Wenn Sie sich bei git nicht sicher sind, stellen Sie allen Dateien und Verzeichnissen immer das spezielle Argument voran --.
Mikko Rantalainen
8
Ein zusätzlicher Hinweis zu Mikkos Kommentar: --ist kein Git-Befehl und nichts Besonderes für Git. Es ist eine integrierte Bash, um das Ende der Befehlsoptionen anzuzeigen. Sie können es auch mit vielen anderen Bash-Befehlen verwenden.
Mataeaeus
14
@matthaeus es ist auch weder spezifisch für Bash noch eine Shell-Funktion überhaupt. Es ist eine Konvention, die in vielen verschiedenen Befehlen implementiert ist (und von getopt unterstützt wird).
Greg Hewgill
2
Nein, --ist kein eingebautes spezielles Wort in Bash. Es ist jedoch eine gängige Konvention, die von vielen Befehlszeilenparsern unterstützt und von vielen CLIs, einschließlich git, verwendet wird.
Emil Lundberg
123

Um zur zuletzt festgeschriebenen Version zurückzukehren, die am häufigsten benötigt wird, können Sie diesen einfacheren Befehl verwenden.

git checkout HEAD file/to/restore
CDR
quelle
2
Was ist der Unterschied zwischen dieser (git checkout HEAD-Datei / to / restore) und git reset --hard file / to / restore ???
Motti Shneor
2
1) leichter zu merken allgemeiner Weg 2) keine Sorge, die Eingabetaste zu drücken, bevor Sie den Dateinamen eingeben
Roman Susi
105

Ich hatte gerade das gleiche Problem und fand diese Antwort am einfachsten zu verstehen ( commit-refist der SHA-Wert der Änderung in dem Protokoll, zu dem Sie zurückkehren möchten):

git checkout [commit-ref] [filename]

Dadurch wird diese alte Version in Ihr Arbeitsverzeichnis aufgenommen und von dort aus können Sie sie festschreiben, wenn Sie möchten.

braun
quelle
91

Wenn Sie wissen, wie viele Commits Sie benötigen, um zurückzukehren, können Sie Folgendes verwenden:

git checkout master~5 image.png

Dies setzt voraus, dass Sie sich in der masterVerzweigung befinden und die gewünschte Version 5 Commits zurück ist.

Ron DeVera
quelle
80

Ich glaube, ich habe es gefunden ... von http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html

Manchmal möchte man einfach zurückgehen und jede Änderung nach einem bestimmten Punkt vergessen, weil sie alle falsch sind.

Beginnen mit:

$ git log

Hier sehen Sie eine Liste der letzten Commits und deren SHA1-Hashes.

Geben Sie als Nächstes Folgendes ein:

$ git reset --hard SHA1_HASH

um den Status eines bestimmten Commits wiederherzustellen und alle neueren Commits dauerhaft aus dem Datensatz zu löschen.

jdee
quelle
24
Git entfernt nie etwas. Ihre alten Commits sind noch vorhanden, aber wenn keine Verzweigungsspitze auf sie zeigt, sind sie nicht mehr erreichbar. git reflog zeigt sie weiterhin an, bis Sie Ihr Repository mit git-gc bereinigen.
Bombe
1
@ Bombe: Danke für die Information. Ich hatte eine alte Version einer Datei ausgecheckt. Nachdem ich Ihren Kommentar gelesen hatte, konnte ich "gitref" verwenden, um den partiellen SHA1-Hash nachzuschlagen, und "checkout" verwenden, um zur neuesten Version zurückzukehren. Andere Git-Benutzer finden diese Informationen möglicherweise hilfreich.
Winston C. Yang
4
möglicherweise gefolgt von agit push --force
bshirley
4
Wenn Sie nicht festgeschriebene Änderungen haben, verlieren Sie diese, wenn Sie einen Git-Reset durchführen --hard
Boklucius
5
@Bombe - "Git entfernt nie etwas. Ihre alten Commits sind immer noch vorhanden, aber wenn keine Verzweigungsspitze auf sie zeigt, sind sie nicht mehr erreichbar." - Commits wie dieses werden jedoch nach einer festgelegten Zeit beschnitten, sodass "Git entfernt nie etwas" nicht wahr ist.
Bulwersator
61

Das hat bei mir funktioniert:

git checkout <commit hash> file

Übernehmen Sie dann die Änderung:

git commit -a
v2k
quelle
54

Sie müssen vorsichtig sein, wenn Sie "Rollback" sagen. Wenn Sie früher eine Version einer Datei in Commit $ A hatten und später zwei Änderungen in zwei separaten Commits $ B und $ C vorgenommen haben (was Sie also sehen, ist die dritte Iteration der Datei), und wenn Sie sagen " Ich möchte zum ersten zurückkehren ", meinst du das wirklich so?

Wenn Sie die Änderungen sowohl bei der zweiten als auch bei der dritten Iteration entfernen möchten, ist dies ganz einfach:

$ git checkout $A file

und dann legen Sie das Ergebnis fest. Der Befehl fragt "Ich möchte die Datei aus dem Status auschecken, der vom Commit $ A aufgezeichnet wurde".

Auf der anderen Seite wollten Sie die Änderung entfernen, die durch die zweite Iteration (dh Commit $ B) eingeführt wurde, und dabei beibehalten, was Commit $ C für die Datei getan hat. Sie möchten $ B zurücksetzen

$ git revert $B

Beachten Sie, dass wer auch immer $ B begehen nicht erstellt haben sehr diszipliniert und völlig unabhängig Änderung begangen haben , können in der gleichen begehen, und diese revert andere Dateien als berühren Datei Sie Änderungen sehen zu verletzen, so dass Sie das Ergebnis sorgfältig nach dem Handeln überprüfen möchten damit.


quelle
Ich habe dies getan, aber dann würde eine "Git-Protokolldatei" sagen, dass ich mich auf dem ursprünglichen Commit befand, HEAD. Es schien, dass "Git Checkout" fehlschlug. Ein Git-Status zeigte jedoch an, dass die Datei tatsächlich geändert wurde, und eine "Git-Diff-inszenierte Datei" zeigte die tatsächlichen Änderungen an. Ein "Git-Status" zeigte auch an, dass die Datei ebenfalls geändert wurde. Verwenden Sie hier also nicht "git log", um zu verfolgen, welche Dateien geändert wurden.
Frederick Ollinger
37

Amüsanterweise funktioniert git checkout fooes nicht, wenn sich die Arbeitskopie in einem Verzeichnis mit dem Namen befindet foo. jedoch beides git checkout HEAD foound git checkout ./foowird:

$ pwd
/Users/aaron/Documents/work/foo
$ git checkout foo
D   foo
Already on "foo"
$ git checkout ./foo
$ git checkout HEAD foo
Aaron Maenpaa
quelle
26
odergit checkout -- foo
knittl
32

So rebasefunktioniert es:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

Angenommen, Sie haben

---o----o----o----o  master
    \---A----B       <my branch>

Die ersten beiden Befehle ... Commit Git Checkout Git Rebase Master

... überprüfen Sie den Zweig der Änderungen, die Sie auf den masterZweig anwenden möchten . Der rebaseBefehl nimmt die Commits von <my branch>(die nicht in gefunden werden master) und wendet sie erneut auf den Kopf von an master. Mit anderen Worten, das übergeordnete Element des ersten Commits in <my branch>ist kein vorheriges Commit mehr in der masterHistorie, sondern der aktuelle Leiter von master. Die beiden Befehle sind dieselben wie:

git rebase master <my branch>

Es ist möglicherweise einfacher, sich an diesen Befehl zu erinnern, da sowohl die Zweige "base" als auch "modify" explizit sind.

. Das endgültige Ergebnis der Geschichte ist:

---o----o----o----o   master
                   \----A'----B'  <my branch>

Die letzten beiden Befehle ...

git checkout master
git merge <my branch>

... führen Sie eine Schnellvorlaufzusammenführung durch, um alle <my branch>Änderungen zu übernehmen master. Ohne diesen Schritt wird das Rebase-Commit nicht hinzugefügt master. Das Endergebnis ist:

---o----o----o----o----A'----B'  master, <my branch>

masterund <my branch>beide Referenz B'. Ab diesem Punkt ist es auch sicher, die <my branch>Referenz zu löschen .

git branch -d <my branch>
cmcginty
quelle
26

Ab Git v2.23.0 gibt es eine neue Git-Wiederherstellungsmethode , die einen Teil dessen übernehmen soll, wofür git checkoutverantwortlich war (selbst die akzeptierte Antwort erwähnt, dass dies git checkoutziemlich verwirrend ist). Die Höhepunkte der Änderungen finden Sie im Github-Blog .

Das Standardverhalten dieses Befehls besteht darin, den Status eines Arbeitsbaums mit dem Inhalt wiederherzustellen, der aus dem sourceParameter stammt (in Ihrem Fall ein Commit-Hash).

Basierend auf Greg Hewgills Antwort (vorausgesetzt, der Commit-Hash ist c5f567) würde der Befehl folgendermaßen aussehen:

git restore --source=c5f567 file1/to/restore file2/to/restore

Oder wenn Sie den Inhalt eines Commits vor c5f567 wiederherstellen möchten:

git restore --source=c5f567~1 file1/to/restore file2/to/restore
mjarosie
quelle
24

Erster Kopf für Zieldatei zurücksetzen

git reset HEAD path_to_file

Zweiter Checkout dieser Datei

git checkout -- path_to_file
Gulshan Maurya
quelle
4
+1, obwohl nicht sicher ist, ob HEAD zurückgesetzt werden soll. Es kann benötigt werden oder nicht. In meiner Situation wollte ich nur eine bestimmte Datei auf die Version im Repository
zurücksetzen
Ja, ich muss nur den 2. Befehl ausführen. Gefällt mir
javaPlease42
22

Git-Aliase, awk und Shell-Funktionen zur Rettung!

git prevision <N> <filename>

wo <N>ist die Anzahl der Revisionen der Datei zu Rollbacks für Datei <filename>. Führen
Sie beispielsweise aus, um die sofortige vorherige Revision einer einzelnen Datei x/y/z.causzuchecken

git prevision -1 x/y/z.c

Wie funktioniert Git Prevision?

Fügen Sie Folgendes zu Ihrem hinzu gitconfig

[alias]
        prevision = "!f() { git checkout `git log --oneline $2 |  awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f"

Der Befehl im Grunde

  • führt ein git logfür die angegebene Datei und aus
  • wählt die entsprechende Commit-ID im Verlauf der Datei aus und
  • führt eine git checkoutCommit-ID für die angegebene Datei aus.

Im Wesentlichen alles, was man in dieser Situation manuell tun würde,
zusammengefasst in einem schönen, effizienten Git-Alias ​​- Git-Prevision

TheCodeArtist
quelle
20

Ich muss hier EasyGit einstecken , ein Wrapper, um Git für Anfänger zugänglicher zu machen, ohne erfahrene Benutzer zu verwirren. Eines der Dinge, die es tut, ist , mehr Bedeutungen zu gebengit revert . In diesem Fall würden Sie einfach sagen:

eg revert foo/bar foo/baz

Aristoteles Pagaltzis
quelle
1
Es sollte sein eg revert --in REVISON -- FILENAME. Das --inist wichtig. Für die Windows-Benutzer da draußen: Öffnen Sie Git Bash. Ausführen echo %PATH. Der erste Pfad sollte sich in Ihrem Benutzerverzeichnis befinden und mit enden bin. Erstellen Sie diesen Pfad. Speichern Sie zB dort. Nennen Sie es eg. Nicht eg.txt.
Koppor
20

Für den Fall, dass Sie eine Datei auf ein vorheriges Commit zurücksetzen möchten (und die Datei, die Sie bereits festgeschrieben zurücksetzen möchten), können Sie verwenden

git checkout HEAD^1 path/to/file

oder

git checkout HEAD~1 path/to/file

Dann einfach inszenieren und die "neue" Version festschreiben.

Mit dem Wissen, dass ein Commit im Falle einer Zusammenführung zwei Eltern haben kann, sollten Sie wissen, dass HEAD ^ 1 der erste Elternteil und HEAD ~ 1 der zweite Elternteil ist.

Beides funktioniert, wenn nur ein Elternteil im Baum vorhanden ist.

ModernIncantations
quelle
19

Viele Vorschläge hier, meistens in Anlehnung an git checkout $revision -- $file. Ein paar obskure Alternativen:

git show $revision:$file > $file

Außerdem benutze ich dies häufig, um vorübergehend eine bestimmte Version zu sehen:

git show $revision:$file

oder

git show $revision:$file | vim -R -

(OBS: $filemuss vorangestellt werden, ./wenn es sich um einen relativen git show $revision:$fileArbeitspfad handelt)

Und umso seltsamer:

git archive $revision $file | tar -x0 > $file
Peter V. Mørch
quelle
1
Dies ist eine gute Alternative, wenn Sie nicht sicher sind, welche Commit-Version Sie verwenden möchten und müssen, ohne Ihr Arbeitsverzeichnis zu überschreiben.
wisbucky
18

Beachten Sie jedoch, dass git checkout ./foound git checkout HEAD ./foo nicht genau dasselbe sind; Beispiel:

$ echo A > foo
$ git add foo
$ git commit -m 'A' foo
Created commit a1f085f: A
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 foo
$ echo B >> foo
$ git add foo
$ echo C >> foo
$ cat foo
A
B
C
$ git checkout ./foo
$ cat foo
A
B
$ git checkout HEAD ./foo
$ cat foo
A

(Die zweite addStufe der Datei im Index wird jedoch nicht festgeschrieben.)

Git checkout ./foobedeutet, den Pfad ./foovom Index zurückzusetzen ; Durch das Hinzufügen wird HEADGit angewiesen, diesen Pfad im Index auf seine HEADRevision zurückzusetzen, bevor Sie dies tun.

Damien Diederen
quelle
14

Für mich schien keine der Antworten wirklich klar zu sein und deshalb möchte ich meine hinzufügen, was super einfach erscheint.

Ich habe ein Commit abc1und danach habe ich mehrere (oder eine Änderung) an einer Datei vorgenommen file.txt.

Sagen Sie jetzt, dass ich etwas in der Datei durcheinander gebracht habe file.txtund zu einem vorherigen Commit zurückkehren möchte abc1.

1 . git checkout file.txt: Dadurch werden lokale Änderungen entfernt, wenn Sie sie nicht benötigen

2 . git checkout abc1 file.txt: Dadurch wird Ihre Datei auf die gewünschte Version gebracht

3 . git commit -m "Restored file.txt to version abc1": Dies wird Ihre Umkehrung begehen.

  1. git push : Dadurch wird alles auf das Remote-Repository übertragen

Natürlich können Sie zwischen Schritt 2 und 3 git statusverstehen, was los ist. Normalerweise sollte das file.txtbereits hinzugefügte angezeigt werden, weshalb kein a erforderlich ist git add.

desmond13
quelle
2
OK, ich denke, die Schritte 1. und 2. schließen sich gegenseitig aus: Wenn abc1 Ihr letztes Commit ist, besteht keine Notwendigkeit für 2. und wenn es nach abc1 andere Commits gab, können Sie direkt 2.
Jean Paul
13
  1. Git-Datei auf ein bestimmtes Commit zurücksetzen
git checkout Last_Stable_commit_Number -- fileName

2.Git Datei auf einen bestimmten Zweig zurücksetzen

git checkout branchName_Which_Has_stable_Commit fileName
ireshika piyumalie
quelle
11

Um zu einer früheren Festschreibungsversion der Datei zu gelangen, rufen Sie die Festschreibungsnummer ab, z. B. eb917a1

git checkout eb917a1 YourFileName

Wenn Sie nur zur letzten festgeschriebenen Version zurückkehren müssen

git reset HEAD YourFileName
git checkout YourFileName

Dadurch gelangen Sie einfach zum letzten festgeschriebenen Status der Datei

shah1988
quelle
10

git checkout ref | commitHash - filePath

z.B

git checkout HEAD~5 -- foo.bar
or 
git checkout 048ee28 -- foo.bar
Amos Folarin
quelle
10

Viele Antworten hier behaupten, sie zu verwenden, git reset ... <file>oder git checkout ... <file>wenn Sie dies tun, verlieren Sie alle Änderungen an <file>Commit nach dem Commit, das Sie zurücksetzen möchten.

Wenn Sie Änderungen von einem Commit nur für eine einzelne Datei rückgängig machen möchten, genau wie git revertfür eine Datei (oder eine Teilmenge der Commit-Dateien), empfehle ich, beide git diffund git applyähnliche Elemente zu verwenden (mit <sha>= dem Hash des Commit, das Sie zurücksetzen möchten):

git diff <sha>^ <sha> path/to/file.ext | git apply -R

Grundsätzlich wird zuerst ein Patch generiert, der den Änderungen entspricht, die Sie rückgängig machen möchten, und dann der Patch erneut angewendet, um diese Änderungen zu löschen.

Natürlich funktioniert es nicht, wenn zurückgesetzte Zeilen durch ein Commit zwischen <sha1>und HEAD(Konflikt) geändert wurden .

Vince
quelle
Das sollte die genehmigte Antwort sein. Darf ich eine leicht vereinfachte Version vorschlagen:git show -p <sha> path/to/file.ext|git apply -R
Amaury D
Sie können <sha>^!anstelle von<sha>^ <sha>
cambunctious
8

Verwenden Sie git logdiese Option , um den Hash-Schlüssel für eine bestimmte Version abzurufen, und verwenden Sie ihn danngit checkout <hashkey>

Hinweis: Vergessen Sie nicht, den Hash vor dem letzten einzugeben. Der letzte Hash zeigt auf Ihre aktuelle Position (HEAD) und ändert nichts.

Mustafakyr
quelle
7

Offensichtlich muss jemand entweder ein verständliches Buch über Git schreiben oder Git muss in der Dokumentation besser erklärt werden. Angesichts des gleichen Problems habe ich das erraten

cd <working copy>
git revert master

würde das letzte Commit rückgängig machen, das zu tun scheint.

Ian

Ian Davis
quelle
7

Sie können dies in 4 Schritten tun:

  1. Setzen Sie das gesamte Commit mit der Datei zurück, die Sie speziell zurücksetzen möchten. Dadurch wird ein neues Commit in Ihrem Zweig erstellt
  2. Soft-Reset für das Festschreiben - Entfernt das Festschreiben und verschiebt die Änderungen in den Arbeitsbereich
  3. Wählen Sie die Dateien aus, um sie zurückzusetzen und festzuschreiben
  4. Legen Sie alle anderen Dateien in Ihrem Arbeitsbereich ab

Was Sie in Ihr Terminal eingeben müssen :

  1. git revert <commit_hash>
  2. git reset HEAD~1
  3. git add <file_i_want_to_revert> && git commit -m 'reverting file'
  4. git checkout .

Viel Glück

Nir M.
quelle
macht das nicht ALLE Änderungen rückgängig?
Arcee123
1
@ arcee123 Ja, aber das anschließende Zurücksetzen macht das Zurücksetzen aller Änderungen rückgängig. Das Problem ist, dass git-revertnur das gesamte Repo funktioniert. Um dies zu kompensieren, müssen wir alles andere rückgängig machen.
Timothy
2
Ich empfehle die Verwendung von: 1. git revert --no-commit <commit_hash>2. git reset HEADDies spart ein zusätzliches Commit und führt alle Änderungen nur in Ihrem Arbeitsverzeichnis durch.
Timothy
@ greg-hewgills Antwort ist besser und genau richtig. Dieser ist mies und sollte nicht verwendet werden.
Daniel Tranca
Dies ist genau das, was für eine echte Wiederherstellung bestimmter Dateien erforderlich ist. Ich musste Änderungen an einigen Dateien aus einem früheren Commit rückgängig machen, die bereits in das Remote-Repository übertragen wurden. Ich habe das Ergebnis zurückgesetzt, zurückgesetzt und festgeschrieben: git revert _oldcommit_ --no-commit git reset -- _unchanged1_ _unchanged2_ ... git commit -m "branch without changes to specific files"Die neue Verzweigungsspitze spiegelte alle Änderungen außer den zurückgesetzten Dateien wider.
Suncat2000
7

Dies ist ein sehr einfacher Schritt. Checkout-Datei auf die Commit-ID, die wir wollen, hier eine Commit-ID vorher, und dann git Commit-Änderung und fertig.

# git checkout <previous commit_id> <file_name>
# git commit --amend

Das ist sehr praktisch. Wenn wir eine Datei zu einer früheren Festschreibungs-ID am Anfang des Festschreibens bringen möchten, können wir dies problemlos tun.

Abhishek Dwivedi
quelle
5
git revert <hash>

Wird ein bestimmtes Commit zurücksetzen. Es hört sich so an, als ob Sie denken, dass dies git revertnur das letzte Commit betrifft.

Das löst Ihr Problem nicht, wenn Sie eine Änderung in einer bestimmten Datei rückgängig machen möchten und dieses Commit mehr als diese Datei geändert hat.

Otto
quelle
5

Wenn Sie bei Ihren letzten Festschreibungen eine falsche Datei festschreiben, befolgen Sie die Anweisungen:

  1. Open Source-Baum, ändern Sie zu diesem Commit

Open Source Baum

  1. Ändern Sie die Zeilen und finden Sie Ihr Commit, dass die falsche Datei als Commit gesendet wurde

Geben Sie hier die Bildbeschreibung ein

  1. Sie können die Liste Ihrer Änderungen in diesem Commit sehen Liste der Dateien im Quellbaum
  2. Wählen Sie es aus und klicken Sie dann auf ... Schaltflächen auf der rechten Seite ... klicken Sie auf Datei umkehren
  3. Dann können Sie es auf der Registerkarte "Dateistatus" unten links sehen und dann auf "Unstage" klicken:

Registerkarte "Dateistatus"

  1. Öffnen Sie Ihren Visual Studio-Code und kehren Sie zurück, indem Sie die entfernten Dateien festschreiben
  2. Schließlich können Sie die Ergebnisse Ihres letzten Commits im Quellbaum sehen

Geben Sie hier die Bildbeschreibung ein

Säbel tabatabaee yazdi
quelle