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:
Sengaja mengabaikan hal-hal yang tidak terkait saat mengerjakan sesuatu.
Salin file dengan dua perubahan, kembalikan, sertakan satu perubahan, komit, sertakan perubahan lainnya, komit lagi.
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:
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.
Ini meningkatkan pekerjaan manual dan rentan kesalahan.
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?
sumber
git add -p
banyak 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.Jawaban:
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.
sumber
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 melakukangit stash pop
dan melanjutkan di mana saya tinggalkan. Itulah tepatnya fitur yang dirancang untuk itu.sumber
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.
sumber
Pilihan yang saya gunakan sedikit adalah menambahkan
TODO
komentar, kemudian melakukan banyak "parsial" komit, dengan menggunakangit add --patch
untuk memilih bagian yang relevan dari file. Kemudian gunakangit rebase --interactive
untuk 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 rebase
konteks ini karena Anda hanya menulis ulang komit lokal.sumber
Pilihan lain bisa dengan "git menyimpan" perubahan Anda saat ini. Alur kerjanya akan terlihat seperti ini:
git stash
(Setelah itu kode Anda akan kembali ke kondisi semula sebelum Anda mulai mengerjakan Fitur A )git stash pop
sumber
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
.sumber