Git: Verwerfe alle Änderungen in einem divergierenden lokalen Zweig

117

Ich habe einen lokalen Themenzweig, der einen Remote-Zweig verfolgt. Angenommen, die Commit-Historien sehen aus Gründen der Argumentation folgendermaßen aus:

A--B--C--O1--O2--O3 (origin/phobos)
       \
         L1--L2--L3 (phobos)

Nachdem ich mir die relativen Commit-Historien angesehen habe, möchte ich nun alle Änderungen an der lokalen phobosVerzweigung verwerfen und sie wieder zu einer direkten Kopie machen origin/phobos, sodass die lokale Historie folgendermaßen aussieht:

A--B--C--O1--O2--O3 (phobos origin/phobos)

Ich möchte wirklich nicht, dass die lokalen Änderungen an der phobosVerzweigung vorgenommen werden, und ich möchte wirklich nicht, dass anschließend Zusammenführungen im Ursprungs-Repository angezeigt werden. (Also, nur das Zusammenführen ist nicht das, was ich vorhabe.)

Das scheint wirklich einfach zu sein, aber mein Google-Fu hat mich gescheitert. Wie mache ich das?

Electrons_Ahoy
quelle

Antworten:

79

Löschen Sie den Zweig und erstellen Sie ihn neu:

$ git branch -D phobos
$ git checkout --track -b phobos origin/phobos
Mipadi
quelle
37
Ein Problem bei diesem Ansatz im Vergleich zum Zurücksetzen des Zweigkopfs besteht darin, dass durch das Löschen des Zweigs das Reflog des Zweigs weggeblasen wird. Das Zurücksetzen des Zweigs behält andererseits nicht nur das Reflog bei, sondern zeichnet das Zurücksetzen tatsächlich im Reflog auf. Dies macht den Vorgang später bei Bedarf leicht umkehrbar.
Dan Moulding
9
@Electrons_Ahoy Würde vorschlagen, dass Sie die akzeptierte Antwort hier in Dan's ändern (damit Leute wie ich, die gegoogelt haben, wie es geht, wahrscheinlich die sicherere Methode wählen).
Steve Chambers
4
Die Antwort von @ DanMoulding beinhaltet nicht das Löschen eines lokalen Zweigs, wenn dies nicht erforderlich ist. Es ist viel sicherer.
brma
@brma: Wie so? Es zeigt immer noch nur einen Zweig auf ein neues Commit.
Mipadi
5
Dan Mouldings Antwort ist sicherer. Ich denke, Sie sollten diesen auswählen.
Daniel Apt
330
git checkout phobos
git reset --hard origin/phobos

Dies weist Git an, den Kopf von phobosauf das gleiche Commit wie zurückzusetzen origin/phobosund den Arbeitsbaum entsprechend zu aktualisieren.

Dan Moulding
quelle
35
IMO sollte dies die akzeptierte Antwort sein; Es gibt den Befehl "Zurücksetzen" aus, um den Verzweigungszeiger zu transplantieren, anstatt eine Operation mit Entfernen / Neuerstellen durchzuführen.
Vdboor
Eigentlich habe ich es zuerst versucht und es warf eine Menge Fehler, die durch lokale Kopien fast unbrauchbar wurden. Löschen / Neuerstellen war vielleicht weniger elegant, aber ich musste keine weiteren Fragen stellen.
Electrons_Ahoy
3
@Electrons_Ahoy: Hmm, das ist definitiv nicht normal. Dieses Zurücksetzen sollte normalerweise ein problemloser Vorgang sein, wenn Ihr Repo in gutem Zustand ist.
Dan Moulding
oder auch wenn es hinky ist. Verwenden Sie git reflog, um Ihren Weg nach Hause zu finden, wenn Sie diesen Befehl "versehentlich" ausgegeben haben, ohne tatsächlich zu lesen, was er tut. :)
dbn
Dies funktioniert auch, wenn Sie sich in der Filiale befinden und diese lokal durcheinander gebracht haben.
Slott