Saya baru-baru ini berdiskusi dengan orang-orang yang benar-benar menentang strategi rebase cabang fitur di GIT. Tampaknya menjadi pola yang diterima untuk menggunakan rebase hanya untuk cabang lokal, swasta tetapi tidak pernah menggunakannya ketika ada beberapa orang yang bekerja pada fitur & cabang yang sama, seperti yang disebut "Peraturan Emas untuk Rebasing" ini (seperti dijelaskan di sini: https : //www.atlassian.com/git/tutorials/merging-vs-rebasing/conceptual-overview )
Saya hanya terkejut ada konsensus tentang ini. Saya bekerja 3 tahun dengan strategi rebasing penuh, dengan sekitar 20 pengembang bekerja bersama dan coba tebak, itu berhasil.
Prosesnya pada dasarnya:
- Anda membuat cabang fitur Anda, sebut saja "fitur saya", dan dorong ke fitur asli / asli
- Orang lain mungkin memeriksanya dan mengerjakannya
- Anda kadang-kadang dapat rebase dari master: dari "myfeature", git rebase asal / master ; dan kemudian, ya, Anda harus mendorongnya.
- Apa yang terjadi ketika orang lain ingin mendorong komitmen mereka? Mereka hanya rebase itu: git rebase asal / myfeature . Jadi mereka sekarang maju cepat dan bisa mendorongnya tanpa memaksa.
Satu-satunya prinsip yang harus dihormati adalah bahwa cabang fitur dimiliki oleh seseorang . Pemilik adalah satu-satunya yang dapat mendorong-kekuatan.
Jadi, saya akui: begitu ada push-force, ada risiko untuk melakukan kesalahan. Itu benar. Tetapi ada juga banyak cara untuk pulih dari kesalahan, dan sungguh, dalam 3 tahun pembangunan, saya tidak melihat banyak kesalahan yang memaksa, dan ketika itu terjadi kami selalu menemukan cara untuk pulih dengan benar.
Jadi, mengapa "Aturan Emas Rebase" ini diterima secara luas? Apakah ada hal lain yang saya lewatkan? Saya mengerti itu membutuhkan minimum organisasi (setiap strategi membutuhkan beberapa organisasi), tetapi itu berhasil.
Jawaban:
Masalah dengan kekuatan mendorong bukan tentang cabang fitur dan master Anda, tetapi tentang mendorong master Anda ke master orang lain - bahwa sinkronisasi akan menimpa master mereka dengan perubahan Anda, mengabaikan apa pun yang ada di ujung mereka.
Mempertimbangkan bahaya ini, ada alasan mengapa Anda tidak boleh menggunakannya sama sekali kecuali ada sesuatu yang kacau dan Anda benar-benar perlu menggunakannya untuk melakukan perbaikan. Sistem SCM seharusnya tidak perlu dipaksa seperti ini, jika itu terjadi karena ada sesuatu yang sangat salah (dan pendekatan pertama saya dalam kasus tersebut adalah mengembalikan cadangan dan mengulangi operasi untuk menjaga sejarah tetap utuh).
Jadi mungkin pertanyaannya adalah mengapa Anda rebasing sama sekali? Untuk riwayat 'bersih' saat mengembalikan fitur ke master? Jika demikian, Anda membuang semua sejarah bagus tentang percabangan karena alasan gaya semata. Penggabungan fast-forward IMHO juga bukan praktik terbaik, Anda harus menyimpan semua riwayat sehingga Anda dapat melihat apa yang sebenarnya Anda lakukan, bukan versi yang disanitasi sesudahnya.
sumber
Rebase tidak penting, seperti yang Anda katakan sebagian besar kosmetik. Kadang-kadang itu jauh lebih sederhana daripada penggabungan. Sehingga dapat memiliki beberapa nilai "aktual", tetapi hanya "kadang-kadang"
Penggunaan rebase yang tidak tepat bisa mahal. Tidak mungkin kehilangan data jika Anda cukup tahu untuk tidak panik dan mencari prosedur pemulihan, tetapi "hei tidak ada yang mendorong untuk sementara waktu saya harus memperbaiki ..." itu tidak bagus. Juga tidak ada orang yang menghabiskan waktu untuk pemulihan dan pengujian penelitian ketika mereka bisa saja menambahkan fitur atau meremas bug (atau rumah dengan keluarga).
Dengan pertukaran itu hasil "sangat sedikit orang melakukan rebase dan dorongan paksa" tidak terlalu mengejutkan.
Beberapa alur kerja dapat mengurangi risiko, misalnya menguranginya menjadi "nol selama Anda ingat cabang mana yang Anda boleh paksakan dan mana Anda tidak bisa". Pada kenyataannya mereka mungkin cukup aman untuk menjustifikasi risiko, tetapi orang sering membuat pilihan berdasarkan cerita rakyat yang lebih besar. Kemudian lagi pada kenyataannya manfaatnya cukup kecil, jadi seberapa kecil risikonya sebenarnya?
sumber
Untuk menambahkan suara yang berbeda:
Ya, jika Anda bekerja seperti yang Anda gambarkan, tidak ada masalah dengan menggunakan
rebase
dan memaksakan diri. Poin kritisnya adalah: Anda memiliki perjanjian di tim Anda.Peringatan tentang
rebase
dan teman adalah untuk kasus di mana tidak ada perjanjian khusus. Biasanya, git melindungi Anda secara otomatis, dengan, misalnya, tidak memungkinkan dorongan yang tidak maju cepat. Menggunakanrebase
dan mendorong secara paksa mengabaikan keamanan itu. Tidak apa-apa jika Anda memiliki sesuatu yang lain di tempatnya.Di tim saya, kami juga kadang-kadang mengubah fitur cabang jika sejarah menjadi berantakan. Kami menghapus cabang lama dan membuat cabang baru dengan nama baru, atau kami hanya berkoordinasi secara informal (yang dimungkinkan karena kami adalah tim kecil, dan tidak ada orang lain yang bekerja di repositori kami).
Perhatikan bahwa proyek git sendiri juga melakukan hal yang serupa: Mereka memiliki cabang integrasi yang secara teratur diciptakan kembali, yang disebut "pu" ("pembaruan yang diusulkan"). Didokumentasikan bahwa cabang ini diciptakan kembali secara teratur, dan Anda tidak boleh mendasarkan pekerjaan baru di atasnya.
sumber
Alasan mengapa pengguna Git cenderung menghindari riwayat yang dapat diubah bersama adalah karena tidak ada penghindaran otomatis atau perbaikan masalah ini. Anda harus tahu apa yang Anda lakukan, dan Anda harus memperbaiki semuanya secara manual jika Anda mengacaukannya. Mengijinkan satu orang untuk melakukan pemaksaan paksa tidak intuitif dan bertentangan dengan desain Git yang didistribusikan. Apa yang terjadi jika orang itu pergi berlibur? Apakah ada orang lain yang sementara memiliki cabang? Bagaimana Anda tahu mereka tidak akan berkeliaran apa pun yang dilakukan pemilik aslinya? Dan di dunia open source, apa yang terjadi jika pemilik cabang berangsur-angsur menjauh dari komunitas, tanpa secara resmi pergi? Anda bisa kehilangan banyak waktu menunggu untuk menyerahkan kepemilikan cabang kepada orang lain.
Tetapi masalah sebenarnya adalah ini: Jika Anda mengacau dan tidak segera menyadarinya, komitmen lama pada akhirnya akan hilang setelah waktu yang cukup berlalu. Pada titik itu, masalahnya mungkin tidak dapat dipulihkan (atau setidaknya, berpotensi sangat sulit untuk dipulihkan, tergantung pada seperti apa kisah cadangan Anda - apakah Anda membuat cadangan salinan lama dari repositori Git Anda, yaitu, bukan hanya klon?).
Bandingkan ini dengan karya evolusi Changeset Mercurial (yang, saya harus perhatikan, belum selesai atau stabil). Setiap orang dapat membuat perubahan apa pun pada riwayat yang mereka sukai, asalkan perubahan tersebut tidak ditandai untuk umum. Amandemen dan rebase ini dapat didorong dan ditarik dengan impunitas total, tidak perlu untuk pemilik cabang. Tidak ada data yang pernah dihapus; seluruh repositori lokal hanya ditambahkan. Perubahan yang tidak lagi dibutuhkan ditandai sudah usang, tetapi disimpan tanpa batas waktu. Akhirnya, ketika Anda mengacaukan riwayat Anda (yang diperlakukan sebagai bagian normal dari alur kerja sehari-hari Anda), ada perintah bagus untuk membersihkannya untuk Anda secara otomatis. Ini adalah jenis yang diharapkan orang-orang sebelum mereka berkeliling memodifikasi sejarah bersama.
sumber