Wenn ich eine Git-Rebase mache, habe ich oft Schwierigkeiten herauszufinden, was mit dem "lokalen" und "entfernten" passiert, wenn Konflikte gelöst werden. Ich habe manchmal den Eindruck, dass sie die Seiten von einem Commit zum nächsten tauschen.
Dies liegt wahrscheinlich (definitiv) daran, dass ich es immer noch nicht richtig verstanden habe.
Wer ist beim Umbasieren "lokal" und wer "entfernt"?
(Ich benutze P4Merge zur Lösung von Konflikten)
git svn
Teil, nur für dengit rebase
Teil)Antworten:
TL; DR;
Zusammenfassend (wie Benubird kommentiert ), wenn:
local
istB
(Rebase auf ),remote
istA
Und:
local
istA
(verschmelzen in ),remote
istB
Eine Rebase wechselt
ours
(aktueller Zweig vor dem Start der Rebase) undtheirs
(der Zweig, über dem Sie die Basis neu erstellen möchten).kutschkem weist darauf hin, dass in einem GUI-Mergetool-Kontext :
ours
" (der Upstream-Zweig)theirs
" - der aktuelle Zweig vor der Rebase.Siehe Abbildungen im letzten Teil dieser Antwort.
Inversion beim Rebase
Die Verwirrung könnte mit der Inversion von
ours
undtheirs
während einer Rebase zusammenhängen .(relevante Auszüge)
git rebase
Manpage :Aus diesem Grund, wenn ein Zusammenführungskonflikt auftritt:
ours
' gemeldet wird , ist die bisher neu basierte Serie, beginnend mit<upstream>
,theirs
' ist der Arbeitszweig. Mit anderen Worten, die Seiten werden getauscht.Inversion dargestellt
Bei einer Fusion
Wir ändern den aktuellen Zweig 'B' nicht. Wir haben also immer noch das, woran wir gearbeitet haben (und wir verschmelzen aus einem anderen Zweig).
Auf einer Rebase:
Bei einer Rebase wechseln wir jedoch die Seite, da das erste, was eine Rebase bewirkt, das Auschecken des Upstream-Zweigs ist! (um die aktuellen Commits darüber abzuspielen)
A wechselt
git rebase upstream
zuerstHEAD
von B in den vorgelagerten ZweigHEAD
(daher der Wechsel von "unserem" und "ihrem" im Vergleich zum vorherigen "aktuellen" Arbeitszweig).und dann wird die Rebase 'ihre' Commits auf dem neuen 'unser' B-Zweig wiedergeben:
Hinweis: Der Begriff "Upstream" ist der referenzielle Datensatz (ein All-Repo oder, wie hier, ein Zweig, der ein lokaler Zweig sein kann), aus dem Daten gelesen oder neue Daten hinzugefügt / erstellt werden.
'
local
' und 'remote
' vs. 'mine
' und 'theirs
'Pandawood fügt in den Kommentaren hinzu :
GUI Git Mergetool
kutschkem fügt hinzu, und das zu Recht:
ours
" (der Upstream-Zweig)theirs
" - der aktuelle Zweig vor der Rebase.git mergetool
erwähnt in der Tat "lokal" und "fern" :Zum Beispiel würde KDiff3 die Zusammenführungsauflösung folgendermaßen anzeigen :
Und meld würde es auch anzeigen :
Gleiches gilt für VimDiff , das Folgendes anzeigt :
quelle
git checkout A; git rebase B
git checkout A; git rebase B
lokale B, Remote A ist . Wenn ichcheckout A
dann ich bin auf die Dateien derzeit auf der Suche , wie sie existieren aufA
, wie ist , dass die in irgendeiner Weise entfernten ? (Ich sage nicht, dass Benubird falsch ist; ich sage, dass Git eine dumme UX hat){branch A}
und{branch B}
oder ähnlich.Das Endergebnis
Git Rebase
Git Merge
Mit anderen Worten, LOCAL ist immer das Original, und REMOTE ist immer der Typ, dessen Commits vorher nicht da waren, weil sie oben zusammengeführt oder neu basiert werden
Beweise es!
Bestimmt. Nimm mein Wort nicht dafür! Hier ist ein einfaches Experiment, das Sie durchführen können, um sich selbst davon zu überzeugen.
Stellen Sie zunächst sicher, dass Sie git mergetool richtig konfiguriert haben. (Wenn Sie dies nicht tun würden, würden Sie diese Frage wahrscheinlich sowieso nicht lesen.) Suchen Sie dann ein Verzeichnis, in dem Sie arbeiten können.
Richten Sie Ihr Repository ein:
Erstellen Sie ein erstes Commit (mit einer leeren Datei):
Erstellen Sie ein Commit für einen Zweig, der kein Master ist:
Erstellen Sie ein Commit für den Hauptzweig:
Zu diesem Zeitpunkt sollte Ihr Repository folgendermaßen aussehen:
Nun zum Rebase-Test:
Nun der Zusammenführungstest. Schließen Sie Ihr Mergetool, ohne Änderungen zu speichern, und brechen Sie die Rebase ab:
Dann:
Ihre Ergebnisse sollten mit denen übereinstimmen, die oben angezeigt werden.
quelle
local
/remote
Aspekte, mit denen ich in meiner eigenen Antwort oben zu kämpfen hatte (in der es sowieso mehr um die Umkehrung vonours
vs gehttheirs
)Ich habe Ihr Problem nicht genau verstanden, aber ich denke, das folgende Diagramm behebt Ihr Problem. (Rebase: Remote Repository ---> Arbeitsbereich)
Quelle: Mein Git-Workflow
quelle