Zurücksetzen oder Zurücksetzen einer bestimmten Datei auf eine bestimmte Version mithilfe von Git?

Ich habe einige Änderungen an der Datei vorgenommen, die mehrmals als Teil einer Gruppe von Dateien übertragen wurde, aber jetzt möchte ich Änderungen an der vorherigen Version zurücksetzen.

Ich habe git log zusammen mit git diff , um die Option zu finden, die ich brauchte, aber ich weiß nur nicht, wie ich die Datei in die Vergangenheit zurückholen kann.

3786
19 окт. setze Hates_ 19 Okt. 2008-10-19 02:34 08 um 2:34 Uhr 2008-10-19 02:34
ответ 31 Antworten
  • 1
  • 2

Angenommen, der festgelegte Commit-Hash ist c5f567 :

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

Weitere Informationen finden Sie auf der Git-Checkout-Handbuchseite .

Wenn Sie zum c5f567 an c5f567 zurückkehren c5f567 , fügen Sie ~1 (funktioniert mit einer beliebigen Zahl):

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

Als Anmerkung war mir dieser Befehl immer unangenehm, da er sowohl für gewöhnliche Dinge (Wechseln zwischen Zweigen) als auch für ungewöhnliche, destruktive Dinge (außer Änderungen im Arbeitsverzeichnis) verwendet wurde.

5117
19 окт. Antwort von Greg Hewgill 19. Oktober 2008-10-19 02:39 08 um 2:39 2008-10-19 02:39

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

 git diff <commit hash> <filename> 

Um eine bestimmte Datei an diesen Fixer zurückzugeben, verwenden Sie den Befehl reset:

 git reset <commit hash> <filename> 

Möglicherweise müssen Sie die Option --hard wenn Sie lokale Änderungen haben.

border=0

Ein guter Dokumentenfluss zum Verwalten Ihrer Wegpunkte ist die Verwendung von Tags, um Punkte auf Ihrer Timeline sauber zu halten. Ich kann Ihren letzten Satz nicht verstehen, aber was Sie möglicherweise brauchen, ist die Abweichung des Zweiges vom vorherigen Zeitpunkt. Verwenden Sie dazu den bequemen Checkout-Befehl:

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

Wenn Sie diese Änderungen zusammenführen möchten, können Sie sie anschließend in Ihrer Hauptlinie erneut installieren:

 git checkout <my branch> git rebase master git checkout master git merge <my branch> 
541
17 дек. Antwort von Chris Lloyd am 17. Dezember 2008-12-17 09:59 08 um 09:59 2008-12-17 09:59

Sie können jeden Link für das Git-Commit verwenden, einschließlich SHA-1, wenn dies am bequemsten ist. Tatsache ist, dass das Team so aussieht:

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

319
08 апр. die antwort ist gegeben foxxtrot 08 apr. 2009-04-08 00:48 09 um 0:48 2009-04-08 00:48
 git checkout -- foo 

Dies wird ein Reset- foo für HEAD sein. Sie können auch:

 git checkout HEAD^ foo 

für eine Revision usw.

256
29 авг. Antwort von Greg Hewgill 29. August 2008-08-29 23:56 08 um 23:56 Uhr 2008-08-29 23:56

Und um zur letzten fertigen Version zurückzukehren, die am häufigsten benötigt wird, können Sie diesen einfacheren Befehl verwenden.

 git checkout HEAD file/to/restore 
114
14 янв. Die Antwort wird mit 14 Januar CDR gegeben . 2012-01-14 09:15 '12 am 9:15 2012-01-14 09:15

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

 git checkout [commit-ref] [filename] 

Dadurch wird diese alte Version in Ihrem Arbeitsverzeichnis gespeichert und Sie können sie von dort aus korrigieren, wenn Sie möchten.

102
27 мая '09 в 20:52 2009-05-27 20:52 Die Antwort wird von bbrown am 27. Mai 09 um 20:52 2009-05-27 20:52 gegeben

