Ich benutze git-svn und habe festgestellt, dass, wenn ich nach dem Ausführen von a einen Zusammenführungskonflikt beheben muss git svn rebase
, die Bedeutung von --ours
und --theirs
Optionen für z git checkout
. B. umgekehrt ist. Das heißt, wenn es einen Konflikt gibt und ich die vom SVN-Server stammende Version behalten und die lokal vorgenommenen Änderungen wegwerfen ours
möchte , muss ich sie verwenden , wenn ich dies erwarten würde theirs
.
Warum ist das so?
Beispiel:
mkdir test
cd test
svnadmin create svnrepo
svn co file://$PWD/svnrepo svnwc
cd svnwc
echo foo > test.txt
svn add test.txt
svn ci -m 'svn commit 1'
cd ..
git svn clone file://$PWD/svnrepo gitwc
cd svnwc
echo bar > test.txt
svn ci -m 'svn commit 2'
cd ..
cd gitwc
echo baz > test.txt
git commit -a -m 'git commit 1'
git svn rebase
git checkout --ours test.txt
cat test.txt
# shows "bar" but I expect "baz"
git checkout --theirs test.txt
cat test.txt
# shows "baz" but I expect "bar"
Antworten:
Das scheint im Einklang mit dem zu stehen, was eine Rebase bewirkt.
git svn rebase
holt Revisionen vom SVN-Elternteil des aktuellen HEAD und ruft die aktuelle (nicht an SVN gebundene) Arbeit dagegen zurück.git rebase
erwähnt: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:
<upstream>
:Mit anderen Worten, die Seiten werden getauscht .
Wenn Sie beide Definitionen in Einklang bringen:
test.txt
Datei mit dembar
Inhalt).test.txt
Datei mit dembaz
Inhalt) ist "ihr", und jeder dieser lokalen Git-Commits wird wiedergegeben.Mit anderen Worten, SVN oder nicht:
<upstream>
Zweig " " (auf dem alles wiedergegeben wird und der Teil der bisher neu festgelegten Commits ist) ist " unser ".Guter Mnemonik-Tipp von CommaToast :
(und das erste, was a
git rebase upstream
tut, um denupstream
Zweig auszuchecken, auf dem Sie die Basis neu erstellen möchten: HEAD bezieht sich aufupstream
-ours
jetzt.)Die Verwirrung kommt wahrscheinlich von der Rolle der Arbeitsbranche in einem Klassiker
git merge
.Wenn Sie zusammenführen:
Wie in der
git rebase
Manpage erwähnt, bedeutet eine Zusammenführung während einer Rebase, dass die Seite getauscht wird.Eine andere Möglichkeit, dasselbe zu sagen, besteht darin, Folgendes zu berücksichtigen:
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).
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 für den neuen "unser" B-Zweig wiedergeben:
Der einzige zusätzliche Schritt
git svn rebase
besteht darin, dass zuerst ein SVN-Abruf für den Git-Remote-Zweig ausgeführt wird, der SVN-Commits darstellt.Sie haben zunächst:
Sie aktualisieren zuerst den SVN-Verfolgungszweig mit neuen Commits, die von SVN stammen
, dann schalten Sie den aktuellen Zweig auf die SVN-Seite (die zu "unserer" wird)
, bevor Sie die Commits erneut abspielen, an denen Sie gearbeitet haben (die aber jetzt während dieser Rebase "ihnen" gehören)
quelle
git rebase
Manpage völlig übersehen haben ...