Apakah boleh melanggar komitmen perantara, selama komit terakhir dalam pekerjaan push bekerja?

13

Terkait: Haruskah setiap git berkomitmen meninggalkan proyek dalam keadaan kerja?

Misalkan saya membuat komitmen berikut secara lokal:

  • Ubah skema database, hancurkan aplikasi.

  • Perbarui aplikasi sehingga kompatibel dengan skema database lagi.

Selama saya mendorong kedua komit, mastertetap dalam kondisi kerja. Namun, versi historis rusak.

Saya sadar bahwa saya dapat menggunakannya git rebase -iuntuk menekan komit bersama. Namun, komit yang dihasilkan akan besar dan kurang deskriptif. Jika saya perlu mencari histori komit untuk mengetahui mengapa saya mengubah sesuatu, saya lebih suka menemukan komit asli yang menunjukkan apa yang saya lakukan dan mengapa.

Pertanyaan saya adalah:

  • Adakah yang mengalami kesulitan karena rusaknya komitmen historis pada master?

  • Jika demikian, adakah cara sederhana untuk menghindari kesulitan seperti itu, tanpa mengabaikan pesan dan perubahan komit individu?

Joey Adams
sumber
1
Mengapa Anda tidak dapat melakukan kedua perubahan dalam satu langkah? Bukankah Anda seharusnya melakukan pekerjaan yang bermakna?
Giorgio

Jawaban:

9

Sebagian besar tergantung pada strategi percabangan pakaian Anda, tetapi saya pikir bahwa melanggar komitmen pada cabang pengembangan secara umum sangat masuk akal - "kemenangan" nyata dalam menggunakan kontrol sumber adalah untuk dapat mengembalikan perubahan kecil dan terkadang Anda membuat banyak dari mereka dan Anda harus memecahkan telur untuk membuat telur dadar.

Cara sederhana untuk menjaga komitmen individu tanpa mencemari master adalah dengan menggunakan cabang. Anda dapat meletakkan hal-hal yang melanggar / eksperimental di sana sehingga Anda dapat memiliki sejarah yang bagus tanpa mencemari sejarah cabang utama.

Wyatt Barnett
sumber
3
Ya, tetapi ketika saya menggabungkan fitur menjadi master dan itu adalah fast forward, master sekarang memiliki semua komitmen itu. Jika banyak komitmen, haruskah saya mempertimbangkan menggunakan --no-ffopsi untuk git-merge untuk memaksanya membuat komit gabungan?
Joey Adams
Saya percaya ini adalah tujuan yang masuk akal bahwa setiap komit ke cabang master membuat versi perangkat lunak yang berfungsi. Jika menggulung mereka menjadi satu yang besar tidak masuk akal, komentar komit harus dengan jelas menggambarkan setiap dependensi dengan komit lainnya.
mattnz
Pendapat saya adalah bahwa "komitmen yang rusak" itu baik. Jika Anda memiliki beberapa bug yang tidak Anda lihat dalam implementasi Anda, "commit yang rusak" ini dapat memberi Anda penyegaran memori yang sangat spesifik pada apa yang Anda ubah. Terkadang, itu hanya petunjuk yang Anda butuhkan.
RobotHumans
3
Agak terlambat ke pesta, tetapi jika Anda benar - benar tidak menyukai komitmen yang rusak itu, rebase sebelum Anda menggabungkan cabang Anda menjadi master.
Dan Pantry
3

Komitmen yang rusak adalah sesuatu yang "terjadi begitu saja", seharusnya tidak berarti akhir dari dunia. Saya memiliki sedikit suara yang mengganggu di bagian belakang kepala saya yang memberitahu saya bahwa seseorang seharusnya tidak secara sengaja memeriksa kode yang rusak, sebagai masalah prinsip dan karena itu termasuk versi sejarah, namun itu bukan sesuatu yang akan saya lawan.

Model percabangan Git yang sangat dipuji menjadikannya layak untuk menjaga komit yang terputus dari cabang tertentu, misalnya jika tim Anda mengadopsi gitflow atau versi yang disederhanakan. Apa pun dengan kebijakan "master bersih". Dalam hal ini, Anda bisa memeriksa di final, versi yang berfungsi sebagai komit gabungan, di mana versi historis (rusak) tersedia di repositori tetapi di luar jalur utama.

