änderungen - Eine bestimmte Datei mit Git zurücksetzen oder auf eine bestimmte Version zurücksetzen?




git reset (20)

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

Ich habe ein git log zusammen mit einem git diff , um die Revision zu finden, die ich brauche, habe aber nur keine Ahnung, wie ich die Datei in den früheren Zustand zurückversetzen kann.


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

git prevision <N> <filename>

Dabei ist <N> die Anzahl der Revisionen der Datei, die für die Datei <filename> .
Um beispielsweise die unmittelbar vorhergehende Revision einer einzelnen Datei x/y/zc , führen Sie x/y/zc aus

git prevision -1 x/y/z.c

Wie funktioniert git prevision?

Fügen Sie Ihrer gitconfig folgendes 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 log für die angegebene Datei aus und
  • wählt die entsprechende Festschreibungs-ID in der Historie der Datei und aus
  • Führt eine git checkout an die Festschreibungs-ID für die angegebene Datei aus.

Im Wesentlichen würde alles, was man in dieser Situation manuell tun würde,
in einem schönen, effizienten git-alias verpackt - git-prevision


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

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

Die Git-Checkout- Manpage enthält weitere Informationen.

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

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

Als Randbemerkung war ich mit diesem Befehl immer unangenehm, 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.


Das hat für mich funktioniert:

git checkout <commit hash> file

Dann bestätigen Sie die Änderung:

git commit -a

Erster Kopf für Zieldatei zurücksetzen

git reset HEAD path_to_file

Zweite Überprüfung dieser Datei

git checkout -- path_to_file

Hier ist mein Weg.

a) Öffnen Sie in Android Studio die Datei.

b) git -> Show History, finde den vorherigen Commit, zu dem ich zurückkehren möchte. Holen Sie sich die commit_id (dh einen Commit-Hash).

c) git checkout commit_id file_path


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

Manchmal möchten Sie einfach nur zurückgehen und jede Änderung ab einem bestimmten Punkt vergessen, da sie alle falsch liegen.

Beginnen mit:

$ git log

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

Als nächstes geben Sie ein:

$ git reset --hard SHA1_HASH

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


Ich muss EasyGit hier anschließen, was ein Wrapper ist, um git für Anfänger zugänglich zu machen, ohne erfahrene Benutzer zu verwirren. Eine der Sachen, die es tut, ist , mehr Bedeutungen zu geben, git revert . In diesem Fall würden Sie einfach sagen:

eg revert foo/bar foo/baz


In dem Fall, dass Sie eine Datei mit einem vorherigen Commit wiederherstellen möchten (und die Datei, die Sie bereits zurückgegeben haben möchten), können Sie sie verwenden

git checkout HEAD^1 path/to/file

oder

git checkout HEAD~1 path/to/file

Dann einfach die "neue" Version bereitstellen und festschreiben.

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

Beides funktioniert, wenn sich nur ein Elternteil im Baum befindet.


Natürlich muss jemand entweder ein verständliches Buch über Git schreiben, oder Git muss in der Dokumentation besser erklärt werden. Angesichts dieses Problems habe ich das erraten

cd <working copy>
git revert master

würde das letzte Commit aufheben, was zu tun schien.

Ian


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

git diff <commit hash> <filename>

Um eine bestimmte Datei zu diesem Commit zurückzusetzen, verwenden Sie den Befehl reset:

git reset <commit hash> <filename>

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

Ein guter Arbeitsablauf für das Verwalten von Wegpunkten ist das Verwenden von Tags zum sauberen Markieren von Punkten in der Timeline. Ich kann Ihren letzten Satz nicht ganz verstehen, aber Sie wollen einen Zweig von einem vorherigen Zeitpunkt abwehren. Verwenden Sie dazu den praktischen Checkout-Befehl:

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

Wenn Sie diese Änderungen zusammenführen möchten, können Sie dies gegen Ihre Hauptleitung zurückweisen:

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

