Irgendwie sind mein Master und mein Herkunfts- / Master-Zweig auseinander gegangen.
Ich möchte eigentlich nicht, dass sie auseinander gehen.
Wie kann ich diese Unterschiede anzeigen und zusammenführen?
Irgendwie sind mein Master und mein Herkunfts- / Master-Zweig auseinander gegangen.
Ich möchte eigentlich nicht, dass sie auseinander gehen.
Wie kann ich diese Unterschiede anzeigen und zusammenführen?
Antworten:
Sie können die Unterschiede überprüfen mit:
git log HEAD..origin/master
vor dem Ziehen (Abrufen + Zusammenführen) (siehe auch "Wie bringt man Git dazu, immer von einem bestimmten Zweig zu ziehen?" )
Wenn Sie eine Nachricht haben wie:
"Ihr Zweig und 'Ursprung / Master' sind auseinander gegangen, # und haben jeweils 1 und 1 verschiedene Commits."
Überprüfen Sie, ob Sie ein Update durchführen müssenorigin
. Wenn origin
es auf dem neuesten Stand ist, wurden einige Commits origin
von einem anderen Repo verschoben, während Sie Ihre eigenen Commits vor Ort vorgenommen haben.
... o ---- o ---- A ---- B origin/master (upstream work)
\
C master (your work)
Sie haben Commit C auf Commit A basiert, da dies die letzte Arbeit war, die Sie zu diesem Zeitpunkt aus dem Upstream abgerufen hatten.
Bevor Sie jedoch versucht haben, zum Ursprung zurückzukehren, hat jemand anderes Commit B gedrückt. Die
Entwicklungshistorie ist in separate Pfade unterteilt.
Sie können dann zusammenführen oder neu aufbauen. Weitere Informationen finden Sie unter Pro Git: Git Branching - Rebasing .
Verschmelzen
Verwenden Sie den Befehl git merge:
$ git merge origin/master
Dies weist Git an, die Änderungen von origin/master
in Ihre Arbeit zu integrieren und ein Merge-Commit zu erstellen.
Die Grafik der Geschichte sieht jetzt so aus:
... o ---- o ---- A ---- B origin/master (upstream work)
\ \
C ---- M master (your work)
Die neue Zusammenführung, Commit M, hat zwei übergeordnete Elemente, die jeweils einen Entwicklungspfad darstellen, der zu dem in diesem Commit gespeicherten Inhalt geführt hat.
Beachten Sie, dass der Verlauf hinter M jetzt nicht linear ist.
Rebase
Verwenden Sie den Befehl git rebase:
$ git rebase origin/master
Dies weist Git an, Commit C (Ihre Arbeit) so
abzuspielen, als hätten Sie es auf Commit B anstelle von A basiert. CVS- und Subversion-Benutzer setzen ihre lokalen Änderungen routinemäßig zusätzlich zur Upstream-Arbeit neu, wenn sie vor dem Commit aktualisiert werden.
Git fügt lediglich eine explizite Trennung zwischen den Commit- und Rebase-Schritten hinzu.
Die Grafik der Geschichte sieht jetzt so aus:
... o ---- o ---- A ---- B origin/master (upstream work)
\
C' master (your work)
Commit C 'ist ein neues Commit, das mit dem Befehl git rebase erstellt wurde.
Es unterscheidet sich von C in zweierlei Hinsicht:
Beachten Sie, dass der Verlauf hinter C 'immer noch linear ist.
Wir haben (vorerst) gewählt, nur lineare Geschichte in zuzulassen cmake.org/cmake.git
.
Dieser Ansatz behält den zuvor verwendeten CVS-basierten Workflow bei und kann den Übergang erleichtern.
Ein Versuch, C 'in unser Repository zu verschieben, funktioniert (vorausgesetzt, Sie haben Berechtigungen und niemand hat während des erneuten Basierens gepusht).
Der Befehl git pull bietet eine Kurzform zum Abrufen vom Ursprung und zum erneuten Basieren der lokalen Arbeit daran:
$ git pull --rebase
Dies kombiniert die obigen Schritte zum Abrufen und erneuten Basieren in einem Befehl.
git reset --hard HEAD
würde nur lokal indizierte, nicht festgeschriebene Änderungen entfernen und nichts tun, um die Unterschiede zwischen lokalen und Remote- Festschreibungen auszugleichen . Nur eine Zusammenführung oder ein Rebase bringt die beiden Commits (das lokale und das entfernte) zusammen.
master
verweisen B
.
git reset --hard origin/master
wie in der Antwort unten erwähnt: stackoverflow.com/a/8476004/6309
Ich hatte dies und bin verwirrt darüber, was es verursacht hat, selbst nachdem ich die obigen Antworten gelesen habe. Meine Lösung war zu tun
git reset --hard origin/master
Dann wird meine (lokale) Kopie des Masters (von der ich annehme, dass sie vermasselt ist) auf den richtigen Punkt zurückgesetzt, wie durch (entfernten) Ursprung / Master dargestellt.
WARNUNG : Sie verlieren alle Änderungen, die noch nicht vorgenommen wurden
origin/master
.
git reflog
oder in sehen gitk --all
. Aber natürlich ist der Hard-Reset eine andere Sache als eine Rebase.
git pull --rebase origin/master
ist ein einzelner Befehl, der Ihnen die meiste Zeit helfen kann.
Bearbeiten: Ruft die Commits vom Ursprung / Master ab und wendet Ihre Änderungen auf den neu gezogenen Zweigverlauf an.
Ich fand mich in dieser Situation , als ich versuchte rebase einen Zweig, der einen entfernten Zweig verfolgt, und ich versuche es auf Master rebase. Wenn Sie in diesem Szenario versuchen, die Basis neu zu definieren, wird Ihr Zweig höchstwahrscheinlich divergieren und es kann zu einem Durcheinander kommen, das nichts für Git-Nubees ist!
Angenommen, Sie befinden sich in der Verzweigung my_remote_tracking_branch, die vom Master verzweigt wurde
$ git status
# Auf Zweig my_remote_tracking_branch
nichts festzuschreiben (Arbeitsverzeichnis sauber)
Und jetzt versuchen Sie, vom Master zurückzugreifen als:
Git Rebase Master
STOPPEN SIE JETZT und sparen Sie sich Ärger! Verwenden Sie stattdessen Zusammenführen als:
Git Merge Master
Ja, Sie werden zusätzliche Commits in Ihrer Filiale erhalten. Wenn Sie sich jedoch nicht für "nicht divergierende" Zweige interessieren, ist dies ein viel reibungsloserer Workflow als das erneute Basieren. In diesem Blog finden Sie eine ausführlichere Erklärung.
Wenn es sich bei Ihrer Niederlassung jedoch nur um eine lokale Niederlassung handelt (dh noch nicht auf eine entfernte Fernbedienung übertragen wurde), sollten Sie auf jeden Fall eine Rebase durchführen (und Ihre Niederlassung wird in diesem Fall nicht voneinander abweichen ).
Nun , wenn Sie dies lesen , weil Sie bereits sind in einem „abgezweigt“ Szenario aufgrund solchen Fütterungsmaterial können Sie zum letzten wieder begehen vom Ursprung (dh in einem nicht abwich Zustand) unter Verwendung von :
git reset --hard origin / my_remote_tracking_branch
rebase
wenn der Zweig, den Sie neu gründen, nicht veröffentlicht wurde (und von anderen Personen verwendet wird). Andernfalls verwenden Sie merge
. Wenn Sie bereits veröffentlichte (und verwendete) Zweige neu gründen, müssen Sie eine Verschwörung koordinieren, um den Verlauf für jeden Entwickler neu zu schreiben, der Ihren Zweig verwendet hat.
git rebase master
...
git reset --hard origin/my_remote_tracking_branch
ist das, was wirklich funktioniert hat
In meinem Fall habe ich Folgendes getan, um die divergierende Nachricht zu verursachen : Ich habe es getan, git push
aber dann getan, git commit --amend
um der Festschreibungsnachricht etwas hinzuzufügen. Dann habe ich auch noch ein Commit gemacht.
In meinem Fall bedeutete das einfach, dass Herkunft / Master veraltet waren. Da ich wusste, dass niemand anderes Origin / Master berührte, war die Korrektur trivial: git push -f
(wo -f
bedeutet Kraft)
git push -f
, um die zuvor festgeschriebenen und auf den Ursprung übertragenen Änderungen zu überschreiben. Ich bin mir auch sicher, dass niemand anderes das Repository berührt hat.
In meinem Fall habe ich Änderungen vorgenommen origin/master
und dann festgestellt, dass ich dies nicht hätte tun sollen :-( Dies wurde durch die Tatsache erschwert, dass sich die lokalen Änderungen in einem Teilbaum befanden. Also ging ich zum letzten guten Commit vor dem "schlechten" lokalen zurück Änderungen (mit SourceTree) und dann bekam ich die "Divergenznachricht".
Nachdem ich mein Durcheinander lokal behoben hatte (die Details sind hier nicht wichtig), wollte ich den Remote- origin/master
Zweig "in der Zeit zurückversetzen", damit er wieder mit dem lokalen Zweig synchronisiert master
wird. Die Lösung in meinem Fall war:
git push origin master -f
Beachten Sie den -f
(Kraft-) Schalter. Dadurch wurden die "fehlerhaften Änderungen" gelöscht, die origin/master
versehentlich vorgenommen wurden, und jetzt sind die lokalen und Remote-Zweige synchron.
Beachten Sie bitte, dass dies ein potenziell zerstörerischer Vorgang ist. Führen Sie ihn daher nur aus, wenn Sie zu 100% sicher sind, dass das rechtzeitige Zurückbewegen des Remote-Masters in Ordnung ist.
You are not allowed to force push code to a protected branch on this project.
. Ich versuche an meine Gabel zu drücken.
Ich weiß, dass es hier viele Antworten gibt, aber ich denke git reset --soft HEAD~1
, dass es etwas Aufmerksamkeit verdient, weil Sie damit Änderungen im letzten lokalen (nicht gepushen) Commit beibehalten können, während Sie den divergierenden Zustand lösen. Ich denke, dies ist eine vielseitigere Lösung als Pull-With rebase
, da das lokale Commit überprüft und sogar in einen anderen Zweig verschoben werden kann.
Der Schlüssel verwendet --soft
anstelle des harten --hard
. Wenn es mehr als 1 Commit gibt, sollte eine Variation von HEAD~x
funktionieren. Hier sind alle Schritte, die meine Situation gelöst haben (ich hatte 1 lokales Commit und 8 Commits in der Fernbedienung):
1) git reset --soft HEAD~1
lokales Commit rückgängig 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
Änderungen von 1) zu verstauen. Jetzt sind alle Änderungen sicher und es gibt keine Abweichungen mehr.
3) git pull
um die Remote-Änderungen zu erhalten.
4) git stash pop
oder git stash apply
um die letzten versteckten Änderungen anzuwenden, gefolgt von einem neuen Commit, falls gewünscht. Dieser Schritt ist zusammen mit 2) optional, wenn die Änderungen im lokalen Commit verworfen werden sollen. Wenn Sie einen Commit für einen anderen Zweig durchführen möchten, sollte dieser Schritt ausgeführt werden, nachdem Sie zum gewünschten Zweig gewechselt haben.
pull --rebase
würde sich das heutzutage sowieso automatisch verstecken. stackoverflow.com/a/30209750/6309
So zeigen Sie die Unterschiede an:
git difftool --dir-diff master origin/master
Dadurch werden die Änderungen oder Unterschiede zwischen den beiden Zweigen angezeigt. In araxis (Mein Favorit) wird es in einem Ordner-Diff-Stil angezeigt. Zeigt jede der geänderten Dateien an. Ich kann dann auf eine Datei klicken, um die Details der Änderungen in der Datei anzuzeigen.
In meinem Fall wurde dies dadurch verursacht, dass ich meine Konfliktlösung nicht begangen habe.
Das Problem wurde durch Ausführen des git pull
Befehls verursacht. Änderungen in der Herkunft führten zu Konflikten mit meinem lokalen Repo, die ich löste. Ich habe sie jedoch nicht begangen. Die Lösung an dieser Stelle besteht darin, die Änderungen ( git commit
die aufgelöste Datei) festzuschreiben.
Wenn Sie seit der Lösung des Konflikts auch einige Dateien geändert haben, zeigt der git status
Befehl die lokalen Änderungen als nicht bereitgestellte lokale Änderungen und die Zusammenführungsauflösung als abgestufte lokale Änderungen an. Dies kann ordnungsgemäß behoben werden, indem zuerst Änderungen aus der Zusammenführung git commit
festgeschrieben werden , dann die nicht bereitgestellten Änderungen wie gewohnt hinzugefügt und festgeschrieben werden (z git commit -a
. B. durch ).
Ich hatte dieselbe Meldung, als ich versuchte, die letzte Festschreibungsnachricht zu bearbeiten, von bereits gepushtem Festschreiben, mit: git commit --amend -m "New message"
Als ich die Änderungen mit übertrug, git push --force-with-lease repo_name branch_name
gab es keine Probleme.
Dieses Problem ist aufgetreten, als ich einen Zweig basierend auf Zweig A von erstellt habe
git checkout -b a
und dann setze ich den Aufwärtsstrom von Zweig a zum Ursprungszweig B durch
git branch -u origin/B
Dann habe ich oben die Fehlermeldung bekommen.
Eine Möglichkeit, dieses Problem für mich zu lösen, war:
git checkout -b b origin/B