Kapan saya harus berhenti berkomitmen untuk menguasai proyek baru?

26

Setiap kali proyek baru dimulai, biasanya masuk akal untuk memulai dengan berkomitmen langsung untuk menguasai sampai Anda mendapatkan sesuatu yang "stabil", dan kemudian Anda mulai bekerja di cabang.

Setidaknya, ini yang biasanya saya lakukan. Apakah ada cara untuk segera memulai cabang dari komit kedua? Apakah masuk akal untuk melakukannya dengan cara ini? Jelas, "Initial Commit" akan selalu di master, tetapi setelah itu, kapan saya tahu ini saat yang tepat untuk mulai membuat cabang untuk fitur baru?

Droogan
sumber

Jawaban:

23

Segera.

Kuncinya adalah pertanyaan tentang apa kebijakan untuk Guru. Dengan git, biasanya, kebijakan cabang tentang Master adalah rilis stabil yang dapat dibangun . Kadang-kadang, Master adalah 'jalur utama' tempat cabang dibuat dan digabung sebelum bergabung ke cabang Rilis. Ini adalah dua pendekatan peran / kebijakan yang berbeda.

Ini sering menjadi sumber kesalahan bagi orang untuk mengubah peran atau kebijakan bagian jalan melalui proyek. Lebih mudah bagi pengembang solo untuk mengomunikasikan perubahan-perubahan ini kepada para kontributor, tetapi mencoba untuk membuat selusin programmer untuk semua mengakui "Master sekarang di 1.0, silakan bercabang fitur daripada semua orang mendorongnya"

Saya menyentuh pendekatan kebijakan di atas. Kebijakan untuk Master adalah rilis stabil yang dapat dibangun . Memeriksa perubahan tambahan kecil ke dalam ini berarti Anda tidak memiliki sesuatu yang dapat dibangun stabil setiap saat. Tidak memeriksa perubahan kecil bertentangan dengan "banyak tautan kecil (tapi lengkap)" yang cenderung menjadi kebijakan terbaik (dan didorong oleh percabangan yang mudah).

Dari perspektif berbasis peran, Anda telah mulai dengan master menjadi peran utama, pelepasan, pemeliharaan, dan pengembangan, dan kemudian beberapa titik di ujung jalan peran pengembangan dan pemeliharaan pindah ke cabang. Ini lagi berarti perubahan apa yang diizinkan pada master dan dapat membingungkan kontributor di mana hal-hal berada. Itu juga dapat (sedikit) membingungkan sejarah cabang, mendorong komitmen besar yang berarti lebih besar dan lebih sulit untuk memahami penggabungan.

Kunci peran dan kebijakan di cabang sederhana dan konsisten sejak awal.

"Cabang perubahan kebijakan" ini dapat dilihat dalam Pola Cabang . Gagasan masing-masing cabang memiliki peran, dapat dibaca dalam Strategi Cabang SCM Lanjutan . Keduanya adalah bacaan yang sangat bagus.


sumber
3
Saya setuju sebagian besar dengan ini, tapi saya tidak hanya mengatakan buildable , saya akan mengatakan releasable (stable). Master tidak boleh berisi kode yang hanya membangun, itu harus berisi kode yang sebenarnya telah diuji secara menyeluruh. Anda harus dapat menarik dari master kapan saja, yakin dengan pengetahuan bahwa tidak akan ada cacat serius.
Aaronaught
Saya setuju sepenuhnya untuk Aaronaught, karena IMHO itu sangat mungkin (dan praktik terbaik) untuk bekerja dengan cara di mana langkah dari satu negara yang dapat dibangun ke yang berikutnya selalu hanya perubahan inkremental kecil, tidak pernah yang besar.
Doc Brown
1
@MichaelT Saya sudah sering melihat cabang 'dev', tetapi tidak pernah mendengarnya dijelaskan dalam konteks "master awal" sebelumnya. Saya pikir saya akan menggunakan ini, terima kasih.
Droogans
13

Ada terutama dua situasi di mana Anda biasanya ingin mulai bekerja dengan cabang:

  • ketika Anda atau tim Anda harus memulai fitur baru yang memiliki peluang sekecil apa pun untuk tidak ditambahkan ke rilis berikutnya (yang mungkin merupakan rilis pertama), kemudian mulai pengembangan dalam cabang fitur terpisah

  • ketika Anda harus menyediakan perbaikan untuk bug parah untuk rilis terbaru, dan Anda ingin membuat rilis perbaikan bug baru yang hanya berisi perbaikan itu, tetapi tidak ada fitur yang baru dikembangkan (dan mungkin tidak stabil)

Untuk keputusan seperti itu, saya pikir sangat membantu untuk berpikir selalu dalam hal "fitur baru" atau "perbaikan bug", dari titik di mana Anda memiliki versi pertama yang dapat dikompilasi / dijalankan dari program Anda.

Michael Feathers mendaftar empat alasan untuk berubah dalam bukunya yang terkenal, tetapi saya akan menempatkan "mengoptimalkan sumber daya" di bawah "cabang fitur baru" (untuk fitur non-fungsional) dan "meningkatkan desain" paling sering di bawah "cabang fitur baru" juga. , karena IMHO seseorang tidak boleh meningkatkan desain saat ini tidak dimaksudkan untuk tujuan membuat implementasi fitur tertentu lebih mudah.

Doc Brown
sumber
12

Jika Anda mengikuti git-flow - dan, terus terang, saya pikir Anda gila jika Anda menggunakan Git dan tidak menggunakan model percabangan itu - maka Anda tidak boleh berkomitmen untuk itu mastersampai Anda benar-benar siap untuk rilis publik.

