Keduanya rebase
(dan cherry-pick
) dan merge
memiliki kelebihan dan kekurangan mereka. Saya berdebat di merge
sini, tapi ada baiknya memahami keduanya. (Lihat di sini untuk jawaban alternatif, argumentasi yang menyebutkan kasus mana rebase
yang lebih disukai.)
merge
lebih disukai daripada cherry-pick
dan rebase
karena beberapa alasan.
- Kekokohan . Identifikasi SHA1 dari commit mengidentifikasikannya tidak hanya dalam dan dari dirinya sendiri tetapi juga dalam kaitannya dengan semua komitmen lain yang mendahuluinya. Ini menawarkan Anda jaminan bahwa keadaan repositori pada SHA1 yang diberikan identik di semua klon. Tidak ada (secara teori) ada kemungkinan seseorang telah melakukan apa yang tampak seperti perubahan yang sama tetapi sebenarnya merusak atau membajak repositori Anda. Anda dapat memilih dalam perubahan individu dan kemungkinan besar sama, tetapi Anda tidak memiliki jaminan. (Sebagai masalah sekunder kecil, komit yang dipetik cherry akan memakan tempat ekstra jika orang lain mengambil cherry di komit yang sama lagi, karena keduanya akan hadir dalam sejarah bahkan jika copy pekerjaan Anda akhirnya identik.)
- Kemudahan penggunaan . Orang-orang cenderung memahami
merge
alur kerja dengan cukup mudah. rebase
cenderung dianggap lebih maju. Yang terbaik untuk memahami keduanya, tetapi orang-orang yang tidak ingin menjadi ahli dalam kontrol versi (yang menurut pengalaman saya telah menyertakan banyak rekan yang sangat pandai dalam apa yang mereka lakukan, tetapi tidak ingin menghabiskan waktu ekstra) memiliki lebih mudah waktu hanya menyatu.
Bahkan dengan alur kerja yang sangat banyak rebase
dan cherry-pick
masih berguna untuk kasus-kasus tertentu:
- Satu kelemahan
merge
adalah sejarah yang berantakan. rebase
mencegah serangkaian komitmen panjang yang tersebar di dalam sejarah Anda, seperti jika Anda secara berkala bergabung dalam perubahan orang lain. Itu sebenarnya tujuan utamanya saat saya menggunakannya. Apa yang Anda ingin sangat berhati-hati, tidak pernah rebase
kode yang Anda bagikan dengan repositori lain. Setelah komit dibuat, push
orang lain mungkin telah berkomitmen di atasnya, dan rebasing paling-paling akan menyebabkan jenis duplikasi yang dibahas di atas. Paling buruk Anda bisa berakhir dengan repositori yang sangat membingungkan dan kesalahan halus itu akan membawa Anda waktu lama untuk menemukan.
cherry-pick
berguna untuk mengambil sampel sebagian kecil perubahan dari cabang topik yang pada dasarnya Anda putuskan untuk dibuang, tetapi menyadari ada beberapa bagian berguna.
Adapun lebih suka menggabungkan banyak perubahan lebih dari satu: itu hanya jauh lebih sederhana. Sangat membosankan untuk melakukan penggabungan perubahan individu setelah Anda mulai memiliki banyak perubahan. Resolusi gabungan di git (dan di Mercurial, dan di Bazaar) sangat sangat baik. Anda tidak akan mengalami masalah besar dengan menggabungkan bahkan cabang yang panjang sebagian besar waktu. Saya biasanya menggabungkan semuanya sekaligus dan hanya jika saya mendapatkan banyak konflik saya membuat cadangan dan menjalankan kembali sedikit demi sedikit menggabungkan. Bahkan kemudian saya melakukannya dalam potongan besar. Sebagai contoh nyata, saya memiliki seorang kolega yang memiliki 3 bulan perubahan untuk digabung, dan mendapat sekitar 9000 konflik dalam 250000 baris kode-basis. Apa yang kami lakukan untuk memperbaikinya adalah melakukan penggabungan nilai satu bulan pada satu waktu: konflik tidak menumpuk secara linear, dan melakukannya dalam potongan-potongan menghasilkan jauhkurang dari 9000 konflik. Itu masih banyak pekerjaan, tetapi tidak sebanyak mencoba melakukan satu komitmen pada suatu waktu.
Menurut pendapat saya, memetik ceri harus disediakan untuk situasi langka di mana diperlukan, misalnya jika Anda melakukan beberapa perbaikan langsung pada cabang 'master' (trunk, cabang pengembangan utama) dan kemudian menyadari bahwa itu harus diterapkan juga untuk 'memelihara ' Anda harus mendasarkan alur kerja baik pada penggabungan, atau pada rebase (atau "git pull --rebase").
Harap ingat bahwa komit yang dipetik atau diubah kembali berbeda dari sudut pandang Git (memiliki pengidentifikasi SHA-1 yang berbeda) dari yang asli, jadi itu berbeda dari komit di repositori jarak jauh. (Rebase biasanya dapat menangani ini, karena memeriksa patch id yaitu perubahan, bukan komit).
Juga di git Anda dapat menggabungkan banyak cabang sekaligus: disebut gurita bergabung . Perhatikan bahwa penggabungan gurita harus berhasil tanpa konflik. Meskipun demikian mungkin bermanfaat.
HTH.
sumber
git blame
untuk menemukan komit yang memperkenalkan bug, dangit branch --contains
untuk menentukan di mana untuk menggabungkan cabang. Dijelaskan lebih rinci dalam posting iniRebase dan Cherry-pick adalah satu-satunya cara Anda menjaga riwayat komit tetap bersih. Hindari menggunakan penggabungan dan hindari membuat konflik penggabungan. Jika Anda menggunakan gerrit, atur satu proyek ke Gabung jika perlu dan satu proyek ke mode pilih-ceri dan coba sendiri.
sumber