Haruskah setiap git yang berkomitmen meninggalkan proyek dalam kondisi kerja?


36

Saya ingin tahu apa praktik terbaik yang ada. Haruskah git berkomitmen ditegakkan sedemikian rupa sehingga proyek dalam keadaan bekerja (dibangun dengan benar, semua tes lulus dll), atau melakukan kode rusak OK?

Misalnya, jika Anda mengabaikan persyaratan ini, Anda bisa lebih fleksibel dengan komit (menggunakannya sebagai potongan logis, meskipun aplikasi tidak dalam keadaan aktif dll). Namun, jika Anda menegakkannya, Anda mendapatkan fleksibilitas untuk dapat memilih setiap komit yang diberikan nanti ...

Jawaban:


50

Saya biasanya mengikuti aturan ini:

  • Setiap penggabungan ke mastercabang harus meninggalkan proyek dalam kondisi kerja;
  • Setiap penggabungan ke developcabang arus utama harus meninggalkan proyek dalam kondisi kerja (dan setidaknya harus membangun);
  • Masing- masing individu berkomitmen memiliki tujuan utama untuk menjelaskan mengapa perubahan dilakukan, dan untuk apa, dan bagian mana dari proyek yang terpengaruh. Semua tujuan lain, seperti meninggalkan proyek dalam keadaan aktif, adalah opsional.

1
Kami menanamkan semangat yang sama di kantor kami, dan ini berfungsi dengan baik. Bukan berarti ini tidak terbatas pada git tetapi bekerja dengan alat serupa (mercurial, svn, dll ...)
deadalnix

40

Gunakan klon lokal repositori Anda untuk apa pun yang membuat Anda nyaman saat berkembang.

Saya melakukan kode yang rusak secara teratur, dan ketika saya siap membuat kode tersedia untuk pengembang lain, saya menggunakan fitur hebat:

git rebase -i HEAD~4

Ini memungkinkan saya untuk mengompres perantara saya (dalam hal ini 4 dari mereka), mungkin rusak, komit menjadi satu komit yang baik. Anda akan disajikan dengan editor yang memungkinkan Anda memilih bagaimana komit-komit tersebut dipadatkan. Biasanya saya menandai komit pertama komit 'pilih', dan tandai yang lain 'squash'.

Lalu saya bisa mendorong satu komit atom, atau sebenarnya apa yang saya lakukan jika fitur baru saya benar-benar siap, adalah menggunakan 'git cvsexportcommit' untuk memasukkan pekerjaan saya ke repo CVS yang ada.


3
Saya mempertanyakan kebijaksanaan jawaban ini karena ini bergantung pada hal rebaseyang cukup kontroversial: Engkau Tidak Berbohong: git rebase, amend, squash, dan kebohongan lainnya
Kereta luncur

8
@ ArtB: Tapi dalam kasus ini, memetech hanya membohongi dirinya sendiri (IOW tidak menulis ulang sejarah publik), dan itu sangat tidak kontroversial.
Jörg W Mittag

4
Artikel @ArtB mengacu pada komitmen yang dipublikasikan. Jawaban mengacu pada komitmen yang tidak dipublikasikan.
d0001

2
@WayneConrad "aturan praktis yang baik adalah bahwa Anda tidak boleh menulis ulang sejarah untuk hal-hal yang sudah mendorong keluar ke dunia. Ini akan membatasi alat penulisan ulang ini untuk digunakan secara lokal untuk" memperbaiki "segala sesuatunya sebelum mendorongnya." Dari paragraf terakhir epilog.
Andrew mengatakan Reinstate Monica

8
@ArtB - Saya mempertanyakan kebijaksanaan memercayai semua yang Anda baca di internet dan melakukan (atau tidak melakukan) apa pun yang Anda baca di internet tanpa memahami mengapa (atau mengapa tidak).
mattnz

6

Dua manfaat besar kontrol versi adalah memungkinkan pengembang memulihkan versi sebelumnya dari pekerjaan mereka, dan memungkinkan pengembang mencoba perubahan yang berbeda dan mungkin bertentangan pada saat yang bersamaan. Kontrol versi memberi pengembang kebebasan untuk mencoba ide yang mungkin gagal.

Pengembang harus didorong untuk bercabang dan melakukan pekerjaan mereka secara teratur, apakah itu dibangun atau tidak. Menolak untuk mengizinkan percabangan atau kerusakan komit berarti melumpuhkan pengembang Anda dan memanfaatkan alat Anda dengan buruk.

Yang mengatakan, itu adalah praktik yang sangat baik untuk mengharuskan komitmen untuk cabang tertentu selalu dibangun. Banyak organisasi melangkah lebih jauh dan melarang pengembang untuk berkomitmen ke cabang tertentu sama sekali. Sebagai contoh, pengembang mungkin diminta untuk menggabungkan pekerjaan mereka kembali ke cabang pengembangan utama, tetapi hanya pengembang utama yang boleh menggabungkan perubahan itu dari pengembangan ke cabang produksi.