Wenn Sie wissen, wie viele Commits Sie zurückgeben müssen, können Sie Folgendes verwenden:

 git checkout master~5 image.png 

Es wird davon ausgegangen, dass Sie sich im master Zweig befinden, und die gewünschte Version ist 5.

88
07 апр. Die Antwort wird von Ron DeVera 07 Apr gegeben 2009-04-07 17:03 09 um 07:03 Uhr 2009-04-07 17:03

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

Manchmal möchten Sie einfach nur zurückgehen und alle Änderungen für einen bestimmten Punkt vergessen, da sie alle falsch sind.

Beginnen Sie mit:

$ git log

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

Dann geben Sie ein:

$ git reset --hard SHA1_HASH

um den Status für ein bestimmtes Commit wiederherzustellen und alle neuen Einträge für immer aus dem Datensatz zu löschen.

78
17 дек. Die Antwort wird am 17. Dezember gegeben. 2008-12-17 09:53 08 um 09:53 2008-12-17 09:53

Es hat für mich funktioniert:

 git checkout <commit hash> file 

Dann bestätigen Sie die Änderung:

 git commit -a 
61
26 авг. Die Antwort ist v2k 26 aug gegeben. 2011-08-26 01:12 '11 at 1:12 2011-08-26 01:12

Sie müssen vorsichtig sein, wenn Sie "Rollback" sagen. Wenn Sie eine Version der Datei in Commit $ A verwendet haben, haben Sie zwei Änderungen an zwei separaten Commits $ B und $ C vorgenommen (Sie sehen also, dies ist die dritte Iteration der Datei), und wenn Sie sagen: "Ich möchte zum ersten Mal zurückkehren", dann Sie wirklich ernst meinen

Wenn Sie Änderungen in der zweiten und dritten Iteration entfernen möchten, ist dies sehr einfach:

 $ git checkout $A file 

und dann fixieren Sie das Ergebnis. Der Befehl fragt "Ich möchte die Datei anhand des durch das $ A-Commit geschriebenen Status prüfen".

Auf der anderen Seite wollten Sie die zweite Iterationsänderung loswerden (d. H. $ B machen), während Sie behaupten, dass Sie die $ C-Datei in der Datei repariert haben, und Sie möchten $ B zurückgeben

 $ git revert $B 

Hinweis: Wer auch immer $ B zugesagt hat, war möglicherweise nicht sehr diszipliniert und könnte an demselben Commit völlig unabhängige Änderungen vornehmen. Diese Rückgabe kann andere Dateien betreffen als die Datei, die Sie sehen, anstößige Änderungen kann das Ergebnis danach sorgfältig prüfen.

54
11 янв. die antwort wird von gitster 11 jan gegeben. 2009-01-11 11:13 09 um 11:13 2009-01-11 11:13

Interessanterweise funktioniert 'git checkout foo' nicht, wenn sich die Arbeitskopie in einem Verzeichnis namens foo befindet. wie "w20> checkout HEAD foo" und "git checkout./foo" wären jedoch:

 $ pwd /Users/aaron/Documents/work/foo $ git checkout foo D foo Already on "foo" $ git checkout ./foo $ git checkout HEAD foo 
36
30 авг. Die Antwort wird von Aaron Maenpaa 30 August gegeben . 2008-08-30 00:26 08 um 00.28 Uhr 2008-08-30 00:26

Hier arbeitet rebase :

 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 Teams ... machen einen Git-Checkout-Assistenten

... prüfen Sie den Zweig der Änderungen, die Sie auf den Hauptzweig anwenden möchten. Der Befehl rebase übernimmt Commits von <my branch> (die nicht im master ) und rebase sie erneut auf den master Header an. Mit anderen Worten, das übergeordnete Element des ersten Commits in <my branch> nicht mehr der vorherige Fixer in der master Historie, sondern der aktuelle master Header. Zwei Teams sind die gleichen wie:

 git rebase master <my branch> 

