1360 Stimmen

Master-Zweig und 'origin/master' sind auseinandergelaufen, wie kann man die Zweige wieder auseinanderlaufen lassen?

Irgendwie ist mein master und mein origin/master Zweig haben sich auseinanderentwickelt.
Ich möchte eigentlich nicht, dass sie sich auseinanderentwickeln.

Wie kann ich diese Unterschiede sehen und zusammenführen sie?

4 Stimmen

Was meinen Sie mit abweichend? Stellen Sie Ihren Master neu ein? nach Sie schieben es?

51 Stimmen

Ich erhalte die Meldung "Your branch and 'origin/master' have diverged, # and have 1 and 1 different commit(s) each, respectively".

0 Stimmen

Ich habe meine Antwort aktualisiert, um diese "abweichende" Warnmeldung zu berücksichtigen.

36voto

Darren Cook Punkte 25952

In meinem Fall habe ich Folgendes getan, um das Problem zu lösen divergiert Nachricht: Ich habe git push aber dann hat git commit --amend um der Commit-Nachricht etwas hinzuzufügen. Dann habe ich eine weitere Übergabe durchgeführt.

In meinem Fall bedeutete das einfach, dass Ursprung/Master nicht mehr aktuell waren. Da ich wusste, dass niemand sonst origin/master anfasst, war die Korrektur trivial: git push -f (wobei -f bedeutet Kraft)

9 Stimmen

+1 für git push -f um die Änderungen zu überschreiben, die zuvor committed und an den Ursprung übertragen wurden. Ich bin auch sicher, dass niemand sonst das Repository berührt hat.

6 Stimmen

Sehr riskanter Befehl. Bitte schreiben Sie eine kurze Information über den Risikofaktor des Befehls.

2 Stimmen

@Trickster: Ich hatte das Risiko bereits beschrieben: "da ich wusste, dass niemand sonst den Ursprung/Master berührte". Ich glaube, in diesem Fall ist dies kein riskanter Befehl.

18voto

Laryx Decidua Punkte 7673

In meinem Fall habe ich Änderungen an origin/master und stellte dann fest, dass ich das nicht hätte tun sollen :-( Dies wurde durch die Tatsache erschwert, dass die lokalen Änderungen in einem Unterbaum lagen. Also ging ich zurück zum letzten guten Commit vor den "schlechten" lokalen Änderungen (mit SourceTree) und dann bekam ich die "Divergenzmeldung".

Nachdem ich mein Chaos vor Ort behoben hatte (die Details sind hier nicht wichtig), wollte ich die Fernbedienung "in der Zeit zurückdrehen". origin/master Zweig, damit er mit dem lokalen Zweig synchronisiert ist. master wieder. Die Lösung in meinem Fall war:

git push origin master -f

Beachten Sie die -f (Kraft-)Schalter. Dies löschte die "schlechten Änderungen", die nach origin/master und jetzt sind der lokale und der entfernte Zweig synchronisiert.

Bitte bedenken Sie, dass dies ein potenziell zerstörerischer Vorgang ist. Führen Sie ihn daher nur durch, wenn Sie sich zu 100 % sicher sind, dass das "Zurückversetzen" des entfernten Masters in der Zeit in Ordnung ist.

0 Stimmen

Das ist immer nützlich, beantwortet aber sicher nicht die Frage.

2 Stimmen

@ThibaultD. selbst wenn nicht, ist das genau das, wonach ich gesucht habe.

0 Stimmen

Ich bekomme You are not allowed to force push code to a protected branch on this project. . Ich versuche, zu meiner Gabel zu kommen.

16voto

Bianca Daniciuc Punkte 880

Ich weiß, dass es hier viele Antworten gibt, aber ich denke git reset --soft HEAD~1 verdient etwas Aufmerksamkeit, weil es Ihnen erlaubt, Änderungen im letzten . (nicht gepusht) begehen, während sie den divergierenden Zustand lösen. Ich denke, dies ist eine vielseitigere Lösung als Pull mit rebase Denn der lokale Commit kann überprüft und sogar in einen anderen Zweig verschoben werden.

Der Schlüssel ist die Verwendung von --soft anstelle des strengen --hard . Wenn es mehr als eine Übertragung gibt, wird eine Variation von HEAD~x sollte funktionieren. Hier sind also alle Schritte, die meine Situation gelöst haben (ich hatte 1 lokalen Commit und 8 Commits im Remote):

1) git reset --soft HEAD~1 um lokale Übertragungen rückgängig zu machen. Für die nächsten Schritte habe ich die Schnittstelle in SourceTree verwendet, aber ich denke, die folgenden Befehle sollten auch funktionieren:

2) git stash um Änderungen von 1) zu verbergen. Jetzt sind alle Änderungen sicher und es gibt keine Abweichung mehr.

3) git pull um die Fernänderungen zu erhalten.

4) git stash pop o git stash apply um die letzten zwischengespeicherten Änderungen anzuwenden, gefolgt von einer neuen Übertragung, falls gewünscht. Dieser Schritt ist optional, zusammen mit 2) wenn Sie die Änderungen in einem lokalen Commit verwerfen wollen. Auch wenn Sie auf einen anderen Zweig übertragen wollen, sollte dieser Schritt nach dem Wechsel zum gewünschten Zweig erfolgen.

1 Stimmen

Heutzutage ist die pull --rebase ohnehin automatisch verstauen würde. stackoverflow.com/a/30209750/6309

6voto

Shohin Punkte 383

Ich habe das Problem behoben, indem ich zu commit_sha die zuletzt an origin/master übergeben wird.

git reset --hard commit_sha

WARNUNG : Sie verlieren alles, was nach der 'commit_sha'-Übertragung übertragen wurde.

4voto

dsmith63 Punkte 179

Ersetzen Sie 123 durch die Anzahl der Commits, die Ihr Zweig vom Ursprung abweicht.

git reset HEAD~123 && git reset && git checkout . && git clean -fd && git pull

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