2010-03-18 8 views
6

Ich habe ein lokales Git Repo auf meinem Laptop und dann schob die Quelle zu Heroku eine Remote-Filiale erstellen. Nach einigen Tagen Commits und Pushs muss ich zu einem früheren Commit zurückkehren. Hier ist was ich getan habe.Git Kasse <SHA> und Heroku

cd <app root> 
git checkout 35fbd894eef3e114c814cc3c7ac7bb50b28f6b73 

Jemand hat mir gesagt, dass die Kasse macht einen neuen Arbeitsbaum angelegt und nicht der Zweig selbst, so, wenn ich die Rollback Änderungen an Heroku gedrückt, hieß es alles auf dem neuesten Stand und nichts geschoben wurde. Wie behebe ich diese Situation? Danke im Vorraus für deine Hilfe.

Antwort

8

Wenn Sie einen direkten Namen begehen Kasse (unter Verwendung des SHA-1-Hash des Objekts Festschreibung) stattdessen einen Zweignamen der Check-out, am Ende mit einem „detached up KOPF". HEAD ist das "Ref", das den aktuell ausgecheckten Inhalt verfolgt. Es wird losgelöst, wenn Sie einen Commit anstelle eines Zweigs direkt auschecken (es ist keinem Zweig zugeordnet). Wenn Sie den HEAD eines Repositorys trennen, werden keine Zweige aktualisiert. Sie könnten an den losgelösten Kopfzustand denken, als ob Sie einen anonymen Zweig ausgecheckt hätten.


Um Ihre Repository HEAD wieder anbringen, werden Sie den aktuellen HEAD als Zweig speichern und diesen Zweig finden Sie unter:

  1. Um den aktuellen HEAD in einem neuen Zweig zu speichern tun dies :

    git branch <new-branch-name> 
    
  2. um eine bestehenden Zweig Sie müssen überschreibenverwenden:

    git branch --force <existing-branch-name> 
    
  3. Dann Repository HEAD wieder anbringen, indem Sie die neue/aktualisierte Zweig Check-out:

    git checkout <branch-name> 
    

    (wo <branch-name> ist die gleiche wie <new-branch-name> oder <existing-branch-name>, je nachdem, welche der beiden oben genannten Befehle verwendet Sie)

diese Sequenz (git branch einen ref Punkt zu machen zu dem aktuellen HEAD-Commit, dann git checkout dieser aktualisierte Zweig) wird alle nicht festgeschriebenen Inhalte, die Sie möglicherweise in Ihrem Arbeitsindex und/oder Baum haben, weiterleiten.


In Zukunft, wenn Sie die aktuellen Zweig zu einem früheren zu ‚Rollback‘ wollen begehen, können Sie diese statt Abnehmen HEAD Ihr Repository verwenden soll:

git reset --hard <commit> 

Dies wird zurückgesetzt der aktuelle Zweig (oder Ihr abgetrennter HEAD, falls dieser bereits getrennt ist) zum benannten Commit, und der Index und der Arbeitsbaum spiegeln dieses Commit wider (dh es verwirft alle Commits seit dem angegebenen Commit zusammen mit nicht festgeschriebenem Inhalt).

Der abgekoppelte HEAD-Zustand ist nützlich, um alte Zustände wiederzusehen, und manchmal für kurzfristige Arbeit, von der Sie nicht sicher sind, ob Sie sie behalten.Ansonsten möchten Sie es wahrscheinlich vermeiden.

2

Sie zurücksetzen möchten:

git reset --hard 35fbd894eef3e114c814cc3c7ac7bb50b28f6b73
+0

Danke, das wird den Arbeitsbaum zurück in den Zweig verwandeln? – Bob

+0

Dies ist wahrscheinlich das, was Sie anfangs hätten tun sollen, aber es wird Ihre Situation nicht beheben. Wenn dein KOPF noch getrennt ist, wird er nicht erneut an einen Zweig angeschlossen. Bitte sehen Sie meine Antwort. –

+1

Es setzt Ihren aktuellen Kopf auf das angegebene Commit zurück. Sie müssen also den Checkout-Master (oder den Zweig, den Sie zurücksetzen möchten) zurückgeben und dann den Befehl "git reset" verwenden. – Chris