Vielleicht wäre es einfacher, sich an diesen Befehl zu erinnern, da die "Basis" - und "Änderungs" -Zweige explizit sind.

. Das Endergebnis:

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

Die letzten beiden Mannschaften ...

 git checkout master git merge <my branch> 

... führen Sie eine schnelle Zusammenführung durch, um alle Änderungen an <my branch> master <my branch> zu übernehmen. Ohne diesen Schritt wird dem master kein rebase-Commit hinzugefügt. Das Endergebnis:

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

master und <my branch> beide Referenzen B' . Außerdem können Sie ab diesem Punkt den Link <my branch> sicher entfernen.

 git branch -d <my branch> 
32
24 февр. Die Antwort wird von cmcginty 24 Feb. gegeben. 2009-02-24 12:43 09 um 12:43 2009-02-24 12:43

git alias, awk und shell funktionen für die rettung!

 git prevision <N> <filename> 

Dabei ist <N> die Anzahl der Dateikorrekturen für das Rollback der Datei <filename> .
Um beispielsweise die unmittelbare vorherige x/y/zc einer einzelnen x/y/zc Datei zu überprüfen, führen Sie x/y/zc aus

 git prevision -1 x/y/zc 

Wie funktioniert die Git-Vorhersage?

Fügen Sie Ihrer gitconfig

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

Team im Grunde

  • führt git log in der angegebenen Datei aus und
  • wählt die entsprechende Festschreibungs-ID im Dateiverlauf aus und
  • führt die git checkout Commit-ID für die angegebene Datei aus.

Im Wesentlichen alles, was in dieser Situation manuell erledigt werden könnte
in einem schönen, effektiven git-alias eingewickelt - git-prevision

21
01 мая '15 в 4:46 2015-05-01 04:46 Die Antwort wird von TheCodeArtist am 01. Mai '15 am 4:46 2015-05-01 04:46 gegeben

Ich muss hier EasyGit anschließen , einen Wrapper, um Git für Anfänger leichter zugänglich zu machen, ohne erfahrene Benutzer zu verwirren. Eine der Sachen, die es tut, gibt mehr git revert . In diesem Fall sagen Sie einfach:

eg revert foo/bar foo/baz

20
19 окт. Die Antwort wird gegeben Aristoteles Pagaltzis 19 Okt. 2008-10-19 03:16 '08 um 03:16 Uhr 2008-10-19 03:16 Uhr

Wenn Sie die Datei zum vorherigen Commit zurücksetzen möchten (und die Datei, die Sie zurückgeben möchten, ist bereits festgelegt), können Sie verwenden

 git checkout HEAD^1 path/to/file 

oder

 git checkout HEAD~1 path/to/file 

Dann führen Sie einfach den Schritt aus und korrigieren Sie die "neue" Version.

Ausgestattet mit dem Wissen, dass ein Commit bei einer Fusion zwei Eltern haben kann, sollten Sie wissen, dass HEAD ^ 1 der erste Elternteil ist und HEAD ~ 1 der zweite Elternteil ist.

Oder es funktioniert, wenn sich nur ein Elternteil im Baum befindet.

20
11 янв. Die Antwort wird von ModernIncantations vom 11. Januar gegeben. 2014-01-11 03:29 '14 am 3:29 2014-01-11 03:29

Erster Kopf für Zieldatei zurücksetzen

 git reset HEAD path_to_file 

Die zweite Prüfung dieser Datei

 git checkout -- path_to_file 
19
04 апр. Die Antwort wird von Gulshan Maurya 04 April gegeben. 2017-04-04 13:25 '17 um 13:25 Uhr 2017-04-04 13:25

Beachten Sie, dass git checkout ./foo und 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 

(Das zweite add verarbeitet die Datei im Index, wird jedoch nicht festgeschrieben.)

git checkout ./foo bedeutet, den Pfad ./foo zum Index zurückzugeben ; Durch das Hinzufügen eines HEAD Git angewiesen, diesen HEAD vorher an seinen HEAD .

