Bagaimana Anda bisa membatalkan penambahan git terakhir?

193

Apakah mungkin untuk menghapus stage perubahan git yang dipentaskan (tidak dilakukan) terakhir ? Misalkan ada banyak file di cabang saat ini, beberapa dipentaskan, beberapa tidak. Pada titik tertentu, beberapa programmer bodoh secara tidak sengaja dieksekusi:

git add -- .

...dari pada:

git checkout -- .

Bisakah programmer ini menghapus perubahan terakhirnya dengan perintah git ajaib ? Atau haruskah dia melakukan sebelum bereksperimen sejak awal?

Septagram
sumber
Heh. Kami mendapat pertanyaan dan jawaban yang berguna dari ini.
steveha
2
kemungkinan rangkap dari Undo 'git add' sebelum commit
Jim Fell
Saya percaya ini bukan duplikat. OP dalam pertanyaan lain meminta cara untuk membatalkan ini atau menghapus file-file ini dari komit. Saya ingin (ed) secara tepat dan hanya untuk membatalkan perubahan yang ditambahkan dengan git addperintah terakhir , terutama untuk file yang telah melakukan perubahan, dan memiliki beberapa perubahan yang harus dibatalkan, tidak dipentaskan. Tidak bisa mengatakan pertanyaan lain tidak terkait.
Septagram
1
Mungkin dia seharusnya / sudah / berkomitmen sebelum bereksperimen sejak awal.
android.weasel
@ android.weasel ya, itu bertahun-tahun yang lalu ...
Septagram

Jawaban:

299

Anda bisa menggunakannya git reset. Ini akan 'unstage' semua file yang Anda tambahkan setelah komit terakhir Anda.

Jika Anda ingin menghapus hanya beberapa file, gunakan git reset -- <file 1> <file 2> <file n>.

Juga dimungkinkan untuk menghapus beberapa perubahan dalam file dengan menggunakan git reset -p.

thameera
sumber
3
Sedihnya. Saya kira ada sesuatu yang salah dalam praktik komitmen saya. Menerima jawaban ini, karena Anda menyebutkan -pberalih. Terima kasih! :)
Septagram
Menghasilkan (untuk saya) kesalahan: fatal: Gagal menyelesaikan 'KEPALA' sebagai referensi yang valid. Saya belum melakukan apa-apa (repo baru) baru saja selesai git add. dan menyesalinya. Saya tidak ingin mengatur ulang seluruh add, hanya satu direktori. git reset - dir /*.* menghasilkan kesalahan di atas.
Francis Davey
... Ah, aku mengerti apa yang terjadi padaku. Saya tidak punya apa-apa untuk menunjuk ke HEAD dan git reset gagal (karena beroperasi pada HEAD).
Francis Davey
42

Anda tidak dapat membatalkan git add terbaru , tetapi Anda dapat membatalkan semua addsejak komit terakhir. git resettanpa argumen komit me-reset indeks (unstage perubahan bertahap):

git reset
rajutan
sumber
2
"Anda tidak dapat membatalkan git add terbaru ": Wow, ini mengejutkan dan berpotensi menyakitkan. Apakah ada sumber pasti untuk ini? Juga, adakah alasan yang bagus untuk itu? Terima kasih!
Andrew Moylan
@AndrewMoylan: yah, tidak ada cara otomatis untuk melakukannya. Anda selalu dapat resetsatu file, atau gunakan reset -puntuk membatalkan tahapan sebongkah tertentu.
knittl
15

Jadi jawaban sebenarnya

Bisakah programmer ini menghapus perubahan terakhirnya dengan perintah git ajaib?

sebenarnya: Tidak, Anda tidak dapat berhenti panggung hanya yang terakhir git add.

Itu jika kita menafsirkan pertanyaan seperti dalam situasi berikut:

File awal:

void foo() {

}

main() {
    foo();
}

Perubahan pertama diikuti oleh git add:

void foo(int bar) {
    print("$bar");
}

main() {
    foo(1337);
}

Perubahan kedua diikuti oleh git add:

void foo(int bar, String baz) {
    print("$bar $baz");
}

main() {
    foo(1337, "h4x0r");
}

Dalam hal ini, git reset -ptidak akan membantu, karena granularity terkecilnya adalah garis. gittidak tahu bahwa tentang kondisi antara:

void foo(int bar) {
    print("$bar");
}

main() {
    foo(1337);
}

lagi.

stanm
sumber
Saya memaksa karena sebagai pengguna git baru, itu perbedaan yang sangat penting yang menyoroti apa yang teman-teman saya gambarkan sebagai "memiliki kebersihan check-in yang baik" ... pengalaman pribadi saya - itu digambarkan sebagai "carpooling" (buruk!).
benc
6

Anda dapat menggunakan git reset(lihat dokumen )

Davids
sumber
3

Pada tanggal git meminta:

  1. use "git rm --cached <file>..." to unstagejika file tidak ada dalam repo. Itu menghapus stage file yang menyimpannya di sana.
  2. use "git reset HEAD <file>..." to unstagejika file dalam repo, dan Anda menambahkannya sebagai diubah. Itu membuat file seperti apa adanya, dan menghapus panggung mereka.

git add --Sepengetahuan saya Anda tidak dapat membatalkan tetapi Anda dapat menghapus daftar file seperti yang disebutkan di atas.

theGiallo
sumber
2
  • Hapus file dari indeks, tetapi tetap versi dan kiri dengan perubahan yang tidak dikomit dalam copy pekerjaan:

    git reset head <file>
    
  • Setel ulang file ke status terakhir dari HEAD, urungkan perubahan dan hapus dari indeks:

    git reset HEAD <file>
    git checkout <file>
    
    # If you have a `<branch>` named like `<file>`, use:
    git checkout -- <file>

    Ini diperlukan karena git reset --hard HEADtidak akan berfungsi dengan file tunggal.

  • Hapus <file>dari indeks dan versi, menjaga file tidak versi dengan perubahan dalam copy pekerjaan:

    git rm --cached <file>
    
  • Hapus <file>dari copy pekerjaan dan versi sepenuhnya:

    git rm <file>
    
Faisal
sumber
2

Jika Anda ingin menghapus semua file yang ditambahkan dari git untuk komit

git reset

Jika Anda ingin menghapus satu file

git rm <file>
BSB
sumber
1

Kamu bisa memakai

git reset

untuk membatalkan file lokal yang baru ditambahkan

 git reset file_name

untuk membatalkan perubahan untuk file tertentu

ireshika piyumalie
sumber
0

Bergantung pada ukuran dan skala yang sulit, Anda bisa membuat cabang (sementara) awal dan melakukan pekerjaan saat ini di sana.

Kemudian beralih ke dan checkout cabang asli Anda, dan pilih file yang sesuai dari awal komit.

Setidaknya Anda akan memiliki catatan permanen dari status saat ini dan sebelumnya untuk bekerja (sampai Anda menghapus cabang awal itu).

Philip Oakley
sumber