TL; DR;
Zusammenfassend (wie Benubird kommentiert ), wenn:
git checkout A
git rebase B # rebase A on top of B
local
ist B
(Rebase auf ),
remote
ist A
Und:
git checkout A
git merge B # merge B into A
local
ist A
(verschmelzen in ),
remote
ist B
Eine Rebase wechselt ours
(aktueller Zweig vor dem Start der Rebase) und theirs
(der Zweig, über dem Sie die Basis neu erstellen möchten).
kutschkem weist darauf hin, dass in einem GUI-Mergetool-Kontext :
- lokale Verweise auf die teilweise neu basierten Commits : "
ours
" (der Upstream-Zweig)
- remote bezieht sich auf die eingehenden Änderungen : "
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
und theirs
während einer Rebase zusammenhängen .
(relevante Auszüge)
git rebase
Manpage :
Beachten Sie, dass eine Rebase-Zusammenführung funktioniert, indem jedes Commit aus dem Arbeitszweig über dem <upstream>
Zweig wiedergegeben wird.
Aus diesem Grund, wenn ein Zusammenführungskonflikt auftritt:
- Die Seite, die als '
ours
' gemeldet wird , ist die bisher neu basierte Serie, beginnend mit <upstream>
,
- und '
theirs
' ist der Arbeitszweig. Mit anderen Worten, die Seiten werden getauscht.
Inversion dargestellt
Bei einer Fusion
x--x--x--x--x(*) <- current branch B ('*'=HEAD)
\
\
\--y--y--y <- other branch to merge
Wir ändern den aktuellen Zweig 'B' nicht. Wir haben also immer noch das, woran wir gearbeitet haben (und wir verschmelzen aus einem anderen Zweig).
x--x--x--x--x---------o(*) MERGE, still on branch B
\ ^ /
\ ours /
\ /
--y--y--y--/
^
their
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)
x--x--x--x--x(*) <- current branch B
\
\
\--y--y--y <- upstream branch
A wechselt git rebase upstream
zuerst HEAD
von B in den vorgelagerten Zweig HEAD
(daher der Wechsel von "unserem" und "ihrem" im Vergleich zum vorherigen "aktuellen" Arbeitszweig).
x--x--x--x--x <- former "current" branch, new "theirs"
\
\
\--y--y--y(*) <- upstream branch with B reset on it,
new "ours", to replay x's on it
und dann wird die Rebase 'ihre' Commits auf dem neuen 'unser' B-Zweig wiedergeben:
x--x..x..x..x <- old "theirs" commits, now "ghosts", available through reflogs
\
\
\--y--y--y--x'--x'--x'(*) <- branch B with HEAD updated ("ours")
^
|
upstream branch
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 :
Für mich bleibt immer noch die Frage, welches "lokal" und wer "fern" ist (da die Begriffe "unsere" und "ihre" beim Umbasieren in git nicht verwendet werden, scheint es nur verwirrender zu sein, sich auf sie zu beziehen). .
GUI Git Mergetool
kutschkem fügt hinzu, und das zu Recht:
Bei der Lösung von Konflikten sagt Git etwas wie:
local: modified file and remote: modified file.
Ich bin mir ziemlich sicher, dass die Frage an dieser Stelle auf die Definition von lokal und fern abzielt. An diesem Punkt scheint es mir aus meiner Erfahrung, dass:
- lokale Verweise auf die teilweise neu basierten Commits : "
ours
" (der Upstream-Zweig)
- remote bezieht sich auf die eingehenden Änderungen : "
theirs
" - der aktuelle Zweig vor der Rebase.
git mergetool
erwähnt in der Tat "lokal" und "fern" :
Merging:
f.txt
Normal merge conflict for 'f.txt':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (kdiff3):
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 :
Rufen Sie Vimdiff als Mergetool mit git mergetool -t gvimdiff auf. Neuere Versionen von Git rufen Vimdiff mit dem folgenden Fensterlayout auf:
+--------------------------------+
| LOCAL | BASE | REMOTE |
+--------------------------------+
| MERGED |
+--------------------------------+
LOCAL
:
Eine temporäre Datei, die den Inhalt der Datei im aktuellen Zweig enthält.
BASE
:
Eine temporäre Datei, die die gemeinsame Basis für die Zusammenführung enthält.
REMOTE
:
Eine temporäre Datei, die den Inhalt der zusammenzuführenden Datei enthält.
MERGED
:
Die Datei mit den Konfliktmarkierungen.
Git hat so viel automatische Konfliktlösung wie möglich durchgeführt und der Status dieser Datei ist eine Kombination aus beidem LOCAL
und REMOTE
mit Konfliktmarkierungen, die alles umgeben, was Git selbst nicht lösen konnte.
Das mergetool
sollte das Ergebnis der Auflösung in diese Datei schreiben.