Memisahkan kemajuan pengkodean menjadi komitmen yang berarti tanpa terlalu banyak overhead

23

Saat mengerjakan perbaikan atau fitur, saya terkadang tersandung masalah kecil lainnya yang dapat diperbaiki dengan cepat dalam hitungan detik. Ketika saya melakukannya dengan segera dan kemudian mengkomit fitur / perbaikan yang sudah selesai, komit mencakup lebih dari satu hal. Misalnya "add feature X and code clean up"atau "fix bug X and improved logging". Akan lebih baik untuk membagi ini menjadi dua komitmen. Seandainya kedua perubahan terjadi pada file yang sama, saya tidak bisa begitu saja menambahkan satu file, melakukan, menambah yang lain dan kemudian melakukan lagi. Jadi saya melihat tiga opsi berikut:

  1. Sengaja mengabaikan hal-hal yang tidak terkait saat mengerjakan sesuatu.

  2. Salin file dengan dua perubahan, kembalikan, sertakan satu perubahan, komit, sertakan perubahan lainnya, komit lagi.

  3. Jangan mengubah hal-hal kecil yang tidak terkait tetapi menambahkannya ke daftar todo dan melakukannya nanti.

Saya tidak terlalu menyukai ketiga opsi ini, karena alasan berikut:

  1. Kualitas kode dapat menderita jika seseorang tidak memperbaiki masalah kecil. Dan saya merasa tidak enak jika secara sadar saya kehilangan kesempatan untuk memperbaiki sesuatu tanpa banyak usaha.

  2. Ini meningkatkan pekerjaan manual dan rentan kesalahan.

  3. Ini bagus untuk balita yang tidak terlalu kecil, tetapi menambahkan item kecil ke daftar todo dan mengunjungi kembali nanti sering kali lebih lama daripada hanya memperbaikinya dengan segera.

Bagaimana Anda menangani situasi seperti itu?

Tobias Hermann
sumber
7
Tidakkah git memungkinkan Anda untuk memeriksa setiap baris daripada seluruh file?
Kilian Foth
Kemungkinan rangkap dari Komit dapat dianggap terlalu kecil?
nyamuk
Saya menggunakan git add -pbanyak hal yang memungkinkan saya memilih bagian-bagian file yang ingin saya komit secara interaktif. Jika pembersihan cukup terpisah, ini mudah dilakukan. Jika pemisahan lebih sulit, saya melakukan state pada cabang sementara, kemudian secara manual menambahkan perubahan ke cabang saya yang sebenarnya sampai tidak ada perbedaan dengan cabang sementara. Ini membutuhkan lebih banyak pekerjaan, tetapi memungkinkan saya untuk memeriksa bahwa setiap komit bekerja dengan sendirinya.
amon
1
@gnat: jelas bukan korban penipuan. OP tidak bertanya tentang ukuran komit yang benar - dia ingin melakukan komitmen kecil. Dia hanya mencari cara yang lebih efisien untuk melakukan ini.
Doc Brown
2
@gnat: jawaban teratas tidak mengatakan apa-apa (!) tentang cara menangani perubahan yang berbeda dalam satu file dan cara membaginya menjadi komit terpisah.
Doc Brown

Jawaban:

11

Saya pikir Anda harus sangat pragmatis saat pemrograman. Sekalipun dimungkinkan untuk merumuskan skema, alur kerja, atau implementasi yang sempurna, terkadang Anda hanya perlu menyelesaikan pekerjaan. Inilah yang saya lakukan:

Saya menggunakan kemampuan git untuk melakukan stage / komit bongkahan dan garis individual, bila memungkinkan, untuk memisahkan perubahan yang tidak terkait, meskipun, kadang-kadang ini dapat menimbulkan masalah sementara, jika pemisahan itu tidak dilakukan dengan benar. Karena perubahan akan berdekatan, biasanya bukan masalah besar, kecuali jika Anda memiliki kebijakan untuk menguji setiap perubahan individu dalam pipa CI Anda.

Ketika perubahan yang tidak terkait terlalu besar, saya akan meletakkannya di daftar todo, dan biasanya mengambilnya setelah itu, sementara itu baru dalam pikiran saya. Kadang-kadang mungkin perlu satu atau dua hari sebelum saya bisa kembali ke sana, itu tergantung pada tugas saya saat ini dan melatih pemikiran. Kadang-kadang saya hanya akan meletakkan TODO: di sebelah kode yang menyinggung, jika saya tidak memiliki solusi yang baik siap.

Kebetulan tidak praktis untuk memisahkan hal-hal dan saya akan melakukan penyesuaian kecil bersama dengan karya asli.

Ukuran perubahan biasanya merupakan faktor penentu ketika saya memilih rute untuk pergi, tetapi pada akhirnya saya lebih suka mengabaikan aturan alur kerja, daripada meninggalkan bau.

