git: Dein Zweig und 'Herkunft / Meister' sind auseinander gegangen - wie kann man lokale Verpflichtungen wegwerfen?

77

Ich habe die folgende Nachricht in Git:

# Your branch and 'origin/master' have diverged,
# and have 3 and 8 different commits each, respectively.
#   (use "git pull" to merge the remote branch into yours)

Ich möchte die 3 lokalen Commits wegwerfen und die 8 Remote-Commits am Ursprung / Master ziehen.

(Das Zusammenführen wird zu schwierig sein. Ich würde lieber die 3 lokalen Commits erneut durchführen, sobald der Master auf dem neuesten Stand ist.)

Wie kann ich das machen?

Richard
quelle

Antworten:

207
git fetch origin
git reset --hard origin/master
SLaks
quelle
19
Mit Abstand die beste Antwort, die ich gesehen habe. Für jeden, der dies verwendet, gehen alle nicht gepushen Commits oder lokalen Änderungen nur zu Ihrer Information verloren.
DemitryT
4
können Sie darauf git reset origin/masterverzichten, --harddamit Änderungen am Arbeitsverzeichnis nicht verloren gehen?
wisbucky
Funktioniert bei mir. Es ist die perfekte Lösung.
Uttam Panara
Ich sehe eine ähnliche Nachricht, jedoch für Nicht-Master-Zweige, wenn ich sie auf den neuesten Master zurücksetze. Was würde ein Pull in diesem Fall tun? Soll ich ziehen Ich möchte, dass mein Commit auf den neuesten Änderungen basiert.
Rajeev Ranjan
@RajeevRanjan: Pull wird (versuchen), Ihre vorhandenen Änderungen zusammenzuführen. Zurücksetzen wird sie wegwerfen.
SLaks
29

So behalten Sie Ihre alten Commits in einem temporären Zweig bei, falls Sie sie benötigen:

git branch temp

Wechseln Sie dann zum neuen Master

git fetch origin
git reset --hard origin/master
jdramer
quelle
Verzweigt er in diesem Fall seinen Zweig? Wenn er zum Beispiel in 'mydevbranch' gearbeitet hat, wird dann durch Branchentemp einfach ein neuer Kopierzweig von mydevbranch erstellt? Es scheint eine Vorsichtsmaßnahme zu sein, wie Sie es ausdrücken, falls sie jemals gebraucht werden. Sie sind in dieser Kopie enthalten.
landete am
1
Ja, dies ist eine Vorsichtsmaßnahme. Es stellt nur sicher, dass die Commits nicht verloren gehen, falls Sie sie in Zukunft benötigen.
Jdramer
intuitiv hätte ich gedacht, dass Sie Ihren lokalen Code festlegen müssen, bevor Sie dies tun - und das ist das Problem, weil Sie nicht möchten, dass das, was Sie gerade getan haben, in den Upstream geht. Ich denke, du kommst vor Ort und drückst nicht - aber irgendwann müsste es steigen ... das ist unerwünscht, nehme ich an. Ein Zweig ist für eine Variation oder ein anderes Merkmal vorgesehen, muss jedoch aus einem festgelegten Zustand heraus erfolgen? Oder vielleicht ist es das, was du sagst. Vielleicht muss ich mir KEINE Sorgen um das Festschreiben machen - ich dachte nur, dass Branch eine Kopie des Ursprungs der festgeschriebenen Quelle nimmt (wobei lokale Änderungen verloren gehen)
landete
@landed: Ja, Sie würden Ihre lokalen Änderungen nach dem Verzweigen festschreiben temp. Sie können später, wenn Sie einige dieser Commits wiederherstellen möchten, diese auswählen (siehe git help cherry-pick).
Cris Luengo
5

Versuchen Sie dies, um Ihre lokalen Commits zu sprengen:

git reset --hard HEAD~4
Manojlds
quelle
3

Alternativ zum Zusammenführen können Sie den Feature-Zweig mit den folgenden Befehlen auf den Hauptzweig umstellen:

git checkout feature
git rebase master
Josip Ivic
quelle
2

Wenn ein Hard-Reset nicht für Sie funktioniert und Sie keinen Pull-Merge durchführen möchten, können Sie Ihre lokalen unerwünschten Änderungen wegwerfen, indem Sie Ihren lokalen Zweig löschen und den ursprünglichen erneut herunterladen:

git branch -D <local branch>
git checkout -b <branch name> origin/<branch name>

Am masterBeispiel:

git branch -D master
git checkout -b master origin/master
Gemtastic
quelle
Wenn der lokale Zweig von 'origin / <branch>' abweicht, kann der lokale Zweig nicht gelöscht werden.
Anirban
1

Verwenden Sie Folgendes, um Ihr letztes lokales Commit zu löschen:

git reset HEAD^

Dadurch wird der Header auf den Status vor dem Festschreiben zurückgesetzt, und Sie können git pullvom Master aus. Stellen Sie sicher, dass Sie alle Ihre Änderungen an einem anderen Ort (lokal) speichern, bevor Sie sie aus dem Remote-Repository abrufen.

Um konfliktfrei ziehen zu können, verwenden Sie git stashund dann git pull.

Bremsstrahlung
quelle