Sie müssen vorsichtig sein, wenn Sie "Rollback" sagen. Wenn Sie früher eine Version einer Datei im 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 " Ich möchte zum ersten zurückkehren ", meinst du es wirklich so?

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

$ git checkout $A file

und dann übergeben Sie das Ergebnis. Der Befehl fragt "Ich möchte die Datei aus dem durch das Festschreiben $ A aufgezeichneten Status auschecken".

Auf der anderen Seite meinten Sie, dass Sie die durch die zweite Iteration (dh $ B) festgeschriebene Änderung abschaffen möchten, während Sie dabei halten, was $ C für die Datei getan hat. Sie möchten $ B zurücksetzen

$ git revert $B

Beachten Sie, dass derjenige, der Commit $ B erstellt hat, möglicherweise nicht sehr diszipliniert war und möglicherweise völlig unzusammenhängende Änderungen in demselben Commit ausgeführt hat. Bei diesem Revert werden möglicherweise andere Dateien als die von Ihnen als fehlerhaft angesehenen Dateien angezeigt so.


So funktioniert rebase :

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

Angenommen, du hast

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

Die ersten beiden Befehle ... Commit git checkout git rebase master

... checken Sie den Änderungszweig aus, den Sie für den Hauptzweig übernehmen möchten. Der Befehl rebase übernimmt die Commits von <my branch> (die nicht im master ) und wendet sie erneut an den Head of master . Mit anderen Worten ist das übergeordnete Element des ersten Commits in <my branch> kein vorheriges Commit in der master Historie mehr, sondern der aktuelle master Kopf. Die beiden Befehle sind die gleichen wie:

git rebase master <my branch>

Es ist möglicherweise einfacher, sich an diesen Befehl zu erinnern, da sowohl die "Basis" - als auch die "Änderungszweige" explizit sind.

. Das Endergebnis ist:

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

Die letzten beiden Befehle ...

git checkout master
git merge <my branch>

... führen Sie einen Schnellvorlauf durch, um alle Änderungen an <my branch> master <my branch> . Ohne diesen Schritt wird das Rebase-Commit nicht zum master hinzugefügt. Das Endergebnis ist:

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

master und <my branch> beziehen sich beide auf B' . Ab diesem Punkt ist es auch sicher, die Referenz <my branch> zu löschen.

git branch -d <my branch>

Um zu einer vorherigen Commit-Version der Datei zu gelangen, rufen Sie die Commit-Nummer ab, beispielsweise 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


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. Letzter Hashpunkt zeigt Ihre aktuelle Position (HEAD) und ändert nichts.


Viele Vorschläge hier, am ehesten nach git checkout $revision -- $file . Ein paar obskure Alternativen:

git show $revision:$file > $file

Und ich benutze das auch oft, um vorübergehend eine bestimmte Version zu sehen:

git show $revision:$file

oder

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

(OBS: $file muss mit ./ vorangestellt werden, wenn es sich um einen relativen Pfad für git show $revision:$file )

Und das noch seltsamer:

git archive $revision $file | tar -x0 > $file

Wenn Sie Git Extensions verwenden und nur 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ücksetzen möchten. Wählen Sie dann im Detailbereich die Registerkarte "Vergleich" aus und klicken Sie mit der rechten Maustaste die Datei, die Sie zurücksetzen möchten, dann 'Datei (en) zurücksetzen auf' ...., dann 'A' (das übergeordnete Element)


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

git checkout master~5 image.png

Dies setzt voraus, dass Sie sich im master Zweig befinden und die gewünschte Version 5 Commits zurückgibt.


git checkout ref | commitHash - filePath

z.B

git checkout HEAD~5 -- foo.bar
or 
git checkout 048ee28 -- foo.bar

git checkout -- foo

Das setzt foo auf HEAD zurück. Du kannst auch:

git checkout HEAD^ foo

für eine Revision zurück usw.


git revert <hash>

Wird ein bestimmtes Commit rückgängig machen. Es klingt, als ob Sie denken, dass git revert nur das letzte Commit beeinflusst.

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





version-control