Saya selalu setuju dengan mantra Mercurial 1 , namun, sekarang Mercurial dibundel dengan ekstensi rebase dan itu adalah praktik populer di git, saya bertanya-tanya apakah itu benar-benar dapat dianggap sebagai "praktik buruk", atau setidaknya cukup buruk untuk menghindari penggunaan. Dalam kasus apa pun, saya sadar bahwa rebasing berbahaya setelah mendorong.
OTOH, saya melihat titik mencoba mengemas 5 komitmen dalam satu komitmen agar terlihat lebih bagus (khususnya di cabang produksi), namun, secara pribadi saya pikir akan lebih baik untuk dapat melihat sebagian komitmen terhadap fitur di mana beberapa Eksperimen sudah dilakukan, walaupun tidak sebagus itu, tetapi melihat sesuatu seperti "Mencoba melakukannya dengan cara X tetapi tidak seoptimal Y setelah semua, melakukannya dengan mengambil Y sebagai basis" akan IMHO memiliki nilai yang baik untuk mereka yang belajar basis kode dan ikuti kereta pemikiran pengembang.
Sudut pandang saya yang sangat keras kepala (seperti dalam bisu, visceral, bias) adalah bahwa pemrogram suka rebase untuk menyembunyikan kesalahan ... dan saya tidak berpikir ini baik untuk proyek sama sekali.
Jadi pertanyaan saya adalah: apakah Anda benar-benar menemukan berharga untuk memiliki "komitmen organik" seperti itu (yaitu sejarah yang tidak terampas) dalam praktik?, Atau sebaliknya, apakah Anda lebih suka mengalami komit yang dikemas dengan baik dan mengabaikan proses eksperimen programmer?; mana yang Anda pilih, mengapa itu bekerja untuk Anda? (memiliki anggota tim lain untuk menyimpan sejarah, atau sebagai alternatif, mengembalikannya).
1 per analisis Google DVCS , dalam Mercurial "History is Sacred".
Jawaban:
The History adalah suci, Hadir tidak. Anda dapat membagi "pohon" DVCS Anda menjadi dua bagian:
Masa lalu / riwayat yang berisi tampilan akurat tentang bagaimana Anda telah mencapai status kode saat ini. Bagian dari sejarah ini tumbuh seiring waktu
The hadir bagian mana Anda sedang bekerja untuk membuat Anda kode berevolusi. Tip ini sebagian besar sejarah memiliki ukuran yang selalu sama.
Setiap kode yang Anda lepaskan atau gunakan, entah bagaimana, adalah bagian dari masa lalu . Masa lalu adalah suci karena Anda harus dapat mereproduksi pengaturan atau memahami apa yang memperkenalkan regresi. Anda tidak akan pernah menulis ulang masa lalu . Dalam git, Anda biasanya tidak pernah menulis ulang apa pun setelah master: master adalah bagian masa lalu dari sejarah. Di Mercurial Anda memiliki konsep fase publik yang melacak bagian masa lalu "pohon" Anda dan menegakkan kekekalannya.
The hadir bagian dari kode adalah changeset yang sedang Anda kerjakan. Cabang fitur yang Anda coba jadikan dapat digunakan, bebas bug, dan dihidupkan ulang dengan benar. Sangat baik untuk menulis ulang itu bahkan merupakan ide yang baik karena itu membuat bagian masa lalu lebih cantik, sederhana dan bermanfaat. Lacak track ini dalam fase konsep .
Jadi ya, silakan rebase jika itu meningkatkan riwayat Anda. Mercurial akan mencegah Anda untuk menembak diri sendiri di kaki jika Anda melakukan rebasing barang yang seharusnya tidak Anda lakukan.
sumber
Tidak semua kesalahan adalah jenis yang perlu Anda sembunyikan - misalnya, saya pernah secara tidak sengaja melakukan file biner ke repo saya. Merusak dengan sejarah hanya buruk ketika kesalahan tidak secara eksklusif dalam sejarah itu sendiri, seperti file yang tidak seharusnya dilakukan.
sumber
Peninjauan kode jauh lebih mudah ketika ada satu perubahan besar yang kohesif dibandingkan dengan banyak perubahan kecil.
Ketika saya mengerjakan fitur baru, saya ingin melakukan banyak perubahan kecil di cabang saya. Ketika saya siap untuk mengirimkan tambalan, saya menciutkan komit kecil itu menjadi satu komit besar yang mewakili semua kode baru yang diperlukan untuk fitur itu. Di sinilah rebase berguna.
Di sisi lain, rebase tidak disarankan jika komit tidak ada hubungannya satu sama lain. Beberapa penambahan fitur harus merupakan komitmen terpisah (dan idealnya berasal dari cabang terpisah).
sumber
git rebase -i
memungkinkan Anda melakukan ini dengan mudah dan selektif. Setara dengan Mercurial terdekat adalah histedit .Pertanyaan Anda menjelaskan riwayat sebagai sekumpulan perubahan kode yang dipesan, dan menanyakan apakah organik memberikan petunjuk pembaca masa depan ke dalam proses pengembangan. Namun sebagai seorang insinyur rilis / integrasi, saya tidak sering menganggap sejarah sebagai kode. Saya lebih asyik dengan kisah yang diceritakan sejarah saya, pengetahuan institusional yang dipertahankannya, dan apakah itu memungkinkan saya untuk dengan cepat men-debug masalah.
Saya tidak berpikir alur kerja organik melakukan ini dengan baik, bahkan saya sendiri. Kualitas yang saya hargai tentang DVCS ketika saya membuat kode - cabang murah, komitmen cepat, hemat ke remote lebih awal dan sering - bukan apa yang saya hargai sebagai manajer integrasi perusahaan saya . Aku masalah
git rebase
,git merge
,git diff
, dangit apply
jauh lebih sering dalam peran itu daripadagit add
ataugit commit
. Alat sepertirebase
memungkinkan saya untuk mengubah kode yang saya berikan dari sesuatu yang berfungsi menjadi sesuatu yang dapat dipertahankan.Komitmen tidak logis atau samar tidak berguna, tetapi mudah untuk menulis secara organik, ketika perhatian utama adalah membuat kode berfungsi, tidak mendistribusikannya kepada orang lain. Berkomitmen suka
Case 15: Fixed a problem
, atauRefactored <cranky legacy feature>
membuat saya merasa ngeri, bahkan ketika saya menulisnya. Namun, tidak ada yang memicu kemarahan karena komitmen "tambahan". Pertimbangkan cabang topik ini yang diberikan pengembang kepada saya tempo hari:Semua ini adalah Jahat. Ini seperti DVCS yang dirancang untuk Dr. Faustus. Saya akan memberi Anda kontrol sumber yang cepat dan mudah. Anda memberi saya adalah jiwa pemelihara kode Anda. Semua perbuatan malas adalah tindakan egois. Banyak dari kita yang menulisnya, tetapi kita juga berhutang pada masa depan karena sejarah yang logis, dapat ditiru, dan dapat diperdebatkan. Kita tidak bisa melakukan itu tanpa ada cara
rebase
.Sedangkan untuk percobaan yang gagal, mengapa tidak menggambarkannya dalam pesan komit kami (yang baru)? Setahun dari sekarang saya tidak perlu potongan setengah jadi. Saya hanya ingin catatan upaya yang dibatalkan, dan mungkin penjelasan singkat jika saya pikir saya cukup bodoh untuk mencobanya lagi. Ada banyak alur kerja yang sukses di dunia, tetapi saya berjuang untuk memikirkan alasan apa pun saya sengaja melakukan kode yang rusak ke basis kode produksi.
sumber
Tidak ada yang harus disucikan, tetapi pastikan Anda memiliki alasan kuat untuk apa yang Anda lakukan. Rebasing sangat kuat ketika digunakan dengan benar, tetapi seperti halnya alat yang kuat itu bisa membingungkan dan menyebabkan masalah jika digunakan dengan sembarangan.
Secara pribadi saya merasa sangat berguna untuk rebase cabang fitur lokal terhadap trunk (atau cabang pengembangan utama) sebelum menjalankan tes akhir dan menggabungkan fitur ke cabang utama. Dengan begitu saya bisa berurusan dengan konflik penggabungan dll sebelum benar-benar bergabung.
sumber
IMHO, eksperimen biasanya milik rak atau cabang sementara, bukan baseline. Jika Anda mengikuti ini, seharusnya tidak ada masalah, karena semua komit akan logis dan menambah nilai.
sumber