Rumah > Artikel > alat pembangunan > Apakah gabungan dalam git
Dalam git, merge bermaksud "merge". Perintah ini digunakan untuk menggabungkan dua atau lebih sejarah pembangunan bersama-sama; bergabung dari satu cabang ke cabang yang lain.
Persekitaran pengendalian tutorial ini: sistem Windows 7, versi Git 2.30.0, komputer Dell G3.
Git-merge ialah arahan yang sering digunakan dalam Git Ramai orang berpendapat bahawa git merge adalah perkara yang sangat menyusahkan. anda akan menghadapi masalah kehilangan kod, yang akan membuatkan anda menghindar daripada git. Artikel ini menyediakan pengenalan yang lengkap dan terperinci kepada arahan git-merge berdasarkan Git 2.8.2, terutamanya mengenai masalah kehilangan kod yang disebabkan oleh penggabungan silang Saya memberikan cadangan saya sendiri pada akhir artikel, dengan harapan dapat membantu pengguna git . Kandungan yang diperkenalkan dalam artikel ini adalah berdasarkan Git 2.8.2
Perintah git-merge ialah operasi yang digunakan untuk menggabungkan dua atau lebih sejarah pembangunan bersama-sama Ia juga biasanya boleh ditulis sebagai: git merge .
Dalam arahan git-merge, terdapat tiga parameter berikut:
git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit] [-s <strategy>] [-X <strategy-option>] [-S[<keyid>]] [--[no-]rerere-autoupdate] [-m <msg>] [<commit>...]</commit></msg></keyid></strategy-option></strategy>
git merge <msg> HEAD <commit>...</commit></msg>
git merge --abort
Arahan git-merge digunakan Gabungkan operasi daripada komit yang ditentukan ke cawangan semasa.
Nota: Komit yang ditentukan di sini merujuk kepada bermula daripada nod komit sejarah ini sehingga pemisahan semasa.
Arahan git-merge mempunyai dua kegunaan berikut:
Anggapkan bahawa nod sejarah berikut wujud, dan cawangan semasa ialah "master":
Kemudian perintah git merge topic
akan menggantikan semula nod (iaitu nod A B C cawangan topik) yang dipisahkan selepas nod biasa (nod E) pada cawangan induk cawangan induk, sehingga nod komit semasa (nod C) cawangan topik, dan di bahagian atas cawangan induk. Dan buat nod baharu di sepanjang cawangan induk dan cawangan topik untuk merekodkan hasil cantuman Nod ini membawa maklumat pengguna yang menerangkan perubahan cantuman.
Iaitu, nod H dalam rajah di bawah, nod C dan nod G ialah kedua-dua nod induk bagi nod H.
git merge <msg> HEAD <commit>...</commit></msg>
Arahan Arahan ini wujud atas sebab sejarah dan tidak seharusnya digunakan dalam versi baharu, sebaliknya gunakan git merge -m <msg> <commit>....</commit></msg>
Gantikan
git merge --abort
ArahanArahan ini hanya digunakan apabila konflik terhasil selepas digabungkan. git merge --abort
Akan meninggalkan proses penggabungan dan cuba membina semula keadaan pra-gabungan. Walau bagaimanapun, jika terdapat fail yang tidak terikat apabila penggabungan bermula, git merge --abort
dalam beberapa kes, keadaan pragabungan tidak akan dapat dihasilkan semula. (Terutama apabila fail yang tidak terikat ini akan diubah suai semasa proses penggabungan)
Amaran: Menjalankan
git-merge
dengan sejumlah besar fail yang tidak terikat dengan mudah boleh menyebabkan anda menghadapi masalah, yang akan Menyukarkan anda untuk berundur daripada konflik. Oleh itu, adalah sangat tidak digalakkan untuk mempunyai fail yang tidak terikat apabila menggunakangit-merge
Adalah disyorkan untuk menggunakan perintahgit-stash
untuk menyimpan sementara fail yang tidak komited ini, dan menggunakangit stash pop
untuk memulihkan fail yang tidak komited ini selepas menyelesaikan konflik.
Bahagian ini digunakan untuk memperkenalkan parameter yang digunakan dalam perintah git-merge
--commit
dan --no-commit
--commit
Parameter menyebabkan nod komit hasil gabungan dijana selepas digabungkan. Parameter ini boleh digantikan --no-commit
. Parameter --no-commit
menyebabkan cantuman tidak diserahkan secara automatik untuk mengelakkan cantuman daripada gagal, memberikan pengguna peluang untuk menyemak dan mengubah suai hasil cantuman sebelum penyerahan.
--edit
dan -e
dan --no-edit
--edit
dan -e
digunakan untuk memanggil editor untuk mengedit selanjutnya maklumat gabungan yang dijana secara automatik sebelum gabungan berjaya atau komited. Oleh itu, pengguna boleh mentafsir dan menilai dengan lebih lanjut hasil penggabungan itu. Parameter --no-edit
boleh digunakan untuk menerima maklumat yang digabungkan secara automatik (ini biasanya tidak digalakkan).
Jika anda telah memberikan parameter
-m
semasa menggabungkan (diterangkan di bawah), ia masih berguna untuk menggunakan--edit
(atau-e
), yang akan mengedit lagi-m
dalam editor Apa yang disertakan .
Versi lama nod mungkin tidak membenarkan pengguna mengedit maklumat log gabungan.
--ff
Arahan --ff
merujuk kepada arahan ke hadapan pantas. Apabila menggabungkan menggunakan mod ke hadapan pantas, nod komit baharu tidak akan dibuat. Secara lalai, git-merge
menggunakan mod ke hadapan pantas.
Untuk penjelasan terperinci tentang mod ke hadapan pantas, sila lihat artikel saya yang lain: bahagian "Perihal ke hadapan pantas" bagi model cawangan Git yang berjaya.
--no-ff
ArahanBuat nod cantum baharu walaupun mod maju pantas tersedia. Ini ialah gelagat lalai apabila git merge
menggabungkan teg.
--ff-only
ArahanMelainkan nod HEAD semasa telah dikemas kini (kemas kini menghala ke nod terkini) atau boleh digabungkan menggunakan mod ke hadapan pantas, jika tidak, gabungan akan ditolak dan mengembalikan status kegagalan.
--log[=<n>]</n>
dan --no-log
--log[=<n>]</n>
akan mengandungi maklumat log sehingga n nod komit digabungkan sebagai tambahan kepada nama cawangan apabila menggabungkan komit. --no-log
tidak menyenaraikan maklumat ini.
--stat
, -n
, --no-stat
--stat
akan memaparkan status perbezaan fail pada penghujung hasil gabungan. Status perbezaan fail juga boleh dikonfigurasikan dalam merge.stat dalam fail konfigurasi git.
Sebaliknya, parameter -n
, --no-stat
tidak akan memaparkan maklumat ini.
--squash
dan --no-squash
--squash
Apabila gabungan berlaku, dari nod cawangan lain selepas nod nenek moyang sepunya cawangan semasa dan cawangan lain, sepanjang jalan ke cawangan lain Nod atas akan dimampatkan bersama, dan pengguna boleh menyerahkannya selepas semakan untuk menjana nod baharu.
Nota 1: Parameter ini bercanggah dengan
--no-ff
Nota 2: Hasil penggunaan parameter ini adalah serupa dengan menyerahkan nod baharu pada arus cawangan. Parameter ini sangat berguna dalam beberapa kes, seperti semasa menggunakan Git Flow (tentang Git Flow, sila rujuk: Model cawangan Git yang berjaya Apabila cawangan fungsi membangunkan keperluan fungsian, pembangun boleh menyerahkan sejumlah besar secara tempatan). . Dan nod yang tidak bermakna, apabila ia perlu digabungkan ke dalam cawangan pembangunan, anda mungkin hanya perlu menggunakan nod baharu untuk mewakili kandungan pengubahsuaian senarai panjang nod ini Pada masa ini, perintah
--squash
akan digunakan . Di samping itu, jika berbilang penyerahan cawangan ciri tidak remeh tetapi bermakna, menggunakan perintah--no-ff
adalah lebih sesuai.--no-squash
melakukan sebaliknya.
-s <strategy></strategy>
dan --strategy=<strategy></strategy>
-s <strategy></strategy>
dan --strategy=<strategy></strategy>
digunakan untuk menentukan strategi gabungan. Secara lalai, jika parameter ini tidak ditentukan, git akan menggunakan strategi gabungan lalai mengikut syarat berikut:
-X <option></option>
dan --strategy-option=<option></option>
nyatakan parameter khusus strategi ini apabila -s <strategy></strategy>
(diterangkan di bawah).
--verify-signatures
, --no-verify-signatures
digunakan untuk mengesahkan sama ada nod yang digabungkan mempunyai tandatangan GPG dan mengabaikan nod tersebut tanpa pengesahan tandatangan GPG dalam gabungan.
(Petikan berikut diambil daripada artikel yang dicetak semula. Memandangkan saya tidak menemui pengarang asal, saya tidak dapat memberikan maklumat pengarang asal dan pautan ke artikel asal. Jika terdapat sebarang pelanggaran, sila maklumkan kepada saya melalui peribadi mesej atau komen, dan saya akan memadamkan petikan berikut.)
GPG ialah perisian penyulitan Anda boleh menggunakan kunci awam yang dijana oleh GPG untuk menyebarkan fail dan kod anda dengan selamat di Internet.
Kenapa awak kata selamat? Ambil repo yang dibangunkan oleh Google sebagai contoh Repo menggunakan pengesahan GPG Setiap teg pencapaian mempunyai pengesahan penyulitan GPG. Jika anda ingin membuat perubahan pada peristiwa penting v1.12.3, padamkan teg selepas pengubahsuaian. buat teg dengan nama yang sama untuk menunjuk ke titik pengubahsuaian anda. Walau bagaimanapun, apabila anda mengklon semula projek anda yang diubah suai, anda akan mendapati bahawa perubahan anda pada teg pencapaian ini tidak dikenali dan pengesahan gagal, menyebabkan pengubahsuaian anda tidak dilaksanakan seperti biasa di sini. Ini ialah peranan pengesahan GPG, yang memastikan pencapaian yang ditetapkan oleh pengarang projek (pemegang kunci persendirian) tidak boleh diubah suai oleh orang lain. Kemudian, boleh dikatakan kod penulis selamat disebarkan.
Mengapa ada keperluan sedemikian? Daripada pembangunan kepada keluaran kepada lelaran kemas kini projek yang kemudian, pasti akan terdapat beberapa versi dan versi pembangunan yang stabil (terdapat faktor ketidakstabilan). Sebagai pemula dan pemegang projek, mereka mempunyai hak untuk menentukan versi stabil yang mereka (mereka) kenali Versi stabil ini tidak akan membenarkan pembangun lain membuat perubahan. Ambil projek repo Google sebagai contoh Pemilik projek mentakrifkan titik A dalam proses pembangunan projek sebagai versi stabil v1.12.3 Kemudian selepas pengguna memuat turun versi v1.12.3, mereka pasti akan menggunakan projek dan produk yang dihasilkan oleh titik A. Walaupun pembangun lain boleh menentukan semula v1.12.3 secara tempatan dan menentukannya pada titik B yang diubah suai mereka, apabila versi yang diubah suai akhirnya digunakan oleh pengguna, akan ada masalah bahawa pengesahan tandatangan GPG gagal, iaitu, ini adalah The pengubahsuaian tidak akan berkuat kuasa.
—summary
, --no-summary
dan --stat
adalah serupa dengan --no-stat
dan akan dialih keluar dalam versi akan datang.
-q
dan --quiet
beroperasi secara senyap dan tidak memaparkan maklumat kemajuan gabungan.
-v
dan --verbose
memaparkan maklumat hasil cantuman terperinci.
--progress
dan --no-progress
bertukar sama ada untuk memaparkan maklumat kemajuan gabungan. Jika kedua-duanya tidak dinyatakan, mesej akan dipaparkan pada terminal yang disambungkan apabila ralat standard berlaku. Ambil perhatian bahawa tidak semua strategi gabungan menyokong pelaporan kemajuan.
-S[<keyid>]</keyid>
dan --gpg-sign[=<keyid>]</keyid>
Tandatangan GPG.
-m <msg></msg>
Tetapkan maklumat komit yang digunakan semasa mencipta nod gabungan.
Jika parameter --log
ditentukan, log pendek nod komit akan dilampirkan pada mesej komit.
--[no-]rerere-autoupdate
rerere bermaksud menggunakan semula resolusi yang direkodkan, menggunakan semula penyelesaian yang direkodkan. Ia membolehkan anda meminta Git mengingati cara menyelesaikan konflik blok, supaya apabila anda melihat konflik yang sama, Git boleh menyelesaikannya secara automatik untuk anda.
--abort
Tinggalkan proses pengendalian konflik gabungan semasa dan cuba bina semula keadaan pra-gabungan.
Apabila menggabungkan cawangan luar, anda harus memastikan cawangan anda sendiri bersih, jika tidak, akan berlaku konflik gabungan Ia akan menyebabkan banyak masalah.
Untuk mengelak daripada merekodkan fail yang tidak berkaitan semasa penggabungan komit, arahan git-pull dan git-merge akan berhenti jika terdapat sebarang fail yang tidak terikat didaftarkan dalam nod HEAD yang ditunjukkan oleh indeks.
Biasanya pencantuman cawangan akan menghasilkan nod cantuman, tetapi terdapat pengecualian dalam beberapa kes khas. Sebagai contoh, apabila memanggil arahan git pull untuk mengemas kini kod jauh, jika cawangan tempatan tidak mempunyai sebarang komit, tidak perlu menjana nod gabungan. Dalam kes ini, nod gabungan tidak akan dijana dan HEAD menghala terus ke kod teratas yang dikemas kini Strategi gabungan ini ialah gabungan ke hadapan.
Selain mod cantum ke hadapan pantas yang disebutkan di atas, cawangan yang digabungkan akan diikat pada cawangan semasa melalui nod cantuman Nod cantum juga akan Mempunyai bahagian atas nod cawangan semasa sebelum bergabung dan nod atas cawangan lain, kedua-duanya sebagai nod induk.
Versi yang digabungkan akan membuat perubahan dalam semua cawangan yang berkaitan dengan konsisten, termasuk nod komit, nod HEAD dan penunjuk indeks dan pepohon nod akan dikemas kini. Selagi fail dalam nod ini tidak bertindih, perubahan pada fail ini akan diubah suai dan dikemas kini dalam pepohon nod.
Jika perubahan ini tidak boleh digabungkan secara eksplisit, perkara berikut akan berlaku:
MERGE_HEAD
Penunjuk diletakkan di atas cawangan lain MERGE_HEAD
. Fail dalam pokok nod mengandungi hasil menjalankan program gabungan. Sebagai contoh, algoritma gabungan tiga hala boleh menyebabkan konflik. git merge --abort
Mengenai algoritma gabungan tiga hala:
Gabungan tiga hala Algoritma ialah cara untuk menyelesaikan konflik Apabila konflik berlaku, algoritma gabungan tiga hala akan memperoleh tiga nod: nod B konflik tempatan, nod C cawangan lain dan nenek moyang terdekat yang sama. nod A daripada nod B dan C. Algoritma gabungan tiga hala akan bergabung berdasarkan tiga nod ini. Proses khusus adalah untuk membandingkan nod B dan C dengan nod A. Jika fail dalam nod B dan C adalah sama dengan nod A, maka tidak akan berlaku konflik jika hanya satu daripada B atau C telah berubah berbanding dengan nod A, maka Fail akan menggunakan versi yang diubah; jika B dan C telah berubah berbanding dengan A, dan perubahannya tidak sama, maka anda perlu menggabungkannya secara manual jika B dan C telah berubah, dan perubahannya adalah sama , maka tidak akan ada konflik dan versi yang diubah akan diterima pakai secara automatik. Selepas penggabungan terakhir, nod D akan dihasilkan Nod D mempunyai dua nod induk, iaitu B dan C.
Apabila menggabungkan teg, Git sentiasa mencipta komit gabungan, walaupun mod maju pantas boleh digunakan. Templat maklumat penyerahan dipratetap kepada maklumat teg. Selain itu, jika teg ditandatangani, maklumat pengesanan tandatangan akan dilampirkan pada templat mesej komit.
Apabila konflik gabungan berlaku, bahagian itu akan diwakili oleh , <code>=======
dan . Bahagian sebelum
=======
ialah keadaan pada cawangan semasa, dan bahagian selepas =======
ialah situasi pada cawangan sebelah lagi.
Selepas melihat konflik, anda boleh memilih dua kaedah berikut:
git merge --abort
digunakan dalam kes ini. git add
untuk menambahkannya pada indeks selepas menyelesaikan konflik, dan kemudian gunakan git commit
untuk menjana nod gabungan. git mergetool
Alat cantuman visual akan dipanggil untuk mengendalikan cantuman yang bercanggah. git diff
Perbezaan tiga hala (algoritma perbandingan tiga hala yang digunakan dalam gabungan tiga hala) akan dipaparkan. git log --merge -p <path></path>
akan memaparkan perbezaan antara versi HEAD
dan versi MERGE_HEAD
. git show :1:文件名
memaparkan versi nenek moyang yang sama, git show :2:文件名
memaparkan versi HEAD cawangan semasa dan git show :3:文件名
memaparkan versi MERGE_HEAD
cawangan lain. Git boleh menentukan strategi gabungan dengan menambah parameter -s. Sesetengah strategi cantuman malah mempunyai pilihan parameternya sendiri Gunakan -X<option></option>
untuk menetapkan pilihan parameter strategi cantuman ini. (Jangan lupa bahawa penggabungan boleh berlaku dalam kedua-dua arahan git merge dan git pull, jadi strategi gabungan ini juga digunakan untuk git pull).
Hanya gunakan algoritma cantum tiga hala untuk menggabungkan nod atas dua cawangan (seperti cawangan semasa dan cawangan lain yang anda tarik ke bawah). Strategi cantuman ini mengikut algoritma cantuman tiga hala, di mana nod HEAD bagi dua cawangan dan nod anak biasa melakukan cantuman tiga hala.
Sudah tentu, apa yang benar-benar mengganggu kami ialah kes gabungan silang silang. Apa yang dipanggil penggabungan silang merujuk kepada keadaan di mana terdapat berbilang nod nenek moyang yang sama Contohnya, apabila dua cabang digabungkan, kemungkinan besar terdapat dua nod nenek moyang yang sama Pada masa ini, penggabungan tidak dapat dilakukan mengikut kepada algoritma gabungan tiga hala (kerana nod nenek moyang biasa tidak unik). Beginilah cara strategi penyelesaian menangani masalah cantum silang Sila rujuk "Kawalan Versi dengan Git" di sini:
4.2rekursifHanya cantumkan dua cabang menggunakan algoritma cantum tiga hala. Berbeza dengan penyelesaian, dalam kes cantuman silang, kaedah cantuman ini dipanggil secara rekursif Bermula dari nod yang berbeza dari dua cabang selepas nod nenek moyang yang sama, algoritma cantuman tiga hala dipanggil secara rekursif untuk bergabung. maka fail Gabungan tidak akan diteruskan lagi dan konflik akan dibuang terus fail lain tanpa konflik akan dilaksanakan sehingga nod atas. Selain itu, pendekatan ini dapat mengesan dan mengendalikan operasi yang melibatkan pengubahsuaian nama fail. Ini ialah tindakan gabungan lalai untuk git penggabungan dan penarikan kod.Dalam situasi cantum silang silang, di mana terdapat lebih daripada satu kemungkinan asas cantum, strategi penyelesaian berfungsi seperti ini: pilih salah satu asas cantum yang mungkin, dan harapkan yang terbaik Ini sebenarnya tidak seburuk itu . Seperti yang didengari bahawa pengguna telah mengusahakan bahagian yang berlainan dalam kes itu, Git mengesan bahawa ia menggabungkan semula beberapa perubahan yang sudah ada dan melangkau perubahan pendua, Atau, jika ini adalah sedikit perubahan yang menyebabkan konflik, sekurang-kurangnya konflik sepatutnya mudah untuk pembangun mengendalikan nod nenek moyang), strategi penyelesaian berfungsi seperti ini: pilih salah satu titik rujukan penggabungan yang mungkin dan harap ini adalah hasil terbaik penggabungan itu. Ini sebenarnya tidak seteruk yang didengari. Biasanya pengguna mengubah suai bahagian kod yang berlainan, dalam hal ini banyak konflik gabungan sebenarnya berlebihan dan berulang. Apabila menggunakan azam untuk bergabung, konflik yang dijana lebih mudah dikendalikan, dan terdapat sangat sedikit kes di mana kod sebenarnya akan hilang.
4.2.1 milik kami
4.2.2 kesabaran
4.2.3git merge-recursive
diff-algorithm=[patience|minimal|histogram|myers]
untuk menggunakan algoritma perbandingan yang berbeza. 4.2.4 git merge-recursive
,
ignore-space-change
ignore-all-space
Layani konflik ruang putih mengikut parameter yang ditentukan. ignore-space-at-eol
Jika versi pihak satu lagi hanya menambah perubahan pada ruang, maka versi kami sendiri akan digunakan apabila menggabungkan konflik
no-renames
subtree[=<path>]</path>
tidak berubah , supaya hasil yang digabungkan akan menjadi bahagian yang diubah dalam cawangan lain. Pembelajaran yang disyorkan: "Tutorial Git
"Atas ialah kandungan terperinci Apakah gabungan dalam git. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!