Secara tidak sengaja memasukkan perubahan dalam komitmen yang tidak terkait

8

Pendekatan pribadi saya terhadap git commit adalah bahwa setiap commit harus menyertakan unit perubahan , dalam kelengkapannya.

Ketika saya berkembang, saya biasanya fokus pada unit seperti itu. Tetapi kadang-kadang, perhatian saya menyimpang di tempat lain dan saya bekerja sebentar di unit yang berbeda. Ini mungkin tidak optimal, tetapi saya telah belajar untuk berkomitmen dengan hati-hati ( git add --interactiveadalah teman baik saya).

Namun, itu bisa terjadi bahwa saya lupa untuk melakukan perubahan selektif saya dan bukannya melakukan seluruh file, percaya bahwa semua perubahan yang saya lihat di diff memang terkait dengan unit yang sama, meskipun mungkin ada perubahan atau dua yang sama sekali tidak terkait.

Lalu saya git push.

Apakah ini berbahaya? Haruskah saya berupaya mengubah komit sehingga hanya mencakup perubahan yang dimaksudkan? Perhatian utama saya adalah bahwa siapa pun yang melihat sejarah akan melihat perubahan dan mungkin akan menggaruk kepala mereka selama beberapa menit sebelum menyadari bahwa itu kemungkinan besar adalah kesalahan. Lebih buruk lagi, saya bisa membayangkan bahwa perubahan bahkan akan terlihat terkait dan programmer mungkin tidak mengenali kesalahannya.

Masalahnya adalah, karena saya sudah mendorong, saya tidak bisa menulis ulang sejarah server dengan aman , jadi saya mungkin harus terlebih dahulu mengembalikan komit, membaginya dengan benar dan komit lagi. Atau, saya bisa mengubah komit dengan pesan komit yang lebih baik, tetapi saya harus benar-benar cepat karena itu juga memerlukan penulisan ulang riwayat. Sebagai upaya terakhir, saya mungkin hanya melakukan unit yang saya kerjakan sebagai berikutnya, meninggalkan catatan bahwa ada perubahan terkait dalam komit sebelumnya (tapi ini terasa salah).

Saya mengerti bahwa dalam pengaturan multi-pengembang dengan alur kerja peninjauan kode yang tepat, hal ini kemungkinan tidak akan terjadi. Saya juga mengerti bahwa jika saya adalah satu-satunya pengembang dalam suatu proyek, maka penulisan ulang sejarah adalah solusi terbaik untuk ini.

Robert Rossmann
sumber
Apakah Anda menggunakan aliran git? (prod, integrasi, fitur cabang?) Menggunakan aliran git Saya tidak perlu khawatir tentang komitmen untuk fitur cabang. Penggabungan ke dalam integrasi dilakukan pada penyelesaian fitur dan penggabungan ke dalam prod dilakukan saat dirilis.
RubberChickenLeader
argh itu sangat menyebalkan ketika ini terjadi, tetapi rasa sakit untuk memutar kembali dan kembali berkomitmen
Ewan
Saya dapat melihat bagaimana menggunakan git flow dapat memitigasi hal ini (tidak dapat bekerja pada unit lain kecuali mengubah / membuat cabang), tetapi saya merasa alur kerja akan, dalam lingkungan kerja saya saat ini, hanya memperlambat saya. Mungkin dalam proyek yang lebih besar / pekerjaan yang berbeda.
Robert Rossmann

Jawaban:

9

Komit sejarah sangat penting, tetapi karena 3 alasan:

  1. bergabung ke tempat lain. Anda perlu mengambil potongan dari cabang dan menempelkannya di tempat lain, penting untuk memiliki semua potongan yang Anda inginkan di sana dan tidak ada yang tidak Anda inginkan. Jadi jika komit 'berantakan' Anda berisi perubahan yang ditujukan untuk fitur yang sedang Anda kerjakan (dan tidak, katakan komit tidak disengaja dari sesuatu yang lain) maka Anda baik.
  2. Mengaudit apa yang terjadi beberapa saat setelah itu - biasanya untuk menentukan kapan bug atau fitur tertentu diperkenalkan. Dalam hal ini, tidak masalah apa yang ada dalam komitmen selama Anda dapat menentukan perubahan yang Anda minati.
  3. Ulasan kode. Tinjauan sejawat yang baik dilakukan dan kemudian ditinjau (jangan tahan proses dev / komit dengan menunggu resensi!) Dan dalam kasus ini pengulas akan ingin memahami perubahan apa yang dibuat. Namun, umumnya peninjau akan lebih tertarik pada perubahan keseluruhan - mencoba meninjau komit yang dibuat, dikembalikan, dibuat ulang adalah latihan yang membuang-buang waktu dibandingkan dengan meninjau ketiga komit sekaligus.

