Magit membagi bingkah menjadi dua bakhil

34

Ada pertanyaan di SO tentang pemisahan bakhil dengan menggunakan magit, dan dua solusi yang diberikan adalah dengan mem-stage wilayah (menandai wilayah, menekan tahap), atau mengecilkan / menumbuhkan semua bakhil menggunakan +& -. Bukan itu yang saya kejar.

Dalam status buffer magit, saya ingin membagi sebongkah menjadi dua bakhil, pada titik, atau setidaknya pada garis di sekitar titik.

Menghidupkan ini (permisi format diff buruk saya)

@@ blah blah blah
- foo
+ bar
+ baz
+

Ke

@@ blah blah
- foo
+ bar

@ blah blah
+ baz

Saat intinya ada di bar.

Motivasi:

  • bazmenjadi pernyataan debug, jadi saya ingin menghapusnya dari komit foo& bartanpa menghilangkannya.

  • bardan bazhanya terkait sebagian, yang berarti bahwa perubahan mereka tidak boleh dalam komit yang sama.

  • barbesar dan bazkecil, membuatnya jauh lebih mudah untuk membagi potongan daripada memilihbar

  • Mirip dengan titik terakhir, katakan komit 20 baris berisi satu baris tengah yang tidak boleh dipentaskan. Akan lebih mudah untuk membagi & mengatur dua bakhil atas dan bawah mengabaikan yang tengah daripada menggunakan wilayah.

  • Hal di atas dapat muncul kadang-kadang ketika presentasi diff akan memisahkan sebelum dan sesudah sesuatu yang telah dimodifikasi, dan memiliki sesuatu yang tidak membantu di tengah. misalnya

@@ line
- old_foo
+ random stuff
+ new foo
Squidly
sumber
Tidak ada dalam magit yang bisa melakukan ini. Bahkan lebih dari itu: Desain magit membuat kode ini mungkin tidak dapat dilakukan tanpa mendesain ulang status magit yang luas.
Rémi
4
Terima kasih, masuk akal. Sayangnya yang terbaik yang bisa saya pikirkan adalah beberapa otomatisasi dalam memilih maju atau mundur dari titik dan kemudian pementasan. Juga patut dicatat (untuk orang-orang yang belum pernah menggunakan fitur sebelumnya) bahwa Anda dapat menggunakan wilayah untuk tahap dan unstage. Misalnya, Anda dapat menggelar gebrakan besar, lalu beralih ke bagian panggung dan lepaskan garis di tengah. Tetapi setuju dengan @MrBones bahwa opsi split-hunk akan lebih mudah daripada mengutak-atik pilihan.
glucas
Menarik, memilih 2 daerah yang berbeda bukan adjacents. +1
Nsukami _
1
Secara pribadi saya akan menggelar seluruh cowok, dan kemudian unstage pernyataan debug. (Pengait pra-komit saya menangkap pernyataan debug, sehingga tidak ada bahaya saya melakukan satu.)
phils
1
Saya tidak cukup tahu tentang Magit untuk membantu, tetapi saya hanya ingin menunjukkan bahwa mode-diferensial Emacs memiliki perintah diff-split-hunkyang melakukan hal itu. TKI permintaan Anda adalah cara untuk menggunakan diff-split-hunk(atau sesuatu yang setara) dari buffer status-magit.
Stefan

Jawaban:

17

Seperti yang disebutkan dalam komentar di atas, Magit tidak mendukung pemisahan sebongkah ke beberapa bakhil di luar apa yang mungkin dengan menggunakan git diff -U<n>. Itu karena Magit bergantung pada perintah Git untuk membuat diff. Itu tidak akan berubah, Magit akan selalu menggunakan diff yang didapatnya dari Git apa adanya.

(Sebenarnya Magit menanggalkan beberapa tajuk yang tidak benar-benar relevan bagi manusia, tetapi mengembalikannya saat menerapkan perubahan. Namun memecah sebongkah lebih jauh dari apa yang -U<n>didukung adalah cerita yang sama sekali berbeda, itu akan mengarah ke lubang kelinci - ada alasan mengapa Git tidak mengizinkan "bakhil yang lebih kecil", itu tidak akan dapat menerapkannya).

Sementara Magit tidak mendukung menampilkan bakhil yang lebih kecil seperti yang diminta di sini, Magit tidak mendukung penerapan hanya sebagian dari sebongkah. Ketika wilayah aktif saat pementasan, maka hanya bagian dari bingkah yang diterapkan.

Itu tidak banyak membantu ketika bagian yang tidak boleh dipentaskan tepat di tengah teks yang harus dipentaskan. Seperti yang disarankan orang lain, apa yang harus Anda lakukan dalam kasus ini adalah mengatur seluruh bingkah, dan kemudian membatalkan tahapan yang tidak ingin Anda lakukan pada langkah kedua.

Tentu saja itu bisa otomatis. Satu-satunya cara saya dapat melihat di mana ini bisa diotomatisasi adalah "tahap hunk saat ini kecuali untuk wilayah. Tapi saya memiliki beberapa keraguan tentang seberapa sering itu benar-benar berguna dan takut bahwa itu tidak akan mudah untuk diterapkan yang kuat Dan jadi saya saat ini tidak bermaksud untuk mengimplementasikan ini.

tarsius
sumber
47

Anda dapat membagi bakhil dengan Magit.

Alih-alih hanya meninggalkan kursor di dalam hunk, pilih garis yang ingin Anda panggung dari hunk dan tekan s . Hanya bagian yang dipilih dari bagian yang akan dipentaskan, sedangkan bagian yang lainnya masih berada di area yang tidak dipentaskan.

Dengan begitu Anda membaginya menjadi dua. Saya pikir Anda dapat menggunakan mekanisme yang sama untuk memindahkan bagian bakhil ke simpanan. Saat menggunakan k Anda hanya akan membersihkan sebagian dari sebongkah.

Sven Rieke
sumber
3
IMO, ini harus menjadi jawaban yang diterima, karena memenuhi permintaan (dan saya telah menemukan jawaban ini beberapa kali ketika mencoba mengingat bagaimana melakukan ini).
chaseadamsio
2
Ya ini harus diterima sebagai jawaban!
copyninja
3

Jika Anda ingin membuang bagian dari sebongkah, pilih garis di dalam sebongkah yang ingin Anda buang dan tekan x .

NeilDurant
sumber