Saya curiga Anda bingung di sini karena pada dasarnya membingungkan. Untuk membuat segalanya lebih buruk, semua barang kita / mereka berganti peran (menjadi mundur) ketika Anda melakukan rebase.
Pada akhirnya, selama git merge
, yang "kita" cabang mengacu pada cabang Anda penggabungan ke :
git checkout merge-into-ours
dan cabang "milik mereka" merujuk ke cabang (tunggal) yang Anda gabungkan:
git merge from-theirs
dan di sini "kita" dan "mereka" cukup masuk akal, karena meskipun "mereka" mungkin Anda pula, "mereka" adalah bukan yang Anda berada di saat Anda berlari git merge
.
Meskipun menggunakan nama cabang yang sebenarnya mungkin sangat keren, itu berantakan dalam kasus yang lebih kompleks. Misalnya, alih-alih yang di atas, Anda dapat melakukan:
git checkout ours
git merge 1234567
tempat Anda bergabung dengan ID komit mentah. Lebih buruk lagi, Anda bahkan dapat melakukan ini:
git checkout 7777777 # detach HEAD
git merge 1234567 # do a test merge
dalam hal ini tidak ada nama cabang yang terlibat!
Saya pikir ini sedikit membantu di sini, tetapi pada kenyataannya, dalam gitrevisions
sintaksis , Anda bisa merujuk ke jalur individual dalam indeks dengan nomor, selama penggabungan yang bertentangan
git show :1:README
git show :2:README
git show :3:README
Tahap # 1 adalah leluhur umum dari file, tahap # 2 adalah versi cabang-target, dan tahap # 3 adalah versi yang Anda gabungkan.
Alasan gagasan "milik kami" dan "milik mereka" dipertukarkan rebase
adalah karena rebase bekerja dengan melakukan serangkaian pemetik ceri, ke cabang anonim (mode HEAD yang terlepas). Cabang target adalah cabang anonim, dan cabang gabungan dari adalah cabang asli Anda (pra-rebase): jadi "--kami" berarti yang dibuat oleh salah satu rebase sementara "--theirs" berarti "cabang kami direstrukturisasi" .
Adapun entri gitattributes: itu bisa memiliki efek: "milik kita" benar-benar berarti "gunakan tahap # 2" secara internal. Tetapi seperti yang Anda perhatikan, itu sebenarnya tidak ada pada saat itu, jadi seharusnya tidak memiliki efek di sini ... well, tidak kecuali Anda menyalinnya ke pohon kerja sebelum Anda mulai.
Juga, omong-omong, ini berlaku untuk semua penggunaan milik kami dan milik mereka, tetapi beberapa berada pada tingkat file keseluruhan ( -s ours
untuk strategi penggabungan; git checkout --ours
selama konflik penggabungan) dan beberapa menggunakan sepotong demi sepotong ( -X ours
atau -X theirs
selama -s recursive
menggabungkan). Yang mungkin tidak membantu dengan kebingungan.
Tapi saya tidak pernah menemukan nama yang lebih baik untuk ini. Dan: lihat jawaban VonC untuk pertanyaan lain, di mana git mergetool
memperkenalkan lebih banyak nama untuk ini, menyebut mereka "lokal" dan "jauh"!
' Milik kita ' dalam Git mengacu pada cabang kerja asli yang memiliki bagian otoritatif / kanonik dari sejarah git.
' Milik mereka ' mengacu pada versi yang menyimpan pekerjaan untuk diubah kembali (perubahan harus diputar ulang ke cabang saat ini).
Ini mungkin tampak ditukar dengan orang-orang yang tidak sadar bahwa melakukan rebasing (mis.
git rebase
) Sebenarnya menahan pekerjaan Anda (yang adalah milik mereka ) untuk memutar ulang ke kanonik / sejarah utama yang menjadi milik kita , karena kita rebasing kami berubah karena pekerjaan pihak ketiga.Dokumentasi untuk
git-checkout
selanjutnya diklarifikasi dalam Git> = 2.5.1 sesuaif303016
komit :Untuk
git-merge
itu jelaskan dengan cara berikut:Lebih jauh lagi, di sini dijelaskan cara menggunakannya:
Jadi kadang-kadang bisa membingungkan, misalnya:
git pull origin master
di mana-Xours
lokal kami,-Xtheirs
adalah cabang (jarak jauh) merekagit pull origin master -r
di mana-Xours
milik mereka (jarak jauh),-Xtheirs
milik kitaJadi contoh ke-2 berlawanan dengan yang pertama, karena kami rebasing cabang kami di atas yang jauh, jadi titik awal kami adalah yang jauh, dan perubahan kami diperlakukan sebagai eksternal.
Mirip untuk
git merge
strategi (-X ours
dan-X theirs
).sumber
git merge
, tetapigit pull
dangit checkout
sebagai contoh. Jika Anda ingin menggunakan parameter ini dengangit merge
, Anda harus menggunakan-X ours
. Anda masih dapat menggunakan--ours
sintaks untukgit checkout
. Saya sudah mengklarifikasi jawabannya lebih jauh.Saya tahu ini telah dijawab, tetapi masalah ini membuat saya bingung berkali-kali saya membuat situs web referensi kecil untuk membantu saya mengingat: https://nitaym.github.io/ourstheirs/
Berikut adalah dasar-dasarnya:
Gabung:
Jika Anda ingin memilih versi di
master
:Jika Anda ingin memilih versi di
feature
:Rebases:
Jika Anda ingin memilih versi di
master
:Jika Anda ingin memilih versi di
feature
:(Ini untuk file lengkap, tentu saja)
sumber
Jadi jika Anda menggunakan rilis cabang / 2.5 dan Anda menggabungkan fitur cabang / tombol-baru ke dalamnya, maka konten seperti yang ditemukan di rilis / 2.5 adalah apa yang kami rujuk dan konten seperti yang ditemukan di fitur / tombol-baru adalah apa yang mereka rujuk untuk. Selama aksi penggabungan, ini cukup lurus ke depan.
Satu-satunya masalah yang membuat kebanyakan orang jatuh hati adalah kasus rebase . Jika Anda melakukan re-base alih-alih penggabungan normal, peran tersebut ditukar. Bagaimana dengan itu? Ya, itu hanya disebabkan oleh cara rebasing bekerja. Pikirkan rebase untuk bekerja seperti itu:
Tentu saja, itu tidak benar-benar apa yang terjadi tetapi itu adalah model pikiran yang baik untuk saya. Dan jika Anda melihat 2 dan 3, Anda akan mengerti mengapa peran tersebut dipertukarkan sekarang. Mulai 2, cabang Anda saat ini adalah cabang dari server tanpa ada perubahan, jadi ini milik kami (cabang tempat Anda berada). Perubahan yang Anda buat sekarang berada di cabang berbeda yang bukan milik Anda saat ini ( BranchX ) dan dengan demikian perubahan ini (meskipun perubahan yang Anda buat) adalah milik mereka (cabang lain yang digunakan dalam tindakan Anda).
Itu berarti jika Anda bergabung dan Anda ingin perubahan Anda selalu menang, Anda akan memberitahu git untuk selalu memilih "kita" tetapi jika Anda rebase dan Anda ingin semua perubahan Anda selalu menang, Anda memberi tahu git untuk selalu memilih "milik mereka".
sumber
Saya tahu itu tidak menjelaskan artinya tetapi saya telah membuat diri saya sedikit gambar, sebagai referensi untuk mengingatkan yang akan digunakan:
Semoga ini bisa membantu!
PS - Beri tanda centang juga ke tautan dalam jawaban Nitay 🙂
sumber
Saya akan memposting memo saya di sini, karena saya harus kembali ke sini lagi dan lagi.
SKENARIO 1. Pengembang normal: Anda adalah pengembang yang tidak dapat bergabung
master
dan harus bermain denganfeature
cabang saja.Kasus 1: tuan adalah raja. Anda ingin menyegarkan
feature
cabang Anda (= rebase tomaster
), karenamaster
berisi pembaruan dependensi baru dan Anda ingin menimpa perubahan sederhana Anda.Kasus 2: Anda adalah raja. Anda ingin rebase
feature
cabang Anda kemaster
perubahan. Tetapi Anda melakukan lebih dari yang dimiliki kolega Anda dan ingin menggunakan perubahan Anda sendiri dalam prioritas.PENTING: Seperti yang Anda lihat, pengembang normal harus memilih
rebase
dan mengulanginya setiap pagi seperti latihan / kopi.SKENARIO 2. Penggabungan-sensei: Anda adalah pemimpin tim dan ingin menggabungkan cabang lain dan mendorong hasil gabungan langsung ke master.
master
adalah cabang yang akan Anda ubah.Kasus 1: master adalah raja Anda ingin menggabungkan cabang pihak ketiga, tetapi
master
merupakan prioritas.feature
adalah cabang yang senior Anda lakukan.Kasus 2: perubahan baru adalah raja Ketika pengembang senior Anda merilis yang keren
feature
dan Anda ingin menimpa yang lama dimaster
cabang.INGAT: Untuk mengingat di tengah malam yang satu untuk memilih:
master
adalahours
SELALU. Dantheirs
itufeature
yang mereka lakukan.sumber
Dari
git checkout
penggunaan:Saat menyelesaikan konflik gabungan, Anda bisa melakukannya
git checkout --theirs some_file
, dangit checkout --ours some_file
untuk mereset file ke versi saat ini dan versi yang masuk masing-masing.Jika sudah selesai
git checkout --ours some_file
ataugit checkout --theirs some_file
ingin mengatur ulang file ke versi penggabungan 3 arah file, Anda bisa melakukannyagit checkout --merge some_file
.sumber