Komitmen pertama Anda masteradalah repositori kosong. Komit Anda berikutnya masterharus gabungan komit dari developcabang atau cabang rilis sementara, dan itu harus stabil, diuji, dan siap untuk penyebaran (jika itu aplikasi) atau distribusi publik (jika itu perpustakaan).

Ada yang model percabangan lain untuk Git, tapi kebanyakan dari mereka telah berasal dari model terpusat SCM yang lebih tua dan dapat menyebabkan masalah serius dalam lingkungan DVCS. Anda tidak harus benar-benar menggunakan ekstensi git-flow, dan Anda tidak perlu semua cabang rilis / hotfix / fitur, tetapi tulang telanjangnya adalah developdan master, dan kode yang tidak stabil masuk develop.

Aaronaught
sumber
Anda bahkan tidak memerlukan komitmen pertama itu master. Ingat itu masterbukan sesuatu yang istimewa untuk git, tidak perlu ada di sana. Anda bisa memiliki cabang pengembangan sampai Anda ingin membuat rilis.
Miles Rout
2
@MilesRout: Meskipun pada prinsipnya benar, Anda tidak bisa menggabungkan kecuali cabang sudah ada, dan proses menentukan bahwa setiap komit untuk dikuasai harus merupakan penggabungan non-maju cepat. Kecuali jika saya melewatkan sesuatu, satu-satunya alternatif untuk komit kosong awal adalah dengan master cabang dari beberapa pengembangan komit atau pelepasan cabang, yang berarti bahwa mereka akan berbagi komit yang sama, yang merupakan sesuatu yang Anda harapkan menghindari.
Aaronaught
1
Ah, itu memang poin yang bagus. +1 untuk dikirim dan dikomentari.
Miles Rout
1

Neal Ford dari Thoughtworks menganjurkan penggunaan fitur toggle over branching untuk menghindari masalah "menggabungkan neraka". Pertimbangkan kasus di mana dua programmer dengan patuh bergabung setiap hari dari cabang utama dan salah satu dari mereka membuat perubahan besar selama beberapa minggu dan kemudian melakukan. Programmer lain bisa berakhir di neraka. Untuk menghindari masalah ini, Ford merekomendasikan "mengedepankan rasa sakit" (atribut lincah yang terkenal) dengan hanya memiliki satu cabang dan berkomitmen setiap hari. Fitur tambahan ditambahkan melalui toggle fitur yang menonaktifkan fitur sampai sepenuhnya diuji.

Metodologi ini tampaknya bekerja paling baik di lingkungan yang mengimplementasikan pengiriman terus menerus karena masalah dengan komit akan segera ditangkap.

Steve Emmerson
sumber
1

Sudah dua tahun sejak jawaban terakhir untuk pertanyaan ini dan saya pikir sekarang ceritanya berubah. Bagi saya jawabannya adalah "Setiap kali Anda menggunakan kontrol kode sumber untuk melacak versi."

Singkatnya, hari ini melacak versi proyek dengan kontrol kode sumber tidak selalu berhasil. (misalnya menggunakan npm untuk mengelola dependensi dan menentukan versi semantik dengan '^') Dalam hal ini artefak proyek berubah setiap kali pembangunan terjadi, dengan tidak perlu berhubungan dengan perubahan kode sumber setiap kali. Untuk menangani tantangan baru semacam ini, beberapa tim memilih untuk membangun 'artefak' yang disimpan dalam sistem kontrol artefak (mis. JFrog Artifactory) untuk melacak versi proyek.

Jelas ketika Anda sudah memiliki kontrol versi artefak di tempat, Anda tidak akan menarik 'kode produksi' dari cabang GIT dan membangun / menyebarkan ke produksi, sebaliknya Anda berkonsultasi dengan sistem kontrol artefak untuk versi runnable langsung untuk penyebaran. Dalam kasus seperti itu, konsep 'cabang pelepas' tiba-tiba kehilangan maknanya. Dan setiap kali tim Anda memutuskan untuk tidak mengaitkan git branch dengan versi rilis, melakukan / mendorong langsung untuk menjadi pilihan yang bagus sekali lagi: ia datang sebagai cabang default setiap kali repo dikloning, maka secara otomatis memberikan semantik yang diterima secara luas dan dikomunikasikan dengan baik. perubahan. Namun, seperti yang disarankan jawaban yang disarankan, Anda mungkin harus mengepalai peran penugasan ke cabang termasuk master, dan menggunakan cabang itu hanya untuk peran tertentu.

Terakhir, saya akan selangkah lebih maju dan menyarankan untuk menggunakan master sebagai cabang pengembangan dalam proyek-proyek dengan hanya beberapa komuter inti. Yang merupakan kasus untuk tim saya dan mungkin sama untuk sebagian besar toko layanan mikro. Berkomitmen pada master menghilangkan komunikasi proses perubahan dan berpotensi menghindari 'menggabungkan neraka' saat mengerjakan fitur di beberapa sprint. Selain itu, kode di cabang master bahkan tidak harus 'bekerja', proses build / test otomatis akan memberi tahu Anda apa yang salah dan cukup mudah untuk memeriksa riwayat git dan menghubungi penulis yang memecahkan build / test :-)

Shawn
sumber
0

Saya akan mengambil posisi radikal: bercabang di setiap ide. Pertama di cabang git yang murah, biaya utama cabang adalah mengingat untuk apa. Saya juga setuju bahwa komit pertama yang harus dikuasai adalah kandidat pelepas. Saya sarankan mulai dengan bukti cabang konsep. Ketika Anda telah membuktikan konsep Anda, Anda dapat menggabungkannya dengan cabang devel kosong Anda atau menulis ulang tergantung pada seberapa baik percobaan pertama Anda. dari titik ini Anda bercabang dari devel untuk setiap bug, fitur, abstraksi, dll.

Hildred
sumber