Bagaimana cara membatalkan 'git add' sebelum melakukan?

Saya keliru menambahkan file ke git dengan perintah:

 git add myfile.txt 

Saya belum menjalankan git commit . Apakah ada cara untuk membatalkan ini sehingga file-file ini tidak termasuk dalam komit?


Saat ini ada 48 jawaban (beberapa dihapus). Tolong jangan tambahkan yang baru jika Anda tidak memiliki informasi baru.

7856
08 дек. diatur oleh paxos1977 08 Des . 2008-12-08 00:57 '08 pada 0:57 2008-12-08 00:57
@ 34 jawaban
  • 1
  • 2

Anda dapat membatalkan git add sebelum melakukan

 git reset <file> 

yang akan menghapusnya dari indeks saat ini (daftar "akan dikomit") tanpa mengubah apa pun.

Anda bisa menggunakannya

 git reset 

tanpa nama file untuk menonaktifkan semua perubahan. Ini bisa berguna ketika terlalu banyak file terdaftar satu per satu dalam waktu yang wajar.

Dalam versi Git yang lebih lama, perintah di atas sama dengan git reset HEAD <file> dan git reset HEAD masing-masing, dan tidak akan berhasil jika HEAD tidak ditentukan (karena Anda belum melakukan komitmen dalam repo Anda) atau ambigu (karena Anda membuat cabang dengan nama HEAD , yang merupakan hal bodoh yang seharusnya tidak Anda lakukan). Ini diubah di Git 1.8.2 , meskipun dalam versi modern Git Anda dapat menggunakan perintah di atas sebelum membuat komit pertama Anda:

"git reset" (tanpa parameter atau parameter) yang digunakan untuk Anda tidak memiliki komitmen dalam riwayat Anda, tetapi sekarang memberi Anda indeks kosong (untuk mencocokkan komit yang tidak ada, Anda bahkan tidak termasuk).

8850
08 дек. Jawabannya diberikan genhack 08 Desember. 2008-12-08 01:30 '08 pada 1:30 2008-12-08 01:30

Anda ingin:

 git rm --cached <added_file_to_undo> 

Dasar Pemikiran:

Ketika saya masih baru dalam hal ini, saya pertama kali mencoba

 git reset . 

(untuk membatalkan semua unggahan awal saya), hanya untuk mendapatkan pesan bermanfaat ini (tidak terlalu):

 fatal: Failed to resolve 'HEAD' as a valid ref. 

Ternyata ini karena tautan KEPALA (cabang?) Hanya ada setelah komit pertama. Artinya, Anda akan menghadapi masalah pemula yang sama dengan saya jika alur kerja Anda, seperti milik saya, akan terlihat seperti ini:

  1. Buka direktori proyek baru saya untuk mencoba Git, keinginan baru
  2. git init
  3. git add.
  4. git status

    ... banyak gulungan omong kosong ...

    > Sial, saya tidak ingin menambahkan semua ini.

  5. google "cancel git add"

    => temukan stack overflow - ooh

  6. git reset.

    => fatal: Tidak dapat menyelesaikan 'HEAD' sebagai tautan yang valid.

Selain itu, ternyata pesan kesalahan terdaftar pada daftar distribusi.

Dan keputusan yang tepat ada di sana di keluaran status Git (yang, ya, saya sebut "omong kosong")

border=0
 ... # Changes to be committed: # (use "git rm --cached <file>..." to unstage) ... 

Dan solusinya adalah dengan menggunakan git rm --cached FILE .

Perhatikan peringatan di tempat lain di sini - git rm menghapus copy pekerjaan lokal Anda dari file tersebut, tetapi tidak jika Anda menggunakan --cached . Ini adalah hasil dari git help rm :

--cached Gunakan opsi ini untuk menghapus dan menghapus jalur dari indeks saja. File desktop, yang dimodifikasi atau tidak, akan tetap ada.

Saya mulai menggunakan

 git rm --cached . 

