Anda dapat menggunakan git checkout -p
, yang memungkinkan Anda memilih setiap bakhil dari perbedaan antara copy pekerjaan Anda dan indeks untuk dikembalikan. Demikian juga, git add -p
memungkinkan Anda untuk memilih bakhil untuk ditambahkan ke indeks, dan git reset -p
memungkinkan Anda untuk memilih bakhil individual dari perbedaan antara indeks dan HEAD untuk mundur dari indeks.
$ git checkout -p file/to/partially/revert
# or ...
$ git checkout -p .
Jika Anda ingin memotret repositori git Anda sebelumnya untuk menyimpan perubahan ini sebelum mengembalikannya, saya ingin melakukannya:
$ git stash; git stash apply
Jika Anda sering menggunakannya, Anda mungkin ingin menggunakannya:
[alias]
checkpoint = !git stash; git stash apply
Mengembalikan bakhil atau garis individual dapat lebih mudah jika Anda menggunakan mode atau plugin editor yang baik, yang dapat memberikan dukungan untuk memilih jalur yang akan dikembalikan secara langsung, karena -p
terkadang terkadang agak canggung untuk digunakan. Saya menggunakan Magit , mode Emacs yang sangat membantu untuk bekerja dengan Git. Di Magit, Anda dapat menjalankan magit-status
, menemukan perbedaan untuk perubahan yang ingin Anda kembalikan, pilih garis yang ingin Anda kembalikan (atau cukup tempatkan kursor pada bakhil yang ingin Anda kembalikan jika Anda ingin mengembalikan sebongkah pada suatu waktu alih-alih satu baris pada satu waktu), dan tekan k
untuk mengembalikan garis-garis tertentu. Saya sangat merekomendasikan Magit jika Anda menggunakan Emacs.
git checkout
juga memiliki-p
bendera, yang melakukan persis apa yang Anda minta dalam satu perintah. Permintaan maaf untuk serangkaian langkah kompleks sebelumnya; Anda bisa menggunakannyagit checkout -p
. Sejauh menyimpan barang, sebelum melakukan sesuatu yang berpotensi merusak, saya sering melakukangit stash; git stash apply
(atau membuat alias yang melakukan itugit checkpoint
atau sesuatu) untuk merekam pohon saat ini di simpanan sehingga saya bisa kembali ke pohon itu jika ada yang salah.git commit -a -m "Backup Commit" --edit; git reset HEAD^
akan lebih baik, karena dengan begitu tidak akan mengotori keadaan simpanan saya, yang mungkin saya gunakan untuk sesuatu yang lain. Kemudian, selama Anda memiliki SHA1, Anda dapat memilihnya dalam 30 hari ke depan. --Edit memungkinkan Anda menambahkan info ke pesan komit untuk membantu Anda menemukan SHA1 nanti jika Anda menginginkannya. Di sisi lain, ini akan mengotori reflog git, jadi saya kira itu adalah tradeoff berdasarkan apa yang Anda lakukan.git checkout -p
tidak menerapkan tambalan ke indeks tetapi hanya menampilkannya?Kemudian edit patchfile dan hapus bagian yang tidak ingin Anda batalkan, lalu:
sumber
patchfile
tampak hebat di vim dan itu sangat membantu!git apply -R
sebagai gantinyapatch
(hanya untuk tetap berada di ranah git, atau jikapatch
tidak tersedia)patch: **** malformed patch at line 41: @@ -428,9 +443,9 @@ you should place your code here."
Anda bisa melakukannya
Untuk setiap file yang ingin Anda atur ulang.
sumber
Bagaimana tentang
git add -p
untuk hanya menambahkan kembali perubahan yang Anda inginkan ke indeks.sumber
Ketika saya menjalankan 'git status', ia mengatakan:
Jadi, untuk membatalkan pengeditan yang tidak dipentaskan, saya disuruh menjalankan:
sumber
Jawaban Brian Campbell membuat crash git saya, versi 1.9.2.msysgit.0, karena alasan yang tidak diketahui, jadi pendekatan saya adalah mem-stage hunks yang ingin saya pertahankan, membuang perubahan pada copy pekerjaan, lalu unstage.
sumber
git stash -p
. Anda bisa melakukannyagit stash -p; git reset --hard; git stash pop
. Ini secara efektif sama dengan apa yang Anda lakukan kecuali Anda tidak perlu menulis pesan komit.Anda dapat melakukan
git checkout
dan memberinya nama nama bagian yang ingin Anda batalkan.sumber