Ketika melakukan git rebase, saya sering mengalami kesulitan untuk mengetahui apa yang terjadi dengan 'lokal' dan 'remote' ketika menyelesaikan konflik. Terkadang saya memiliki kesan bahwa mereka bertukar sisi dari satu komit ke yang berikutnya.
Ini mungkin (pasti) karena saya masih belum mengerti dengan baik.
Saat rebasing, siapa yang 'lokal' dan siapa yang 'jauh'?
(Saya menggunakan P4Merge untuk menyelesaikan konflik)
git svn
', hanya untuk bagian 'git rebase
')Jawaban:
TL; DR;
Untuk meringkas (Seperti komentar Benubird ), ketika:
local
adalahB
(rebase ke ),remote
adalahA
Dan:
local
adalahA
(bergabung ke ),remote
adalahB
Saklar rebase
ours
(cabang saat ini sebelum rebase dimulai) dantheirs
(cabang di atasnya Anda ingin rebase).kutschkem menunjukkan bahwa, dalam konteks GUI mergetool :
ours
" (cabang hulu)theirs
" - cabang saat ini sebelum rebase.Lihat ilustrasi di bagian terakhir dari jawaban ini.
Pembalikan saat rebase
Kebingungan mungkin terkait dengan inversi
ours
dantheirs
selama rebase .(ekstrak yang relevan)
git rebase
halaman manual :Karena itu, ketika konflik gabungan terjadi:
ours
' adalah seri rebased sejauh ini, dimulai dengan<upstream>
,theirs
' adalah cabang kerja. Dengan kata lain, sisi-sisinya ditukar.Pembalikan diilustrasikan
Sedang digabung
, kami tidak mengubah cabang saat ini 'B', jadi apa yang kami miliki masih apa yang sedang kami kerjakan (dan kami bergabung dari cabang lain)
Pada rebase:
Tetapi pada rebase , kami beralih sisi karena hal pertama rebase lakukan adalah untuk checkout cabang hulu! (untuk memutar ulang komit saat ini di atasnya)
A
git rebase upstream
akan pertama-tama mengubahHEAD
B ke cabang huluHEAD
(oleh karena itu pergantian 'milik kami' dan 'milik mereka' dibandingkan dengan cabang kerja "saat ini" sebelumnya.), dan kemudian rebase akan memutar ulang komitmen 'mereka' pada cabang B 'baru' kami:
Catatan: gagasan "hulu" adalah kumpulan data referensial (semua repo atau, seperti di sini, cabang, yang dapat berupa cabang lokal ) dari mana data dibaca atau dari mana data baru ditambahkan / dibuat.
'
local
' dan 'remote
' vs. 'mine
' dan 'theirs
'Pandawood menambahkan dalam komentar :
GUI git mergetool
kutschkem menambahkan, dan memang demikian:
ours
" (cabang hulu)theirs
" - cabang saat ini sebelum rebase.git mergetool
memang menyebutkan 'lokal' dan 'jauh' :Sebagai contoh, KDiff3 akan menampilkan resolusi gabungan seperti :
Dan berbaur akan menampilkannya juga :
Sama untuk VimDiff , yang menampilkan :
sumber
git checkout A; git rebase B
lokal adalah B, jarak jauh adalah A. Yang saya perlu tahu ...git checkout A; git rebase B
lokal B, remote A . Jika sayacheckout A
maka saya saya sedang melihat file karena mereka ada diA
, bagaimana itu dengan cara apapun yang terpencil ? (Saya tidak mengatakan Benubird salah; Saya katakan git memiliki UX bodoh){branch A}
dan{branch B}
atau serupa.Garis bawah
git rebase
git bergabung
Dengan kata lain, LOCAL selalu yang asli, dan REMOTE selalu orang yang komitnya tidak ada di sana sebelumnya, karena mereka digabung atau di-rebase di atas
Buktikan itu!
Pasti. Jangan mengambil kata-kata saya untuk itu! Inilah eksperimen mudah yang dapat Anda lakukan untuk melihatnya sendiri.
Pertama, pastikan git mergetool Anda terkonfigurasi dengan benar. (Jika tidak, Anda mungkin tidak akan membaca pertanyaan ini.) Kemudian cari direktori untuk bekerja.
Siapkan repositori Anda:
Buat komit awal (dengan file kosong):
Buat komit di cabang yang bukan master:
Buat komit di cabang master:
Pada titik ini repositori Anda akan terlihat seperti ini:
Sekarang untuk tes rebase:
Sekarang tes penggabungan. Tutup mergetool Anda tanpa menyimpan perubahan apa pun, lalu batalkan rebase:
Kemudian:
Hasil Anda harus sama dengan apa yang ditampilkan di bagian atas.
sumber
local
/remote
aspek aku berjuang dengan jawaban saya sendiri di atas (yang lebih tentang inversiours
vstheirs
pula)Saya tidak mendapatkan masalah Anda dengan tepat tetapi saya pikir diagram berikut ini menyelesaikan masalah Anda. (Rebase: Repositori Jarak Jauh ---> Workspace)
Sumber: Alur Kerja Git Saya
sumber