hapus semuanya dan mulai lagi dari awal. Itu tidak berhasil, karena, meskipun add. bersifat rekursif, ternyata rm membutuhkan -r untuk rekursi. Huh

 git rm -r --cached . 

Ok, sekarang saya kembali ke tempat saya mulai. Lain kali saya akan menggunakan -n untuk menjalankan -n dan melihat apa yang akan ditambahkan:

 git add -n . 

Saya mengarsipkan semuanya di tempat yang aman sebelum mempercayai git help rm untuk mengatakan bahwa --cached tidak menghancurkan apa-apa (dan bagaimana jika saya salah menuliskannya).

2013
25 марта '09 в 19:20 2009-03-25 19:20 jawabannya diberikan oleh Rhubarb pada 25 Maret 2009 pada 19:20 2009-03-25 19:20

Jika Anda mengetik:

 git status 

git akan memberi tahu Anda apa yang sedang diselesaikan, dll., termasuk petunjuk tentang cara melepaskan:

 use "git reset HEAD <file>..." to unstage 

Saya menemukan bahwa git melakukan pekerjaan yang cukup baik mendorong saya untuk melakukan hal yang benar dalam situasi ini.

Catatan Versi terbaru git (1.8.4.x) telah mengubah pesan ini:

 (use "git rm --cached <file>..." to unstage) 
498
08 дек. Jawabannya diberikan oleh Paul Beckingham 08 Des. 2008-12-08 02:22 '08 pada 2:22 pagi 2008-12-08 02:22

Untuk memperjelas: git add memindahkan perubahan dari direktori kerja saat ini ke area perantara (indeks).

Proses ini disebut perantara. Dengan demikian, perintah paling alami untuk mengubah perubahan (file yang dimodifikasi) jelas:

 git stage 

git add hanyalah alias untuk git stage

Sangat disayangkan bahwa tidak ada git unstage dan git unadd . Pertanyaan yang sesuai lebih sulit untuk ditebak atau diingat, tetapi cukup jelas:

 git reset HEAD -- 

Kami dapat dengan mudah membuat alias untuk ini:

 git config --global alias.unadd 'reset HEAD --' git config --global alias.unstage 'reset HEAD --' 

Dan akhirnya, kami memiliki tim baru:

 git add file1 git stage file2 git unadd file2 git unstage file1 

Secara pribadi, saya menggunakan nama samaran yang lebih pendek:

 git a #for staging git u #for unstaging 
232
10 сент. Jawabannya takeshin 10 September. 2010-09-10 23:28 '10 pada 23:28 2010-09-10 23:28

Selain jawaban yang diterima, jika file Anda yang keliru ditambahkan sangat besar, Anda mungkin akan melihat bahwa bahkan setelah menghapusnya dari indeks menggunakan " git reset " itu masih terjadi di direktori .git . Anda tidak perlu khawatir tentang hal itu, file tersebut benar-benar masih dalam repositori, tetapi hanya sebagai "objek bebas", itu tidak akan disalin ke repositori lain (melalui klon, push), dan ruang akhirnya akan dibebaskan - meskipun mungkin tidak terlalu cepat . Jika Anda khawatir, Anda dapat menjalankan:

 git gc --prune=now 