19
31 авг. Die Antwort wird von Damien Diederen am 31. August gegeben 2008-08-31 14:54 08 um 14:54 Uhr 2008-08-31 14:54

Es gibt viele Vorschläge, die meisten im Sinne von git checkout $revision -- $file . Ein paar obskure Alternativen:

 git show $revision:$file > $file 

Außerdem verwende ich sie oft nur, um vorübergehend eine bestimmte Version zu sehen:

 git show $revision:$file 

oder

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

(OBS: $file muss mit dem Präfix ./ wenn dies ein relativer Pfad für git show $revision:$file ).

Und umso seltsamer

 git archive $revision $file | tar -x0 > $file 
14
08 янв. Antwort von Peter V. Mørch 8. Januar 2016-01-08 01:19 16 um 01.19 Uhr 2016-01-08 01:19

Um zur vorherigen Version der Festschreibungsdatei zu ge>

 git checkout eb917a1 YourFileName 

Wenn Sie nur zur letzten registrierten Version zurückkehren müssen.

 git reset HEAD YourFileName git checkout YourFileName 

Dadurch ge>

11
25 февр. Die Antwort ist gegeben shah1988 25 Feb. 2014-02-25 17:01 '14 um 17:01 2014-02-25 17:01

Für mich schien keine Antwort wirklich klar, und deshalb möchte ich meine hinzufügen, was sehr einfach erscheint.

Ich habe ein Commit abc1 , und danach habe ich mehrere (oder eine Modifikation) file.txt Datei gemacht.

Nun sag mir, dass ich etwas in der Datei file.txt versaut habe und ich zum vorherigen Commit abc1 .

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

2. git checkout abc1 file.txt : Dies führt Ihre Datei zur gewünschten Version

3. git commit -m "Restored file.txt to version abc1" : Dies führt git commit -m "Restored file.txt to version abc1" .

  1. git push : dies bringt alles zu einem entfernten Repository

Natürlich können Sie zwischen Schritt 2 und 3 den git status zu verstehen, was los ist. Normalerweise sollten Sie sehen, dass file.txt bereits hinzugefügt wurde. Daher ist git add nicht erforderlich.

10
23 марта '17 в 0:33 2017-03-23 00:33 Die Antwort wird von kalmanIsAGameChanger am 23. März 17 um 0:33 2017-03-23 ​​00:33 gegeben

git checkout ref | commitHash - filePath

zum beispiel.

 git checkout HEAD~5 -- foo.bar or git checkout 048ee28 -- foo.bar 
10
26 сент. Die Antwort wird Amos Folarin 26 Sep gegeben . 2013-09-26 20:04 13 am 20:04 2013-09-26 20:04

Bei vielen Antworten müssen Sie git reset ... <file> oder git checkout ... <file> . Sie verlieren jedoch alle Änderungen an <file> , die nach dem Commit, den Sie zurückgeben möchten, vorgenommen wurden.

Wenn Sie Änderungen von nur einem Commit in nur eine Datei verwerfen möchten, wie dies bei git revert Fall wäre, jedoch nur in einer einzigen Datei (oder beispielsweise einer Teilmenge der Commit-Dateien), schlage ich vor, sowohl git diff als auch git apply wie git apply ( mit <sha> = dem Hash des Commits, den Sie zurückgeben möchten):

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

Im Prinzip wird zuerst ein Patch generiert, der den Änderungen entspricht, die Sie zurückgeben möchten, und dann die Anwendung des Patches abgebrochen, um diese Änderungen zu verwerfen.

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

8
07 дек. Die Antwort ist Vince 07 Dez gegeben. 2016-12-07 17:43 '16 um 17:43 Uhr 2016-12-07 17:43

Verwenden Sie git log , um den Hash-Schlüssel für eine bestimmte Version git checkout <hashkey> , und verwenden Sie dann git checkout <hashkey>

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

8
05 дек. Die Antwort ist Mustafakyr 05 Dez gegeben. 2011-12-05 23:09 '11 am 23:09 2011-12-05 23:09