Jadi, meskipun unit-of-work melakukan suara yang ideal, mereka tidak menuntut apa pun dalam hal praktis. Saya akan berusaha untuk menjaga komitmen tetap masuk akal, dan unit kerja adalah cara yang baik untuk menjaga komitmen tetap waras, tetapi jangan repot-repot mencoba mengutak-atik sejarah komit hanya untuk menjaga komit tetap rapi. Itu seperti memperbarui file kode untuk membuat semua tanda kurung sesuai dengan yang Anda inginkan - bagus, tetapi tidak berguna.

Sekarang, jika Anda telah melakukan sedikit pekerjaan yang ditujukan untuk cabang yang berbeda, kembalikan dan komit dengan benar ke cabang yang tepat. Itu penting, tetapi jika Anda telah memperbarui sedikit kode server ketika Anda telah bekerja pada GUI .. tidak perlu khawatir tentang hal itu.

gbjbaanb
sumber
1

Ketika ini terjadi, itu bukan masalah besar untuk hanya mengembalikan perubahan di komit berikutnya. Menambahkan pesan komit yang tepat ( Removing the XYZ that I accidentally added in C92A891) akan cukup bagi pengembang lain untuk memahami dalam ulasan kode.

Daripada khawatir tentang memperbaiki insiden tertentu, cobalah untuk menghindari situasi di tempat pertama.

Ini adalah masalah sebenarnya:

Namun, itu bisa terjadi bahwa saya lupa untuk menyeleksi perubahan secara selektif dan sebagai gantinya melakukan seluruh file

Anda harus membiasakan diri untuk tidak pernah melakukan seluruh file (atau yang terburuk dari seluruh ruang kerja Anda!). Selalu komit baris demi baris atau dengan seluruh Hunk yang telah Anda periksa.

Saat melakukan hal ini (yang sepertinya sering Anda lakukan) perubahan yang tidak disengaja jauh lebih kecil kemungkinannya untuk menyelinap masuk ke dalam komitmen Anda.

pkamb
sumber
"Selalu lakukan baris demi baris atau dengan seluruh Hunk yang telah kamu periksa." Mengapa? Bagi saya, memeriksa dan menentukan garis demi garis adalah pengecualian, bukan aturannya. Saya menghindari bekerja pada lebih dari satu fitur / perbaikan pada suatu waktu (pengalihan konteks mental mahal) dan bahkan ketika saya harus, saya menyimpan pekerjaan dan melepasnya sesuai kebutuhan. Untuk alasan ini, sebagian besar waktu saya dapat dengan percaya diri melakukan semua perubahan dan seluruh file (setelah meninjau perbedaan, tentu saja) dan jarang saya harus secara bertahap melakukan tahapan baris demi baris atau memeriksa setiap bingkah menggunakan add interaktif.
ADTC
@ ADTC Saya menemukan diri saya membuat diff di sekitar perbaikan yang sebenarnya saya akhirnya menemukan: logging, variabel debug, pendekatan alternatif gagal, dll. Saya pikir lebih mudah untuk meninggalkan kekacauan di tempat, melakukan hanya perbaikan single-line, kemudian menerbangkan seluruh indeks.
pkamb
0

Tampaknya Anda memiliki satu repositori lokal di komputer Anda, dan satu repositori dibagikan dengan rekan kerja Anda di server. Mengapa Anda hanya memiliki satu repositori di komputer lokal Anda? Saya biasanya memiliki setidaknya lima, sehingga saya dapat mengerjakan satu hal dalam satu repositori, memperbaiki bug di yang lain tanpa menyentuh repo pertama, yang mungkin dalam keadaan tidak lengkap, dan sebagainya.

gnasher729
sumber