TL; DR;
Untuk meringkas (Seperti komentar Benubird ), ketika:
git checkout A
git rebase B # rebase A on top of B
local
adalah B
(rebase ke ),
remote
adalah A
Dan:
git checkout A
git merge B # merge B into A
local
adalah A
(bergabung ke ),
remote
adalah B
Saklar rebase ours
(cabang saat ini sebelum rebase dimulai) dan theirs
(cabang di atasnya Anda ingin rebase).
kutschkem menunjukkan bahwa, dalam konteks GUI mergetool :
- referensi lokal komitmen sebagian rebased : "
ours
" (cabang hulu)
- remote merujuk pada perubahan yang masuk : "
theirs
" - cabang saat ini sebelum rebase.
Lihat ilustrasi di bagian terakhir dari jawaban ini.
Pembalikan saat rebase
Kebingungan mungkin terkait dengan inversi ours
dan theirs
selama rebase .
(ekstrak yang relevan)
git rebase
halaman manual :
Perhatikan bahwa gabungan rebase berfungsi dengan memutar ulang setiap komit dari cabang kerja di atas <upstream>
cabang.
Karena itu, ketika konflik gabungan terjadi:
- sisi yang dilaporkan sebagai '
ours
' adalah seri rebased sejauh ini, dimulai dengan <upstream>
,
- dan '
theirs
' adalah cabang kerja. Dengan kata lain, sisi-sisinya ditukar.
Pembalikan diilustrasikan
Sedang digabung
x--x--x--x--x(*) <- current branch B ('*'=HEAD)
\
\
\--y--y--y <- other branch to merge
, kami tidak mengubah cabang saat ini 'B', jadi apa yang kami miliki masih apa yang sedang kami kerjakan (dan kami bergabung dari cabang lain)
x--x--x--x--x---------o(*) MERGE, still on branch B
\ ^ /
\ ours /
\ /
--y--y--y--/
^
their
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)
x--x--x--x--x(*) <- current branch B
\
\
\--y--y--y <- upstream branch
A git rebase upstream
akan pertama-tama mengubah HEAD
B ke cabang hulu HEAD
(oleh karena itu pergantian 'milik kami' dan 'milik mereka' dibandingkan dengan cabang kerja "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 'baru' kami:
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
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 :
Bagi saya, pertanyaannya masih ada, yaitu "lokal" dan siapa yang "jauh" (karena istilah "milik kita" dan "milik mereka" tidak digunakan ketika rebasing di git, merujuk pada mereka sepertinya membuat jawaban lebih membingungkan) .
GUI git mergetool
kutschkem menambahkan, dan memang demikian:
Saat menyelesaikan konflik, git akan mengatakan sesuatu seperti:
local: modified file and remote: modified file.
Saya cukup yakin pertanyaannya mengarah pada definisi lokal dan jarak jauh pada saat ini. Pada titik itu, menurut saya dari pengalaman saya bahwa:
- referensi lokal komitmen sebagian rebased : "
ours
" (cabang hulu)
- remote merujuk pada perubahan yang masuk : "
theirs
" - cabang saat ini sebelum rebase.
git mergetool
memang menyebutkan 'lokal' dan 'jauh' :
Merging:
f.txt
Normal merge conflict for 'f.txt':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (kdiff3):
Sebagai contoh, KDiff3 akan menampilkan resolusi gabungan seperti :
Dan berbaur akan menampilkannya juga :
Sama untuk VimDiff , yang menampilkan :
Aktifkan Vimdiff sebagai mergetool dengan git mergetool -t gvimdiff. Versi terbaru dari Git memanggil Vimdiff dengan tata letak jendela berikut:
+--------------------------------+
| LOCAL | BASE | REMOTE |
+--------------------------------+
| MERGED |
+--------------------------------+
LOCAL
:
File sementara yang berisi konten file di cabang saat ini.
BASE
:
File sementara yang berisi basis umum untuk penggabungan.
REMOTE
:
File sementara yang berisi konten file yang akan digabungkan.
MERGED
:
File yang mengandung penanda konflik.
Git telah melakukan resolusi konflik otomatis sebanyak mungkin dan keadaan file ini adalah kombinasi dari keduanya LOCAL
dan REMOTE
dengan penanda konflik yang mengelilingi apapun yang tidak dapat diselesaikan oleh Git sendiri.
The mergetool
harus menulis hasil resolusi ke berkas ini.