Saya menggunakan git-svn dan saya perhatikan bahwa ketika saya harus memperbaiki konflik penggabungan setelah melakukan a git svn rebase
, arti dari --ours
dan --theirs
opsi untuk misalnyagit checkout
dibalik. Artinya, jika ada konflik dan saya ingin menyimpan versi yang berasal dari server SVN dan membuang perubahan yang saya buat secara lokal, saya harus menggunakan ours
, ketika saya mengharapkannya theirs
.
Mengapa demikian?
Contoh:
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"
Jawaban:
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:
<upstream>
,Dengan kata lain, sisi-sisinya bertukar .
Jika Anda menggabungkan kedua definisi tersebut:
test.txt
file denganbar
konten)test.txt
file denganbaz
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 ".Tip mnemonik yang bagus dari CommaToast :
(dan hal pertama yang
git rebase upstream
dilakukan a untuk memeriksaupstream
cabang di atasnya yang ingin Anda rebase: HEAD merujuk keupstream
-ours
sekarang.)Kebingungan kemungkinan datang dari peran cabang yang bekerja dalam sebuah karya klasik
git merge
.Saat Anda menggabungkan:
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:
Saat digabungkan :
, kami tidak mengubah cabang 'B' saat ini, jadi apa yang kami miliki masih apa yang sedang kami kerjakan (dan kami menggabungkan dari cabang lain)
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)
A
git rebase upstream
pertama-tama akan mengubahHEAD
B ke cabang huluHEAD
(karena itu beralih dari 'milik kita' dan 'milik mereka' dibandingkan dengan cabang yang bekerja "saat ini" sebelumnya.), dan kemudian rebase akan memutar ulang komitmen 'mereka' pada cabang B 'kami' yang baru:
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:
, Anda terlebih dahulu memperbarui cabang pelacakan SVN dengan komitmen baru yang berasal dari SVN
, lalu Anda mengalihkan cabang saat ini ke sisi SVN (yang menjadi "milik kami")
, sebelum memutar ulang komit yang sebelumnya Anda kerjakan (tapi yang sekarang menjadi "milik mereka" selama rebase itu)
sumber
git rebase
halaman manual ...