2

Kami biasanya mengikuti kedua pendekatan. Dalam repositori lokal di kotak saya, saya melakukan semua yang saya inginkan. Ketika tiba saatnya untuk mendorong repo pusat tim saya, saya pertama-tama melakukan rebase interaktif dan membentuk komitmen saya ke dalam paket logis. Biasanya satu komit per cerita, dengan id cerita (atau cacat) dimasukkan dalam komentar (kami adalah toko berbasis kanban).

Kemudian di repro pusat kami, kami mendengarkan Jenkins dan memulai tes dan semua tes. Jika ada yang gagal, kami biasanya mengizinkan orang untuk mencoba dan memperbaiki bangunan dengan komit lain. Jika tidak terlihat baik, mengembalikan komit yang salah itu mudah dilakukan.


1

Karena git commithanya memengaruhi salinan repositori Anda sendiri, proyek tidak perlu dalam kondisi kerja setelah setiap komit. Teruskan dan komit setiap kali Anda ingin menyimpan pekerjaan yang telah Anda lakukan. Mungkin aturan praktis yang baik adalah bahwa komit tepat ketika Anda bisa menggambarkan perubahan yang Anda buat dalam pesan komit.

Ini git pushyang memengaruhi pengguna lain. Kebijakan untuk apa yang harus didorong adalah masalah bagi tim pengembangan Anda untuk memutuskan. Mendorong kode yang tidak bekerja ke cabang utama mungkin adalah tidak-tidak, tapi mungkin tidak apa-apa untuk mendorong kode yang tidak bekerja ke cabang yang terpisah (selama tidak ada orang lain yang akan mencoba melakukan build dari cabang itu).


1

Kami menggunakan git flow di tempat kerja, dan kami juga melakukan kode yang belum selesai atau rusak - karena hanya mendarat di cabang lokal atau jauh yang dibuat untuk masalah khusus itu. Hanya setelah tugas selesai, itu akan bergabung ke cabang berkembang (yang mewakili copy pekerjaan saat ini dalam model aliran). Dengan begitu, kita juga dapat berkolaborasi dalam kode (beberapa rekan kerja berada di kota lain, termasuk pimpinan proyek) dan saling membantu.

Namun, itu tergantung pada bagaimana Anda dan rekan kerja Anda berpikir. Secara pribadi, saya pikir komit cabang baik-baik saja, karena Anda mungkin memerlukan riwayat perubahan dengan refactor yang lebih besar atau serupa.


1

Pada akhirnya terserah Anda dan orang-orang yang bekerja dengan atau untuk Anda, karena git tidak memaksakan aturan apa pun.

Praktik saya adalah menghindari komitmen yang sengaja membuat sistem jauh lebih buruk. Setiap komit harus berupa refactoring atau menerapkan beberapa persyaratan. Jika saya membuat komitmen yang buruk dan menemukannya sebelum saya mendorongnya maka saya akan mengubah atau mengganti untuk menghapusnya dari sejarah.

Saya pikir ini membuatnya lebih mudah untuk membaca log git dalam permintaan tarik, karena setiap komit harus berdiri sendiri sebagai refactoring atau implementasi dari beberapa persyaratan. Menambahkan kode mati yang akan dihidupkan kembali dalam waktu dekat akan dihitung sebagai refactoring. Ini adalah 'potongan logis' saya.

Anda masih bisa fleksibel dengan bagaimana Anda menyusun komitmen Anda. Misalnya, Anda dapat menulis tes di awal tetapi menandai semuanya sebagai dilewati di komit pertama, sehingga suite pengujian Anda tidak melaporkan kegagalan, dan kemudian lewati tes ketika implementasi dilakukan.


0

Dengan asumsi Anda menggunakan cabang, dan pesan komit yang baik, melakukan kode "rusak" pada cabang dengan pesan komit yang membuat jelas akan baik-baik saja, selama tim Anda setuju bahwa itu adalah praktik kerja yang baik.

Anda juga mengkloning repositori git secara lokal, jadi Anda mungkin hanya memiliki cabang lokal dengan komit lokal tidak didorong ke asal tempat Anda melakukan kode "rusak" saat Anda melanjutkan; kemudian, ketika semuanya sudah berfungsi, Anda bisa menggabungkannya menjadi master atau cabang lainnya, dan menghapus cabang kerja Anda dengan berbagai komitmen "rusak".

Bagi saya, ini semua tentang menyetujui dengan tim Anda apa yang dapat diterima; beberapa tim tidak akan menerima kode yang rusak bahkan di cabang, yang lain akan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.