Itu sepertinya konsisten dengan apa yang dilakukan rebase.
git svn rebase
akan mengambil revisi dari induk SVN dari HEAD saat ini dan mengubah peringkat pekerjaan saat ini (tidak terikat ke SVN) terhadapnya.
git rebase
tidak menyebutkan:
Perhatikan bahwa rebase merge bekerja dengan mengulang setiap komit dari cabang yang bekerja di atas <upstream>
cabang.
Karena itu, saat konflik penggabungan terjadi:
- sisi yang dilaporkan sebagai milik kami adalah seri yang didasarkan sejauh ini, dimulai dengan
<upstream>
,
- dan mereka adalah cabang yang bekerja .
Dengan kata lain, sisi-sisinya bertukar .
git rebase memutar ulang setiap komit dari cabang yang bekerja di atas <upstream>
cabang.
Jika Anda menggabungkan kedua definisi tersebut:
- komit yang berasal dari SVN adalah yang di atasnya komit Git lokal diputar ulang. Mereka adalah bagian dari "rangkaian berbasis ulang sejauh ini", dan dirujuk sebagai "milik kami" (dalam kasus Anda,
test.txt
file dengan bar
konten)
- cabang yang berfungsi (berisi komit Git yang tidak diketahui SVN, dalam kasus Anda,
test.txt
file dengan baz
konten) adalah "milik mereka", dan setiap komit Git lokal tersebut sedang diputar ulang.
Dengan kata lain, SVN atau tidak:
<upstream>
cabang " " (di atasnya ada yang diputar ulang, dan yang merupakan bagian dari komitmen yang didasarkan sejauh ini ") adalah" milik kami ".
- apa yang diputar ulang (cabang yang berfungsi) adalah " milik mereka ".
Tip mnemonik yang bagus dari CommaToast :
apapun yang HEAD tunjuk adalah "milik kita"
(dan hal pertama yang git rebase upstream
dilakukan a untuk memeriksa upstream
cabang di atasnya yang ingin Anda rebase: HEAD merujuk ke upstream
- ours
sekarang.)
Kebingungan kemungkinan datang dari peran cabang yang bekerja dalam sebuah karya klasik git merge
.
Saat Anda menggabungkan:
- "cabang yang berfungsi" adalah yang berisi apa yang "sejauh ini digabungkan", dan dianggap sebagai "milik kami",
- sedangkan komit lainnya mewakili apa yang sedang - tidak diputar ulang tetapi - bergabung di atas cabang yang berfungsi, dan dianggap sebagai "mereka".
Seperti yang git rebase
disebutkan di halaman manual, penggabungan selama rebase berarti sisi tersebut ditukar.
Cara lain untuk mengatakan hal yang sama adalah dengan mempertimbangkan bahwa:
- apa yang kami miliki di cabang yang diperiksa adalah ' milik kami ',
- apa yang kami miliki (dan sedang digabungkan atau diputar ulang) adalah ' milik mereka '.
Saat digabungkan :
x--x--x--x--x(*) <- current branch B ('*'=HEAD)
\
\
\--y--y--y <- other branch to merge
, kami tidak mengubah cabang 'B' saat ini, jadi apa yang kami miliki masih apa yang sedang kami kerjakan (dan kami menggabungkan dari cabang lain)
x--x--x--x--x---------o(*) MERGE, still on branch B
\ ^ /
\ ours /
\ /
--y--y--y--/
^
their
Tapi pada rebase , kami beralih sisi karena hal pertama yang dilakukan rebase adalah melakukan checkout cabang upstream! (untuk memutar ulang komit saat ini di atasnya)
x--x--x--x--x(*) <- current branch B
\
\
\--y--y--y <- upstream branch
A git rebase upstream
pertama-tama akan mengubah HEAD
B ke cabang hulu HEAD
(karena itu beralih dari 'milik kita' dan 'milik mereka' dibandingkan dengan cabang yang bekerja "saat ini" sebelumnya.)
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
, dan kemudian rebase akan memutar ulang komitmen 'mereka' pada cabang B 'kami' yang baru:
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
Satu-satunya langkah tambahan git svn rebase
adalah bahwa "pengambilan" svn dilakukan pertama kali di cabang jarak jauh Git yang mewakili komitmen SVN.
Anda awalnya:
x--x--x--x--x(*) <- current branch B, "ours" for now.
\
\
\--y--y--y <- SVN tracking branch, "theirs for now"
, Anda terlebih dahulu memperbarui cabang pelacakan SVN dengan komitmen baru yang berasal dari SVN
x--x--x--x--x(*) <- current branch B, still "ours", not for long
\
\
\--y--y--y--y'--y' <- SVN tracking branch updated
, lalu Anda mengalihkan cabang saat ini ke sisi SVN (yang menjadi "milik kami")
x--x--x--x--x <- for "B", now "their" during the rebase
\
\
\--y--y--y--y'--y'(*) <- SVN tracking branch updated, and branch B:
now "ours" (this is "what we now have")
, sebelum memutar ulang komit yang sebelumnya Anda kerjakan (tapi yang sekarang menjadi "milik mereka" selama rebase itu)
x--x..x..x..x <- old "theirs" commits, now "ghosts", available through reflogs
\
\
\--y--y--y--y'--y'--x'--x'--x'(*) <- branch B with HEAD updated ("ours")
^
|
upstream SVN tracking branch