axl
sumber
7

Editor saya memiliki plugin yang membuat pementasan masing-masing bagian file menjadi sangat mudah. Saya membayangkan editor programmer lain mungkin memiliki plugin serupa, meskipun Anda selalu dapat melakukannya dengan cara manual git add --patch | -p. Kemudian saya menggunakan simpanan git untuk menyimpan perubahan saya yang lain untuk menguji komit kecil saya secara terpisah. Kemudian setelah saya berkomitmen, saya hanya melakukan git stash popdan melanjutkan di mana saya tinggalkan. Itulah tepatnya fitur yang dirancang untuk itu.

Karl Bielefeldt
sumber
2

Triknya adalah tidak membuat perubahan kecuali Anda siap untuk melakukan upaya sebanyak yang layak.

Apa yang saya cenderung lakukan adalah menambah daftar todo (kadang-kadang dengan menambahkan komentar pada kode, kadang-kadang dalam catatan pada tiket bug, dan kadang-kadang dengan memperbarui kode di cabang terpisah mengetahui perbaikan akan digabungkan pada akhirnya). Jika tidak ada tiket bug untuk rollup masalah kualitas kecil, saya menaikkan satu khusus untuk ini, jadi saya dan semua orang bisa tahu apa alasan perubahan kode itu adalah ketika cabang digabung. Saya tidak pernah hanya membuat perubahan untuk bersenang-senang, semuanya mendapat keterlacakan sehingga kolega saya tidak akan terlalu terkejut ketika perubahan kode.

Jadi singkatnya - ya, abaikan mereka saat coding. Jika Anda menambahkan fitur, jangan tergoda untuk menambahkan 2 fitur, sekecil apa pun. Jika seseorang memutuskan untuk mengembalikan cabang Anda (karena fitur Anda tidak lagi diperlukan, katakanlah) maka Anda juga akan kehilangan semua perbaikan mini-bug Anda. Demikian pula, Anda tidak ingin membuat 'perbaikan' kecil di beberapa kode penting yang berfungsi dengan benar.

gbjbaanb
sumber
1
OP tidak menyarankan untuk menggabungkan dua perubahan menjadi satu komit, justru sebaliknya.
Doc Brown
1
@DocBrown ia menyarankan untuk mencampurkan 2 perubahan ke dalam satu cabang, yang bisa berantakan untuk dihapus nanti, meskipun jelas tidak semaca 2 perubahan dalam satu komit.
gbjbaanb
Ok, saya melihat apa yang ada dalam pikiran Anda dengan paragraf terakhir Anda.
Doc Brown
2

Pilihan yang saya gunakan sedikit adalah menambahkan TODOkomentar, kemudian melakukan banyak "parsial" komit, dengan menggunakan git add --patchuntuk memilih bagian yang relevan dari file. Kemudian gunakan git rebase --interactiveuntuk menyusun ulang dan menggabungkan sebagian komitmen ke dalam fitur final dan memperbaiki komitmen sebelum mendorongnya.

Ini menjaga komit utama Anda tetap bersih, dan masih memungkinkan Anda untuk memperbaiki masalah lain yang Anda temukan segera.

Tidak ada yang salah dengan git rebasekonteks ini karena Anda hanya menulis ulang komit lokal.

Tom
sumber
1

Pilihan lain bisa dengan "git menyimpan" perubahan Anda saat ini. Alur kerjanya akan terlihat seperti ini:

  1. Mulai lakukan perubahan yang terkait dengan Fitur A
  2. Temukan Bug B dan putuskan untuk memperbaikinya segera
  3. Dari baris perintah dalam performa repo Anda git stash (Setelah itu kode Anda akan kembali ke kondisi semula sebelum Anda mulai mengerjakan Fitur A )
  4. Pada titik ini, perubahan yang tidak berkomitmen untuk Fitur A disimpan di "simpanan"
  5. Buat perubahan kode yang diperlukan untuk memperbaiki Bug B dan membuat komit kembali ke repo
  6. Dari jalankan baris perintah git stash pop
  7. Perubahan Anda yang tidak berkomitmen untuk Fitur A sekarang dihapus dari simpanan dan dikembalikan ke kode Anda yang sedang berlangsung di samping perbaikan (yang sudah dilakukan) untuk Bug B
Zach
sumber
Bisakah Anda mengembangkan sedikit lebih banyak tentang bagaimana alur kerja ini bekerja? Bagaimana keadaan repositori di setiap titik? Bisakah Anda memandu seseorang melalui proses menggunakan simpanan git?
0

Secara terpisah tahap (dan komit) perubahan yang terkait dengan perbaikan bug. Dalam Git Extensions, ini sangat mudah dilakukan. Dari commandline, saya pikir Anda perlu melakukannya git add -p.

Andrew Coleson
sumber