Bagaimana cara saya secara interaktif membatalkan pentas bagian tertentu di git?

106

Dalam git, jika saya memiliki beberapa hunks dari file yang sama yang dipentaskan di indeks saya, bagaimana saya bisa secara interaktif menghapus salah satunya?

Apakah ada alternatif untuk menghapus seluruh file, dan kemudian melakukan pementasan ulang hunks yang ingin saya pertahankan, atau secara manual membatalkan perubahan pada copy pekerjaan, dan kemudian secara interaktif menambahkan perubahan yang dibatalkan itu?

Andrew Grimm
sumber

Jawaban:

136

Coba git reset --patch filename; ini harus melakukan kebalikan dari git add --patch, menurut dokumentasi . Bentuk singkatnya -pjuga berfungsi untuk kedua perintah.

Aasmund Eldhuset
sumber
Saya tidak berpikir versi saya memilikinya (1.6.3.3), tetapi ini terlihat seperti jawaban yang benar.
Andrew Grimm
2
Dalam hal ini (dan dengan asumsi bahwa Anda tidak dapat meningkatkan karena alasan tertentu), saya sarankan Anda menggunakan git stash save --keep-indexuntuk menyimpan dan mengatur ulang perubahan copy pekerjaan Anda saat ini. Kemudian, Anda dapat mengatur ulang file Anda dan membatalkan perubahan yang tidak Anda inginkan. Jika Anda menyalin file ke beberapa lokasi sementara terlebih dahulu, Anda dapat menggunakan diffuntuk menyimpan perubahan yang Anda batalkan. Kemudian, Anda dapat menambahkan file kembali (tidak perlu menambahkan interaktif karena Anda telah menyembunyikan perubahan lain yang tidak Anda minati). Gunakan git stash popuntuk mendapatkan kembali perubahan lama, dan diffuntuk menerapkan perubahan yang Anda batalkan. Cukup merepotkan ... :-(
Aasmund Eldhuset
The short form -p also works for both commands... Maksudmu git reset -p filename?
Nawaz
1
@Nawaz: Itu benar - git add -p filenamesecara git reset -p filenameselektif menetapkan perubahan dari file itu, dan secara selektif menghapus perubahan. Ada juga git checkout -p -- filename, yang memungkinkan Anda membuang perubahan dari file secara selektif. Peringatan: masing-masing dari adddan resetdapat digunakan untuk mengurungkan yang lain dari keduanya, tetapi jika Anda menggunakan bentuk ini checkoutuntuk membuang perubahan, Anda tidak dapat mendapatkannya kembali.
Aasmund Eldhuset
2

git guimemiliki GUI yang layak untuk mementaskan atau menghapus pentas bongkahan atau garis secara interaktif. Ada klien GUI yang lebih cantik / lebih baik, tetapi git guiringan, built-in, dan lintas platform (lin, win, mac).

https://git-scm.com/docs/git-gui

Cukup klik kanan pada bingkah ke panggung / unstage. Untuk garis, sorot garisnya terlebih dahulu, lalu klik kanan.

bijak
sumber
-1

GitX memiliki UI yang bagus untuk menghapus potongan-potongan file: masukkan deskripsi gambar di sini

Klien resmi sudah lama tidak dikelola, tetapi cabang di GitHub dengan lebih banyak fitur populer di beberapa kalangan. ( posting blog tentang itu )

John Douthat
sumber
1
Untuk pengguna Windows di luar sana, Git Extensions memiliki UI yang sama bagusnya.
Aasmund Eldhuset
4
Begitu juga dengan git gui
bawaannya
1
SourceTree (Windows + Mac) juga memiliki UI yang bagus untuk ini.
chrnola
Saya harus menyebutkan klien Git grafis yang lebih baru sekarang - GitKraken bagus, dan mendukung ini (meskipun sekarang datang dengan biaya yang lumayan untuk penggunaan komersial). GitHub Desktop GitHub gratis, cantik, dan mendukung staging dan unstaging hunks dengan mudah. GitKraken dan GitHub Desktop keduanya lintas platform, tetapi keduanya tidak bersumber terbuka.
jdgregson