Saya baru-baru ini menemukan patch
opsi git untuk add
perintah, dan saya harus mengatakan itu benar-benar fitur yang fantastis. Saya juga menemukan bahwa sebongkah besar dapat dibagi menjadi bakhil yang lebih kecil dengan menekan stombol, yang menambah presisi komit. Tetapi bagaimana jika saya ingin lebih presisi, jika split hunk tidak cukup kecil?
Sebagai contoh, pertimbangkan ini sudah split cowok:
@@ -34,12 +34,7 @@
width: 440px;
}
-/*#field_teacher_id {
- display: block;
-} */
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
+#user-register form.table-form .field-type-checkbox label {
width: 300px;
}
Bagaimana saya bisa menambahkan penghapusan komentar CSS hanya untuk komit berikutnya? The s
opsi ini tidak tersedia lagi!
-
karakter, dan Git mengeluh bahwa tambalan saya tidak berlaku.git add -p
dan mengedit sepotong dengane
itu hanya akan mempengaruhi apa yang dipentaskan, bukan pohon kerja Anda.Katakanlah
example.css
penampilan Anda seperti ini:Sekarang mari kita ubah penyeleksi gaya di blok tengah, dan sementara kita melakukannya, hapus beberapa gaya komentar lama yang tidak kita perlukan lagi.
Itu mudah, sekarang mari kita komit. Tapi tunggu, saya ingin mempertahankan pemisahan logis dari perubahan dalam kontrol versi untuk peninjauan kode langkah-sederhana, dan agar tim saya dan saya dapat dengan mudah mencari riwayat komit untuk spesifik.
Menghapus kode lama secara logis terpisah dari perubahan pemilih gaya lainnya. Kita akan membutuhkan dua komitmen berbeda, jadi mari kita tambahkan bakhil untuk tambalan.
Ups, sepertinya perubahannya terlalu dekat, jadi git telah mencampurkan keduanya.
Bahkan mencoba membaginya dengan menekan smemiliki hasil yang sama karena pemisahan itu tidak cukup granular untuk perubahan presisi kami. Diperlukan garis yang tidak berubah di antara garis yang diubah agar git dapat membagi patch secara otomatis.
Jadi, mari kita edit secara manual dengan menekane
git akan membuka tambalan di editor pilihan kami.
Mari kita tinjau tujuannya:
Kami ingin membaginya menjadi dua komitmen:
Komit pertama melibatkan penghapusan beberapa baris (penghapusan komentar).
Untuk menghapus baris yang dikomentari, biarkan saja, mereka sudah ditandai untuk melacak penghapusan dalam kontrol versi seperti yang kita inginkan.
-/*#field_teacher_id {
- display: block;
-} */
Komit kedua adalah perubahan, yang dilacak dengan merekam penghapusan dan penambahan:
Penghapusan (garis pemilih lama dihapus)
Untuk menjaga garis pemilih yang lama (jangan hapus mereka selama komit ini), kami ingin ...
... yang secara harfiah berarti mengganti
-
tanda minus dengankarakter spasi .
Jadi tiga baris ini ...
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
... akan menjadi ( perhatikan spasi tunggal pada yang pertama dari semua 3 baris):
form.table-form #field_teacher + label,
form.table-form #field_producer_distributor + label {
Tambahan (garis pemilih baru ditambahkan)
Agar tidak memperhatikan garis pemilih baru yang ditambahkan selama komit ini, kami ingin ...
... yang secara harfiah berarti menghapus seluruh baris:
+#user-register form.table-form .field-type-checkbox label {
(Bonus: Jika Anda menggunakan vim sebagai editor Anda, tekan dduntuk menghapus baris. Pengguna Nano tekan Ctrl+ K)
Editor Anda akan terlihat seperti ini ketika Anda menyimpan:
Sekarang mari kita komit.
Dan untuk memastikan, mari kita lihat perubahan dari komit terakhir.
Sempurna - Anda dapat melihat bahwa hanya penghapusan yang dimasukkan dalam komit atom. Sekarang mari kita selesaikan pekerjaan dan lakukan sisanya.
Akhirnya Anda dapat melihat komit terakhir hanya mencakup perubahan pemilih.
sumber
+
dengan#
. Hasilnya sama, tetapi mungkin Anda merasa tidak nyaman dengan penghapusan (dan tidak dapat kembali) atau Anda ingin bereksperimen sebelum menyimpan.r
#
lebih dari plus xDJika Anda dapat menggunakan git gui, ini memungkinkan Anda untuk melakukan perubahan baris demi baris. Sayangnya, saya tidak tahu bagaimana melakukannya dari baris perintah - atau bahkan jika itu mungkin.
Satu opsi lain yang saya gunakan di masa lalu adalah memutar kembali bagian dari perubahan (biarkan editor tetap terbuka), komit bit yang saya inginkan, batalkan dan simpan kembali dari editor. Tidak terlalu elegan, tetapi menyelesaikan pekerjaan. :)
EDIT (penggunaan git-gui):
Saya tidak yakin apakah git-gui sama dalam versi msysgit dan linux, saya hanya menggunakan satu msysgit. Tetapi dengan asumsi itu sama, ketika Anda menjalankannya, ada empat panel: panel kiri atas adalah perubahan direktori kerja Anda, kiri bawah adalah tahapan Anda berubah, kanan atas adalah diff untuk file yang dipilih (baik itu bekerja dir atau dipentaskan), dan kanan bawah adalah untuk deskripsi komit (saya kira Anda tidak akan membutuhkannya). Ketika Anda mengklik file di kanan atas, Anda akan melihat perbedaannya. Jika Anda mengklik kanan pada garis diff, Anda akan melihat menu konteks. Dua opsi yang perlu diperhatikan adalah "stage hunk for commit" dan "stage line for commit". Anda tetap memilih "garis panggung untuk komit" pada garis yang ingin Anda komit, dan Anda selesai. Anda bahkan dapat memilih beberapa garis dan mengaturnya jika Anda mau.
Untuk melakukan, Anda bisa menggunakan alat gui atau baris perintah.
sumber
git-gui
tetapi saya tidak tahu bagaimana mencapai apa yang Anda gambarkan.Salah satu cara untuk melakukannya adalah dengan melewatkan bagian,
git add
apa pun yang Anda butuhkan, dan kemudian jalankangit add
lagi. Jika ini adalah satu-satunya potongan, Anda dapat membaginya.Jika Anda khawatir tentang urutan komitmen, gunakan saja
git rebase -i
.sumber
git add -p
lagi, tetapi saya tidak dapat membaginya. Saya mendapatkan ini:Stage this hunk [y,n,q,a,d,/,e,?]?
dan kemudian menekan 's' mencetak bantuan. BTW, maksudmuadd patch
, bukanpatch add
? Atau adagit patch
plugin yang harus saya instal?git rebase -i
. Yang lebih fleksibel daripadacommit --amend