387 Stimmen

Wie kann ich eine Verzweigung auf eine bestimmte Übergabe festlegen?

In Git ist ein Branch ein Verweis auf einen Commit.

Wie kann ich einen bestimmten Zweig auf einen bestimmten Commit verweisen lassen? Angenommen, ich möchte master Punkt bei 1258f0d0aae... Wie kann ich das tun?

525voto

Mark Longair Punkte 412179

Sie können master Punkt bei 1258f0d0aae auf diese Weise:

git checkout master
git reset --hard 1258f0d0aae

Aber man muss dabei vorsichtig sein. Es kann durchaus sein, dass die Geschichte dieses Zweigs neu geschrieben wird. Das würde zu Problemen führen, wenn Sie ihn veröffentlicht haben und andere Personen an dem Zweig arbeiten.

Auch die git reset --hard verwirft alle nicht übertragenen Änderungen (d.h. diejenigen, die sich nur in Ihrem Arbeitsbaum oder im Index befinden).

Sie können auch eine Aktualisierung eines Zweigs mit erzwingen:

git branch -f master 1258f0d0aae

... aber Git lässt Sie das nicht tun, wenn Sie auf master zu dieser Zeit.

170voto

Wenn Sie derzeit no auf dem Zweig Master, das ist super einfach:

git branch -f master 1258f0d0aae

Das ist genau das, was Sie wollen: Es zeigt master bei der gegebenen Übergabe, und tut nichts anderes.

Wenn Sie derzeit auf Master sind, müssen Sie zuerst in den Zustand des losgelösten Kopfes kommen. Ich würde die folgenden zwei Befehle empfehlen:

git checkout 1258f0d0aae    #detach from master
git branch -f master HEAD   #exactly as above

#optionally reattach to master
git checkout master

Seien Sie sich jedoch bewusst, dass jede explizite Manipulation des Punktes einer Verzweigung dazu führen kann, dass Commits zurückbleiben, die nicht mehr von anderen Verzweigungen erreicht werden können und somit Gegenstand der Garbage Collection werden. Also, Denken Sie nach, bevor Sie tippen git branch -f !


Diese Methode ist besser als die git reset --hard Ansatz, da er nichts im Index oder Arbeitsverzeichnis zerstört.

50voto

Ivan Punkte 3867

Git branch -f <branchname> <commit>

Ich schließe mich der Lösung und den Kommentaren von Mark Longair an und empfehle jedem, diese zu lesen, bevor er handelt, aber ich würde vorschlagen, dass der Schwerpunkt auf folgenden Punkten liegen sollte

git branch -f <branchname> <commit>

Hier ist ein Szenario, in dem ich dies tun musste.

Szenario

Sie entwickeln auf dem falschen Zweig und müssen ihn daher zurücksetzen.

Start Okay

Saubere Entwicklung und Veröffentlichung von Software.

So far so good

Entwicklung im falschen Zweig

Irrtum: Versehentlich auf dem Versionszweig bleiben, während man weiter entwickelt.

After a mistake

Erkennen Sie den Fehler

"OH NEIN! Ich habe versehentlich auf dem Release-Zweig entwickelt." Der Arbeitsbereich ist vielleicht mit halb geänderten Dateien vollgestopft, die eine laufende Arbeit darstellen und die wir nicht anfassen und durcheinanderbringen wollen. Wir möchten einfach nur, dass Git ein paar Zeiger umdreht, um den aktuellen Zustand zu verfolgen und den Release-Zweig wieder so zu machen, wie er sein sollte.

Erstellen Sie einen Zweig für die Entwicklung, der die bisherige Arbeit enthält, und wechseln Sie zu diesem Zweig.

git branch development
git checkout development 

Changed to another branch

Korrigieren Sie den Zweig

Jetzt sind wir in der Problemsituation und brauchen deren Lösung! Korrigieren Sie den Fehler (den Versionszweig mit der Entwicklung voranzutreiben) und stellen Sie den Versionszweig wieder so her, wie er sein sollte.

Korrigieren Sie den Versionszweig so, dass er auf die letzte echte Version zurückverweist.

git branch -f release release2

Der Release-Zweig ist nun wieder korrekt, wie hier ...

Corrected

Was wäre, wenn ich den Fehler auf eine Fernbedienung schieben würde?

git push -f <remote> <branch> ist in einem anderen Thread gut beschrieben, obwohl das Wort "überschreiben" im Titel irreführend ist. Erzwingen von "git push" zum Überschreiben entfernter Dateien

48voto

CharlesB Punkte 80104
git reset --hard 1258f0d0aae

Aber Vorsicht, wenn der Nachkomme zwischen 1258f0d0aae y HEAD nicht in anderen Zweigen referenziert werden, ist es mühsam (aber nicht unmöglich), sie wiederherzustellen, daher sollten Sie besser einen "Backup"-Zweig im aktuellen HEAD zur Kasse gehen master und setzen Sie sie auf den gewünschten Wert zurück.

Stellen Sie außerdem sicher, dass Sie keine unbestätigten Änderungen haben, bevor eine reset --hard sind sie wirklich verloren (keine Möglichkeit zur Wiederherstellung).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X