Cara membatalkan komit git lokal

744

Masalah saya adalah saya telah mengubah file misalnya: README, menambahkan baris baru ' ini untuk jalur pengujian saya ' dan menyimpan file, kemudian saya mengeluarkan perintah berikut

 git status

 # On branch master
 # Changed but not updated:
 #   (use "git add <file>..." to update what will be committed)
 #   (use "git checkout -- <file>..." to discard changes in working directory)
 #
 #  modified:   README
 #
 no changes added to commit (use "git add" and/or "git commit -a")


 git add README

 git commit -a -m 'To add new line to readme'

Saya tidak mendorong kode ke github, Sekarang saya ingin membatalkan komit ini.

Untuk ini saya gunakan

   git reset --hard HEAD~1

Tapi saya kehilangan baris yang baru ditambahkan ' ini untuk jalur pengujian saya ' dari file README. Ini seharusnya tidak terjadi. Saya perlu konten untuk berada di sana. Apakah ada cara untuk mempertahankan konten dan membatalkan komit lokal saya?

Amal Kumar S
sumber
3
Sepertinya Anda jelas tidak meminta git revert, yang menciptakan komit baru dengan kebalikan dari komit yang dipulihkan. Menyetel ulang cukup mengarahkan cabang Anda saat ini ke komit yang berbeda, dalam hal ini, yang sebelum komit yang ingin Anda "lupakan".
Cascabel
1
NB: Mungkin perlu disebutkan yang git-commitdapat dibatalkan jika Anda membiarkan pesan kosong, jadi jika Anda belum benar - benar menyelesaikan komit yang dapat membantu.
GKFX

Jawaban:

1423

Cukup gunakan git resettanpa --hardbendera:

git reset HEAD~1

PS: Pada sistem berbasis Unix Anda dapat menggunakan HEAD^yang sama dengan HEAD~1. Pada Windows HEAD^tidak akan berfungsi karena ^menandakan kelanjutan garis. Jadi command prompt Anda hanya akan bertanya kepada Anda More?.

Koraktor
sumber
13
Omong-omong, ini disebut --mixed dalam manual .
Josh Lee
10
Versi Git yang lebih baru bahkan memungkinkan @^sebagai singkatan HEAD^.
Koraktor
Saya tidak tahu apa yang dilakukannya, tetapi banyak file muncul di daftar perubahan saya, file yang tidak saya sentuh
FRR
@feresr Jika Anda benar-benar tidak menyentuh file-file di komit terakhir atau di pohon kerja ini disebabkan oleh inkonsistensi lain di pohon kerja Anda, misalnya Anda di Windows dan ujung file tidak cocok.
Koraktor
1
apakah mungkin untuk mereset semua komit di satu tangan?
Webwoman
185

Gunakan --softsebagai ganti --hardtanda:

git reset --soft HEAD^
TpED
sumber
18
dapatkah Anda menjelaskan perbedaan antara kedua bendera?
John Giotta
1
Jika Anda membuka Package Manager Console dan menjalankan "git reset --soft HEAD ^" ini, ia melakukan apa yang Anda inginkan (dan apa yang saya butuhkan).
David Cornelson
54
@JohnGiotta - git reset --soft HEAD^akan menghapus komit lokal terakhir (tidak ditutup) tetapi akan tetap melakukan perubahan yang telah Anda lakukan
fider
@ Juruselamat Orang Asing! Tidak yakin apakah jawaban yang diterima masih berfungsi, tetapi ini harus menjadi jawaban tepat yang dibutuhkan OP.
Babu
git reset --soft HEAD~pada windows
Jack0fshad0ws
34

Jika Anda berada di tengah-tengah komit (yaitu di editor Anda sudah), Anda dapat membatalkannya dengan menghapus semua baris di atas yang pertama #. Itu akan membatalkan komit.

Jadi, Anda dapat menghapus semua baris sehingga pesan komit kosong, lalu menyimpan file:

Seharusnya terlihat seperti ini.

Anda kemudian akan mendapatkan pesan yang mengatakan Aborting commit due to empty commit message..

EDIT :

Anda juga dapat menghapus semua baris dan hasilnya akan persis sama.

Untuk menghapus semua baris dalam vim (jika itu adalah editor default Anda), setelah Anda berada di editor, ketik gguntuk pergi ke baris pertama, lalu dGuntuk menghapus semua baris. Akhirnya, tulis dan keluar file dengan wqdan komit Anda akan dibatalkan.

inostia
sumber
3
Ini persis apa yang saya cari! Jawaban ini membutuhkan lebih banyak upvotes :)
jdunk
FYI, ini juga berfungsi jika Anda mencoba untuk membatalkanrebase -i mybranchname
inostia
18

Hal pertama yang harus Anda lakukan adalah menentukan apakah Anda ingin menyimpan perubahan lokal sebelum Anda menghapus pesan komit.

Gunakan git loguntuk menampilkan pesan komit saat ini, kemudian temukan commit_id sebelum komit yang ingin Anda hapus, bukan komit yang ingin Anda hapus.

Jika Anda ingin menyimpan file yang diubah secara lokal, dan hapus saja pesan komit:

git reset --soft commit_id

Jika Anda ingin menghapus semua file yang diubah secara lokal dan pesan komit:

git reset --hard commit_id

Itulah perbedaan lunak dan keras

mistdon
sumber
1
Saya pikir justru sebaliknya.
Ruff9
9

Anda dapat memberi tahu Git apa yang harus dilakukan dengan indeks Anda (kumpulan file yang akan menjadi komit berikutnya) dan direktori yang berfungsi ketika melakukan git reset dengan menggunakan salah satu parameter:

--soft: Hanya komit yang akan direset, sedangkan Indeks dan direktori kerja tidak diubah.

--mixed: Ini akan mengatur ulang indeks agar sesuai dengan KEPALA, sementara direktori kerja tidak akan disentuh. Semua perubahan akan tetap di direktori kerja dan muncul sebagai diubah.

--hard: Ini me-reset segalanya (komit, indeks, direktori kerja) agar sesuai dengan KEPALA.

Dalam kasus Anda, saya akan menggunakan git reset --softuntuk menyimpan perubahan yang dimodifikasi di Indeks dan direktori kerja. Pastikan untuk memeriksa ini untuk penjelasan yang lebih rinci.

Nesha Zoric
sumber
1

Gunakan perintah di bawah ini:

$ git reset HEAD~1

Setelah ini, Anda juga dapat melihat file apa yang mengembalikan seperti respons di bawah ini.

Unstaged changes after reset:
M   application/config/config.php
M   application/config/database.php
Omkar
sumber