Jika tim Anda belum mengadopsi model percabangan seperti itu, maka Anda memiliki alasan yang valid untuk hanya mendorong seluruh lot untuk dikuasai dan dilakukan dengan itu.

Barend
sumber
3

Tidak, tidak apa-apa.

Jika Anda pernah melakukan git bisect(dan yang tidak suka fitur pembunuh), Anda tahu nilai sejarah di mana setiap komit dibangun.

Jika Anda memiliki banyak komit selama bisectpembangunan yang tidak membangun, Anda akan memiliki banyak komitmen git bisect skipyang membuat sulit untuk menemukan komitmen bagus terakhir.

Jika Anda menyelesaikan cabang fitur dan menggabungkannya menjadi master, bersihkan cabang sebelum menggabungkan sehingga riwayat Anda jelas dan membangun.

eek
sumber
3

Adakah yang mengalami kesulitan karena rusaknya komitmen historis pada master?

Iya. Backport, reverts, dan bisect lebih sulit. Begitu juga dengan membaca sejarah (lihat di bawah).

Jika demikian, adakah cara sederhana untuk menghindari kesulitan seperti itu, tanpa mengabaikan pesan dan perubahan komit individu?

Bukan yang saya tahu, meskipun cabang adalah solusi yang layak.

Namun, saya pikir bahwa membuang (atau lebih tepatnya menindas) yang dilakukan individu adalah hal yang benar untuk dilakukan.

Selama pengembangan, terutama ketika melakukan TDD, melakukan lebih awal dan sering baik. Anda ingin jejak lengkap dari apa yang Anda lakukan sehingga Anda dapat mundur, atau mencari tahu kapan hal-hal mulai salah (atau mungkin Anda masuk ke refactoring yang lebih besar daripada yang bisa Anda kunyah). Komit pergi.

Namun, begitu fitur / perubahan siap untuk didorong, komit adalah perubahan yang dikemas - idealnya atomik sehingga dapat [ditinjau, diubah, digabung, dipetik-ceri, dipulihkan, dilihat dalam anotasi] terpisah dari perubahan lain yang mungkin dilakukan .

Melihat sejarah suatu proyek, perubahan perangkat lunak harus dievaluasi sendiri. Apakah itu membangun? Apakah ini disertai dengan tes? Apakah itu bekerja? Apa fungsinya? File apa yang perlu diubah untuk memberikan fitur itu?

Harus mengumpulkan komit, selagi mungkin (dan dibantu oleh gabungan), menjadikannya lebih sulit. Oleh karena itu, saya pikir membersihkan riwayat Anda sebelum mendorong adalah tepat, bahkan jika itu berarti kehilangan jejak bagaimana Anda tiba di tempat Anda berada.

ptyx
sumber
1

Jawaban Singkat: Ya

Pengujian:

Pengembangan yang digerakkan oleh tes berarti Anda menulis tes yang gagal (yaitu menunjukkan kegagalan).
Kemudian Anda menulis kode untuk membuat tes bekerja.

Pengembangan:

Berkomitmen kecil, Berkomitmen sering.
Setiap komit adalah poin rollback. Jika Anda menyadari bahwa Anda berada di jalan yang salah, Anda dapat mengembalikan ke titik sebelumnya dengan relatif mudah. Jika Anda berkomitmen cukup butir Anda dapat mengembalikan ke titik yang benar.

Peringatan:

Ini tidak berarti

1) Anda memeriksa kode yang rusak menjadi master.
2) Anda perlu mendorong semua komitmen mikro untuk ditinjau oleh semua orang.

Gunakan cabang untuk melakukan pekerjaan Anda. Kompres komit mikro berpotensi untuk proses peninjauan sehingga mereka berada dalam unit yang berbeda secara logis dengan komentar yang sesuai. Jika Anda menggunakan git, Anda tidak akan kehilangan set komit asli. Anda bisa membuat set komit baru yang lebih logis untuk proses review yang akan digabungkan menjadi master.

Martin York
sumber
0

Saya pikir selama komitnya lokal dan tidak didorong ke orang lain itu tidak hanya ok, itu sebenarnya cara yang baik untuk bekerja. Hanya saja, jangan mendorong kode yang rusak ke orang lain.

Bryan Oakley
sumber