Wie kann ich mein Git-Repository auf ein bestimmtes Commit umstellen?

188

In meinem Git-Repository habe ich 5 Commits durchgeführt, wie unten in meinem Git-Protokoll:

commit 4f8b120cdafecc5144d7cdae472c36ec80315fdc
Author: Michael 
Date:   Fri Feb 4 15:26:38 2011 -0800

commit b688d46f55db1bc304f7f689a065331fc1715079
Author: Michael
Date:   Mon Jan 31 10:37:42 2011 -0800

commit b364f9dcec3b0d52666c4f03eb5f6efb7e1e7bda
Author: Michael
Date:   Wed Jan 26 13:33:17 2011 -0800

commit 4771e26619b9acba3f059b491c6c6d70115e696c
Author: Michael 
Date:   Wed Jan 26 11:16:51 2011 -0800

commit 6e559cb951b9bfa14243b925c1972a1bd2586d59
Author: Michael 
Date:   Fri Jan 21 11:42:27 2011 -0800

Wie kann ich meine vorherigen 4 Commits lokal in einer Filiale zurücksetzen? Mit anderen Worten, wie kann ich einen Zweig ohne meine letzten 4 Commits erstellen (vorausgesetzt, ich habe die SHA dieses Commits aus dem Git-Protokoll)?

Michael
quelle

Antworten:

228

So erstellen Sie einen neuen Zweig (lokal):

  • Mit dem Commit-Hash (oder einem Teil davon)

    git checkout -b new_branch 6e559cb
    
  • oder um 4 Commits von HEAD zurückzugehen

    git checkout -b new_branch HEAD~4
    

Sobald Ihr neuer Zweig (lokal) erstellt wurde, möchten Sie diese Änderung möglicherweise auf einer Fernbedienung mit demselben Namen replizieren: Wie kann ich meine Änderungen auf einen Remote-Zweig übertragen?


Informationen zum Verwerfen der letzten drei Commits finden Sie in der Antwort von Lunaryorn unten .


Informationen zum Verschieben Ihres aktuellen Zweig-HEAD in das angegebene Commit, ohne einen neuen Zweig zu erstellen , finden Sie in der Antwort von Arpiagar unten .

Artefakt
quelle
153

Alle oben genannten Befehle erstellen einen neuen Zweig, wobei das letzte Commit das im Befehl angegebene ist. Für den Fall, dass Ihr aktueller Zweig HEADzum angegebenen Commit verschoben werden soll, finden Sie unten den folgenden Befehl:

 git checkout <commit_hash>

Es löst das HEADangegebene Commit und zeigt es auf, und speichert das Erstellen eines neuen Zweigs, wenn der Benutzer nur den Verzweigungsstatus bis zu diesem bestimmten Commit anzeigen möchte.


Möglicherweise möchten Sie dann zum letzten Commit zurückkehren und den abgetrennten HEAD reparieren:

Einen Git abgetrennten Kopf reparieren?

Arpiagar
quelle
1
Dies würde den Kopf abnehmen. Nicht bequem.
IgorGanapolsky
Auch wenn das <commit_hash>in einem anderen Zweig ist, der vor uns liegt?
Ciasto Piekarz
Die verknüpfte Frage lautet git checkout masterneben ein oder zwei Randfällen, die für bestimmte Situationen gelten können.
i336_
66

Wenn Sie die letzten vier Commits wegwerfen möchten, verwenden Sie:

git reset --hard HEAD^^^^

Alternativ können Sie den Hash eines Commits angeben, auf den Sie zurücksetzen möchten:

git reset --hard 6e559cb
Mondhorn
quelle
4
Dies lässt den Verzweigungsschritt aus. Wenn er genau das ausführt, was hier gezeigt wird, verliert er diese Top-Commits dauerhaft.
Jimmy Cuadra
3
Nun, nicht unbedingt dauerhaft - man könnte den SHA des vorherigen Kopfes über erhalten git reflogund auf ihn zurücksetzen - aber es würde sie wegwerfen, ja.
Amber
1
Wenn die Commits zuerst gedrückt und dann zurückgesetzt werden, können sie mit nur einem Zug wieder abgerufen werden.
Rick Smith
17

Überprüfen Sie einfach das Commit, von dem aus Ihr neuer Zweig beginnen soll, und erstellen Sie einen neuen Zweig

git checkout -b newbranch 6e559cb95
KingCrunch
quelle