Pembaruan (selanjutnya, saya akan mencoba menghi>

Jadi apa pembatalan git add ?

git reset HEAD <file> ?

atau

git rm --cached <file> ?

Sebenarnya, dan jika saya tidak salah: tidak .

git add tidak dapat diurungkan - secara umum, aman.

Pertama-tama mari kita ingat apa yang sebenarnya dilakukan git add <file> :

  1. Jika <file> sebelumnya tidak dilacak , git add menambahkannya ke cache dengan isinya saat ini.

  2. Jika <file> sudah dilacak , git add menyimpan konten saat ini (snapshot, versi) ke cache. Di GIT, tindakan ini masih disebut menambahkan (dan bukan hanya memperbarui), karena dua versi berbeda (snapshot) file diperlakukan sebagai dua elemen berbeda: oleh karena itu, kami menambahkan item baru ke cache, sehingga akan dilakukan nanti.

Dalam terang ini, pertanyaannya agak ambigu:

Saya keliru menambahkan file menggunakan perintah ...

Script OP tampaknya menjadi yang pertama (file tidak terlacak), kami ingin "undo" untuk menghapus file (dan bukan hanya konten saat ini) dari item yang dipantau. Jika demikian, maka Anda dapat menjalankan git rm --cached <file> .

Dan kita juga bisa menjalankan git reset HEAD <file> . Secara umum, ini lebih disukai karena berfungsi di kedua skenario: itu juga membatalkan tindakan ketika kita keliru menambahkan versi dari item yang sudah dilacak.

Tetapi ada dua peringatan.

Pertama: hanya ada (seperti yang ditunjukkan dalam jawaban) skrip di mana git reset HEAD tidak berfungsi, tetapi git rm --cached works: repositori baru (tanpa komit). Tetapi, pada kenyataannya, ini praktis tidak relevan.

Kedua, perlu diingat bahwa git reset HEAD tidak dapat secara ajaib mengembalikan konten file yang di-cache sebelumnya, itu hanya menyinkronkannya kembali dengan HEAD. Jika git add kami yang salah git add menimpa versi sebelumnya yang tidak dikomit, kami tidak akan dapat memulihkannya. Karena itu, sebenarnya, kami tidak dapat membatalkan [*].

Contoh:

 $ git init $ echo "version 1" > file.txt $ git add file.txt # first add of file.txt $ git commit -m 'first commit' $ echo "version 2" > file.txt $ git add file.txt # stage (don't commit) "version 2" of file.txt $ git diff --cached file.txt -version 1 +version 2 $ echo "version 3" > file.txt $ git diff file.txt -version 2 +version 3 $ git add file.txt # oops we didn't mean this $ git reset HEAD file.txt # undo ? $ git diff --cached file.txt # no dif, of course. stage == HEAD $ git diff file.txt # we have lost irrevocably "version 2" -version 1 +version 3 

Tentu saja, ini tidak terlalu penting jika kita hanya mengikuti alur kerja lazim dari mengeksekusi 'git add' hanya untuk menambahkan file baru (kasus 1), dan kami memperbarui konten baru dengan komit, git commit -a perintah.


* (Sunting: Di atas hampir benar, tetapi masih ada beberapa peretas / cara kusut untuk memulihkan perubahan yang dikirimkan, tetapi tidak diperbaiki, dan kemudian ditimpa - lihat Komentar oleh Johannes Matokich dan iolsmit)

153
18 мая '11 в 21:05 2011-05-18 21:05 Jawaban diberikan oleh leonbloy pada 18 Mei '11 pada 21:05 2011-05-18 21:05
 git rm --cached . -r 

akan "membatalkan" semua yang Anda tambahkan dari direktori saat ini secara rekursif

89
10 дек. balasan diberikan oleh braitsch 10 desember . 2009-12-10 00:19 '09 pada 0:19 2009-12-10 00:19

Lari

 git gui 

dan hapus semua file secara manual atau dengan memilih semuanya dan menekan tombol komit dengan komit.

83
12 окт. Balas diberikan oleh Khaja Minhajuddin pada 12 Oktober 2011-10-12 04:12 '11 pada 4:12 pada 2011-10-12 04:12

Git memiliki perintah untuk setiap tindakan yang dapat dibayangkan, tetapi membutuhkan pengetahuan yang luas untuk memperbaikinya, dan karena itu ia kontra-intuitif paling baik ...

Apa yang kamu lakukan sebelumnya:

  • Mengubah file dan menggunakan git add . atau git add <file> .

Apa yang kamu inginkan:

  • Hapus file dari indeks, tetapi simpan dalam versi dan biarkan dengan perubahan yang tidak tetap dalam copy pekerjaan:

     git reset head <file> 
  • Setel u>

29 марта '13 в 14:14 2013-03-29 14:14 jawabannya diberikan pada 29 Maret, '13 pada 14:14 2013-03-29 14:14

Untuk membatalkan file yang sudah ditambahkan cukup sederhana, menggunakan git , untuk mereset myfile.txt yang sudah ditambahkan, gunakan:

 git reset HEAD myfile.txt 

Jelaskan:

Setelah Anda meletakkan file yang tidak perlu untuk dibatalkan, Anda dapat git reset , Head adalah git reset file Anda di jaringan lokal, dan parameter terakhir adalah nama file Anda.

Saya membuat >

2019

28 июня '17 в 13:43 2017-06-28 13:43 Jawabannya diberikan oleh Alireza pada 28 Juni '17 pukul 1:43 malam 2017-06-28 13:43

Pertanyaannya jelas tidak ditanyakan. Alasannya adalah bahwa git add memiliki dua arti:

  • tambahkan file baru ke area pementasan, lalu batalkan dengan git rm --cached file .
  • Menambahkan file yang telah dimodifikasi ke area pementasan, lalu batalkan dengan git reset HEAD file .

jika ragu, gunakan

 git reset HEAD file 

Karena dalam kedua kasus hal yang diharapkan diharapkan.

Peringatan: jika Anda melakukan git rm --cached file dalam file tersebut diubah (file yang sebelumnya ada di repositori), maka file tersebut akan dihapus di git commit ! Itu masih ada di sistem file Anda, tetapi jika orang lain menarik komit Anda, file tersebut akan dihapus dari pohon kerjanya.

git status memberi tahu Anda apakah file itu baru atau diubah :

 On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: my_new_file.txt modified: my_modified_file.txt 
69
16 янв. Jawaban diberikan oleh Michael_Scharf 16 Jan 2014-01-16 22:54 '14 pukul 10:54 2014-01-16 22:54

Jika Anda menggunakan komit asli Anda dan tidak dapat menggunakan git reset, cukup nyatakan "Git bangkrut" dan hapus folder .git dan mulai dengan itu

58
19 нояб. Jawaban yang diberikan oleh Paul Betts 19 Nov 2009-11-19 19:39 '09 pada 19:39 2009-11-19 19:39

Seperti banyak jawaban lain, Anda dapat menggunakan git reset

TAPI:

Saya menemukan pesan luar biasa ini yang sebenarnya menambahkan perintah git unadd (well, alias) untuk git unadd : lihat git unadd untuk detailnya atau ..

Adil

 git config --global alias.unadd "reset HEAD" 

Sekarang kamu bisa

 git unadd foo.txt bar.txt 
54
01 окт. jawabannya diberikan oleh electblake 01 oktober. 2010-10-01 17:54 '10 pada 17:54 2010-10-01 17:54

git remove atau git rm dapat digunakan untuk ini dengan flag --cached . Coba:

 git help rm 
45
08 дек. jawabannya diberikan oleh gnud 08 des . 2008-12-08 01:00 '08 pada 1:00 2008-12-08 01:00

Gunakan git add -i untuk menghapus file yang baru saja ditambahkan dari komit yang akan datang. Contoh:

Menambahkan file yang tidak Anda butuhkan:

 $ git add foo $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: foo # # Untracked files: # (use "git add <file>..." to include in what will be committed) # [...]# 

Aktifkan add interaktif untuk membatalkan add Anda (perintah yang diketik dalam git di sini: "r" (return), "1" (entri pertama dalam daftar akan kembali), "kembali" untuk keluar dari mode kembali, dan "q" (keluar):

 $ git add -i staged unstaged path 1: +1/-0 nothing foo *** Commands *** 1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked 5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp What now> r staged unstaged path 1: +1/-0 nothing [f]oo Revert>> 1 staged unstaged path * 1: +1/-0 nothing [f]oo Revert>> note: foo is untracked now. reverted one path *** Commands *** 1: [s]tatus 2: [u]pdate 3: [r]evert 4: [a]dd untracked 5: [p]atch 6: [d]iff 7: [q]uit 8: [h]elp What now> q Bye. $ 

Apa ini! Ini bukti Anda yang menunjukkan bahwa "foo" kembali ke daftar tanpa jejak:

 $ git status # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # [...] # foo nothing added to commit but untracked files present (use "git add" to track) $ 
41
18 апр. Balas diberikan oleh Alex North-Keys pada 18 April 2012-04-18 15:53 '12 pada 15:53 ​​2012-04-18 15:53

Di sini Anda dapat menghindari masalah yang tidak menyenangkan ini ketika meluncurkan proyek baru:

  • Buat direktori dasar untuk proyek baru Anda.
  • Jalankan git init .
  • Sekarang buat file .gitignore (walaupun kosong).
  • Perbaiki file .gitignore.

Git membuatnya sangat sulit untuk melakukan git reset jika Anda tidak memiliki komitmen. Jika Anda membuat komit awal kecil hanya untuk itu, maka Anda dapat git add -A dan git reset sebanyak yang Anda inginkan semuanya benar.

Keuntungan lain dari metode ini adalah bahwa jika Anda menemui masalah penyelesaian baris nanti dan Anda perlu memperbarui semua file Anda, itu mudah:

  • Perhatikan bahwa perbaikan awal. Ini akan menghapus semua file Anda.
  • Kemudian periksa komit terakhir Anda lagi. Ini akan mengembalikan salinan baru file Anda menggunakan pengaturan akhir baris saat ini.
36
25 сент. jawabannya diberikan oleh Ryan Lundy 25 September. 2011-09-25 02:34 '11 pada 2:34 pada 2011-09-25 02:34

Mungkin Git telah berkembang sejak Anda memposting pertanyaan Anda.

 $> git --version git version 1.6.2.1 

Sekarang Anda dapat mencoba:

 git reset HEAD . 

Ini pasti yang Anda cari.

32
19 нояб. Jawaban diberikan oleh Kokotte23 19 November. 2009-11-19 19:38 '09 pada 19:38 2009-11-19 19:38

Perhatikan bahwa jika Anda tidak menentukan revisi, Anda harus menyertakan pemisah. Contoh dari konsol saya:

 git reset <path_to_file> fatal: ambiguous argument '<path_to_file>': unknown revision or path not in the working tree. Use '--' to separate paths from revisions git reset -- <path_to_file> Unstaged changes after reset: M <path_to_file> 

(git versi 1.7.5.4)

32
23 янв. jawabannya diberikan powlo 23 januari . 2012-01-23 19:57 '12 pada 19:57 2012-01-23 19:57

Untuk menghapus file baru dari area pementasan (dan hanya dalam kasus file baru), seperti yang disarankan di atas:

 git rm --cached FILE 

Gunakan rm --cached hanya untuk file baru yang ditambahkan secara tidak sengaja.

29
22 июня '09 в 14:58 2009-06-22 14:58 jawabannya diberikan kepada Ran pada 22 Juni 2009 pada 14:58 2009-06-22 14:58

Dalam mengatur u>

 git reset * 
23
26 июля '12 в 10:50 2012-07-26 10:50 jawabannya diberikan Zorayr 26 Juli '12 pada 10:50 2012-07-26 10:50

gunakan perintah * untuk memproses banyak file sekaligus

 git reset HEAD *.prj git reset HEAD *.bmp git reset HEAD *gdb* 

dan seterusnya

23
28 авг. boulder_ruby adalah jawaban 28 Agustus. 2013-08-28 00:15 '13 pada 0:15 2013-08-28 00:15

Cukup ketik git reset , itu akan kembali, dan sepertinya Anda tidak pernah memasukkan git add . sejak komit terakhir. Pastikan untuk melakukan ini sebelumnya.

21
19 мая '10 в 6:49 2010-05-19 06:49 Jawaban diberikan oleh Donovan pada 19 Mei 10 di 6:49 2010-05-19 06:49

Misalkan saya membuat file baru newFile.txt .

2019

04 окт. jawabannya diberikan oleh Vidura Mudalige 04 Oktober. 2016-10-04 14:02 '16 pukul 14:02 2016-10-04 14:02

Untuk file tertentu:

  • git atur u>
  • git checkout my_file.txt

Untuk semua file yang ditambahkan:

  • git reset
  • Git checkout.

Catatan: checkout mengubah kode dalam file dan beralih ke status terakhir yang dikonfirmasi (dikonfirmasi). reset tidak mengubah kode; dia hanya menjatuhkan judul.

15
28 окт. jawabannya diberikan oleh Hasib Kamal pada 28 Oktober. 2017-10-28 09:03 '17 pada 9:03 2017-10-28 09:03

Perintah ini mengubah perubahan Anda:

 git reset HEAD filename.txt 

Anda juga bisa menggunakan

 git add -p 

untuk menambah bagian file.

12
31 янв. Jawabannya diberikan wallerjake 31 Jan 2013-01-31 18:43 '13 pada 18:43 2013-01-31 18:43

Saya terkejut bahwa tidak ada yang menyebutkan mode interaktif:

 git add -i 

Pilih opsi 3 untuk menambahkan file. Dalam kasus saya, saya sering ingin menambahkan beberapa file; online, Anda dapat menggunakan angka-angka ini untuk menambahkan file. Hanya membutuhkan 4: 1,2,3,5

Untuk memilih urutan, cukup masukkan 1-5 untuk mengambil semuanya dari 1 hingga 5.

Git file perantara

12
22 окт. Balas ke Jonathan 22 Oktober. 2015-10-22 16:03 '15 pada 16:03 2015-10-22 16:03

Untuk membatalkan git tambahkan gunakan

git reset filename

12
02 окт. balasan yang diberikan oleh Anirudh Sood 02 oct. 2016-10-02 18:54 '16 pada 18:54 2016-10-02 18:54

git add myfile.txt # ini akan menambahkan file Anda ke daftar commit

Berbeda dengan perintah ini,

 git reset HEAD myfile.txt # this will undo it. 

Jadi, Anda akan berada di kondisi sebelumnya. yang ditentukan akan kembali dalam daftar tanpa jejak (keadaan sebelumnya).

Dia akan mengatur u>

8
27 июня '17 в 16:58 2017-06-27 16:58 Jawaban diberikan oleh Mohideen ibn Mohammed pada 27 Juni '17 pada 16:58 2017-06-27 16:58
 git reset filename.txt 

Menghapus file bernama filename.txt dari indeks saat ini, area "akan dikomit", tanpa mengubah apa pun.

8
11 июля '16 в 21:40 2016-07-11 21:40 Jawaban diberikan oleh Rahul Sinha pada 11 Juli '16 pada 21:40 2016-07-11 21:40

Di SourceTree, Anda dapat dengan mudah melakukan ini melalui gui. Anda dapat memeriksa perintah sourcetree mana yang digunakan untuk menonaktifkan file.

Saya membuat file baru dan menambahkannya ke git. Lalu saya mematikannya menggunakan guit SourceTree. Ini hasilnya:

File yang tidak dipentaskan [08/12/15 10:43]
git -c diff. mnemonicprefix = false -c core. quotepath = kredensial -c palsu. helper = sourcetree reset -q - path /to/file/filename.java

SourceTree menggunakan reset untuk menonaktifkan file baru.

7
08 дек. jawabannya diberikan oleh miva2 08 des . 2015-12-08 12:58 '15 pada 12:58 2015-12-08 12:58
 git reset filename.txt 

Menghapus file bernama filename.txt dari indeks saat ini, area "akan dikomit", tanpa mengubah apa pun.

6
26 окт. Balas diberikan oleh Joseph Mathew pada 26 Okt 2017-10-26 21:15 '17 pada 21:15 2017-10-26 21:15
  • 1
  • 2

Pertanyaan lain tentang label atau Ajukan Pertanyaan