Apakah riwayat versi benar-benar sakral atau lebih baik rebase?

26

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".

dukeofgaming
sumber
dapatkah Anda memberikan referensi ke tempat yang dinyatakan sebagai "mantra Mercurial"?
nyamuk
Sekarang Anda menyebutkannya, saya pikir itu sebenarnya berasal dari kode analisis DVCS Google.google.com/p/support/wiki/DVCSAnalysis (tetapi kenyataannya tetap)
dukeofgaming
kemungkinan duplikat Kapan riwayat VCS suatu proyek dihapus?
nyamuk

Jawaban:

22

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.

Marmoute
sumber
Sekarang, saya lebih menyukai jawaban Anda
dukeofgaming
7

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.

DeadMG
sumber
1
Jadi Anda tidak akan pernah rebase untuk membuat komit lebih "logis"?
dukeofgaming
7

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).

chrisaycock
sumber
4
ada banyak alat yang membuat tinjauan kode dari beberapa perubahan terkait cukup sepele, jadi dengan sendirinya, saya tidak membeli ini sebagai jawaban
jk.
4
Bagaimana ada perbedaan antara meninjau perbedaan antara revisi dasar dan revisi fitur lengkap, dan meninjau komit tunggal dari set komitmen berdasarkan itu? Akan terlihat sama jika re-base melakukan pekerjaannya dengan benar!
Mark Booth
3
Apa yang Anda jelaskan di sini bertentangan dengan saran di wiki Mercurial . Perubahan kecil "jelas benar" lebih disukai untuk ulasan. Meretas cabang fitur ke dalam satu set perubahan tidak normal di Mercurial - Saya telah melihatnya direkomendasikan lebih sering di Git di mana git rebase -imemungkinkan Anda melakukan ini dengan mudah dan selektif. Setara dengan Mercurial terdekat adalah histedit .
Martin Geisler
9
Saya sepenuhnya tidak setuju. Beberapa tahun terakhir kami menggunakan alat untuk ulasan kode, dan tidak ada yang saya benci lagi untuk mendapatkan 30 file perubahan besar yang dikirimkan untuk ditinjau. Jauh lebih mudah untuk mendapatkan banyak perubahan kecil. Misalnya saya mengganti nama kelas ini menjadi xyz karena lebih mencerminkan tanggung jawab yang dimodifikasi. Saya menambahkan metode nn karena saya akan membutuhkannya untuk bla. Jauh lebih mudah untuk menangani ulasan yang lebih kecil.
Pete
3
Saya sudah mendengar ide ini cukup banyak di komunitas git yang memecah banyak komit menjadi satu sebelum Anda mendorong ke repo resmi, tetapi ini tidak pernah membantu saya. Saya lebih suka komit kecil dengan pesan yang bermakna. Seperti yang telah dicatat orang lain, Anda dapat melakukan diff di beberapa perubahan.
Chris Sutton
4

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, dan git applyjauh lebih sering dalam peran itu daripada git addatau git commit. Alat seperti rebasememungkinkan 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, atau Refactored <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:

$ git log production..topic --oneline
f9a1184 incremental update
156d299 incremental commits
e8d50b0 new incremental updates
511c18c incremental updates, refactor
1b46217 incremental upgrade
9e2b3b8 incremental update
fa68a87 incremental update

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.

Christopher
sumber
Jawaban yang sangat bagus, motivasi yang jernih tentang mengapa harus rebase
dukeofgaming
2

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.

Harald
sumber
1

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.

Coder
sumber
Apa yang Anda katakan adalah bahwa Anda lebih menyukai cabang kerja daripada mengedit cabang baseline (mis. Master / default, produksi / rilis, vX.X, dll)?
dukeofgaming