2013-05-14 16 views
15

Um herauszufinden, an welcher Stelle ich ein Feature in meiner Software gebrochen habe, muss ich ältere Versionen meines Repositorys überprüfen. Ich möchte nur das Arbeitsverzeichnis auf ein älteres Commit setzen, mit dem Code spielen, danach die Änderungen verwerfen und dann ein anderes Commit versuchen.Wie setze ich das Arbeitsverzeichnis auf ein älteres Commit?

Ich möchte nichts über Commits ändern, weder entfernen noch erstellen. Ich versuchte mit git reset, aber danach neuere Commit wurden nicht mehr angezeigt. Also habe ich das Repository erneut heruntergeladen, weil ich nicht wusste, wie ich das wiederherstellen soll.

+0

Ich kam dazu nach dem googeln "[Arbeitsverzeichnis zu einem früheren Commit tauschen aber Kopf unverändert lassen] (https://www.google.co.uk/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF- 8 # safe = aktiv & q = swap + working + Verzeichnis + zu + an + früher + commit + aber + leave + head + unverändert) ". Ich endete mit 'git checkout - ' für jede der Dateien, die ich auf den früheren Commit wiederherstellen wollte – dumbledad

Antwort

13

Eine einfache git checkout old-sha1 kann ein Anfang sein, aber der eigentliche Befehl für diese Art von Aufgabe ist:

git bisect.

Suche durch binäre Suche der Änderung, die einen Fehler eingeführt

Wenn Sie ein Skript in der Lage zu testen, ob Ihr Arbeitsbaum „funktioniert“ oder nicht haben, können Sie das Skript ausführen können auf vorherige durch git bisect verpflichtet Suchen des ersten Commits, das den Test unterbricht

Beachten Sie, dass dieser Befehl von GitHub für Windows noch nicht direkt unterstützt wird: Sie müssen eine Shell öffnen.


A git checkout verlassen würden Sie in einem frei stehenden HEAD, das spielt keine Rolle, da Sie keine Änderungen machen.
Um wieder Sie waren waren, Check-out eine Branche aus:

git checkout master 

Siehe "Why did git detach my head?".

+0

Danke, ich dachte 'checkout 'ist nur für Zweige vor. Welche Art von Skript könnte ich für "bisect" verwenden? Meine Anwendung ist in nativem C++ geschrieben. Übrigens bin ich beeindruckt von Git, solch einen Befehl aufzunehmen. – danijar

+0

@danijar nein, Sie können alle treeeish auschecken. Zum Beispiel würde "git checkout" @ {10 minutes ago} "' Ihnen den Commit vor 10 Minuten geben. – VonC

+0

@danijar für git bisect, beliebiges Skript, solange es mit Status 0 (funktioniert) oder 1 (fehlgeschlagen) beendet wird. – VonC

1

Mit git checkout <branch_name> können Sie zu den anderen verfügbaren Zweig wechseln. Wenn Sie Ihren HEAD zurücksetzen möchten die ältere begehen, können Sie den folgenden Befehl versuchen:

  • git reset --hard HEAD ~ 1 der Kopf durch ein einzelner Commit
  • git reset zurücksetzen - hart HEAD ~ 2 der Kopf durch 2 Commits und so weiter

auch zurückgesetzt werden, wenn Sie die commit haben, dann können Sie diesen Befehl versuchen: git reset --hard <commit> auf diese Weise können Sie das Arbeitsverzeichnis auf eine ältere einstellen verpflichten.

Um die Änderungen vollständig zu verwerfen, können Sie versuchen: git reset --hard, die Ihr Verzeichnis zum vorherigen Festschreiben bereinigt.

git checkout my-other-branch . 

Der Punkt ist ein Weg Spezifizierer angibt, die Sie wollen, dies zu tun für das gesamte Repository:

5

Sie können mithilfe der folgenden den Code in einem anderen Zweig mit dem Index der Kasse. Sie könnten ebenfalls nur einen bestimmten Ordner angeben. Technisch können Sie einen 'Baum-isch' Spezifizierer für den Parameter my-other-branch angeben, wie ein Tag, einen Commit Hash, etwas wie HEAD~1, ect ...Wenn Sie diese Änderungen unstaged sein wollen, könnten Sie dann tun:

git reset HEAD 

Vorausgesetzt, dass Sie in einem sauberen Zustand begann, werden Sie jetzt Ihr Arbeitsverzeichnis in dem gleichen Zustand wie my-other-branch sein.