Natürlich muss jemand ein klares Buch über GIT oder GIT schreiben, um es in der Dokumentation besser zu erklären. Mit demselben Problem konfrontiert, ahnte ich das

 cd <working copy> git revert master 

kehrt den letzten Commit um, was scheinbar geschieht.

Ian

7
16 дек. Die Antwort wird am 16. Dezember von Ian Davis gegeben . 2011-12-16 06:03 11 um 6:03 2011-12-16 06:03

Wenn Sie in Ihren letzten Commits eine falsche Datei erstellen, folgen Sie den Anweisungen:

  1. Open Source Tree, ändern Sie dieses Commit

2019

23 авг. Antwort von Saber Tabatabaee Yazdi 23 Aug. 2018-08-23 12:53 '18 am 12:53 2018-08-23 12:53

Sie können dies in 4 Schritten tun:

  1. brechen Sie den gesamten Commit mit der Datei ab, die Sie gezielt abbrechen möchten. Dadurch wird ein neuer Commit in Ihrem Thread erstellt
  2. soft reset that commit - entfernt das Commit und verschiebt die Änderungen in den Arbeitsbereich
  3. Wählen Sie manuell Dateien aus, um sie zurückzugeben und zu sperren
  4. Alle anderen Dateien in Ihrem Arbeitsbereich ablegen

Was Sie in Ihrem Terminal wählen 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' git add <file_i_want_to_revert> git commit -m 'reverting file'
  4. git checkout.

viel Glück

4
08 мая '18 в 13:26 2018-05-08 13:26 Die Antwort wird von Nir M gegeben. 8. Mai '18 um 13:26 Uhr 2018-05-08 13:26
 git revert <hash> 

Gibt den angegebenen Commit zurück. Sie scheinen zu glauben, dass git revert nur das letzte Commit beeinflusst.

Dies löst Ihr Problem nicht, wenn Sie die Änderung in einer bestimmten Datei rückgängig machen möchten und das Festschreiben mehr als diese Datei geändert hat.

4
17 дек. Otto antwortete am 17. Dezember 2008-12-17 21:56 08 um 21:56 Uhr 2008-12-17 21:56

Hier ist mein Weg.

a) Öffnen Sie in Android Studio die Datei.

b) git → Historie anzeigen, finde das vorherige Commit, zu dem ich zurückkehren möchte. Holen Sie sich commit_id (d. H. Commit Hash).

c) git checkout commit_id file_path

1
13 марта '17 в 11:10 2017-03-13 11:10 Die Antwort wird von Francis Bacon 13. März 17 um 11:10 2017-03-13 11:10 gegeben

Wenn Sie Git Extensions verwenden und zum übergeordneten Commit für die Datei zurückkehren möchten, können Sie das Commit auswählen, das die Änderungen enthält, die Sie zurückgeben möchten. Wählen Sie dann die Registerkarte "Diff" im Detail aus, klicken Sie mit der rechten Maustaste auf die Datei, die Sie zurückgeben möchten, und klicken Sie dann auf "Zurücksetzen der Datei auf". .... ", dann" A "(übergeordnetes Element)

1
26 сент. Antwort von johnny 26 sept. 2017-09-26 04:48 '17 am 4:48 2017-09-26 04:48

Dies ist ein sehr einfacher Schritt. Extrahieren Sie die Datei mit der gewünschten Festschreibungs-ID. Hier ist bereits eine Festschreibungs-ID. Dann führen Sie einfach den Befehl git commitmend aus, und Sie sind fertig.

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

Es ist sehr bequem. Wenn wir eine Datei mit einem Bezeichner des vorherigen Commits am Anfang des Commits ausgeben möchten, können wir dies problemlos tun.

1
24 янв. Antwort von Abhishek Dwivedi am 24. Januar 2019-01-24 20:21 '19 um 20:21 Uhr 2019-01-24 20:21
  • 1
  • 2

Weitere Fragen zu Tags oder Fragen stellen