Bagaimana cara membatalkan 'git add' sebelum melakukan?

8965

Saya keliru menambahkan file ke Git menggunakan perintah:

git add myfile.txt

Saya belum lari git commit. Apakah ada cara untuk membatalkan ini, sehingga file-file ini tidak akan dimasukkan dalam komit?

paxos1977
sumber
22
Dimulai dengan Git v1.8.4, semua jawaban di bawah ini digunakan yang HEADatau headsekarang dapat menggunakan @di tempat HEADsebaliknya. Lihat jawaban ini (bagian terakhir) untuk mempelajari mengapa Anda bisa melakukan itu.
3
Saya membuat sedikit musim panas yang menunjukkan semua cara untuk melepaskan panggung file: stackoverflow.com/questions/6919121/…
Daniel Alder
5
Kenapa tidak git checkout?
Erik Reppen
13
@ErikReppen git checkouttidak menghapus perubahan bertahap dari indeks komit. Ini hanya mengembalikan perubahan yang tidak dipentaskan ke revisi yang dilakukan terakhir - yang omong-omong bukan apa yang saya inginkan juga, saya ingin perubahan itu, saya hanya ingin mereka di komit kemudian.
paxos1977
4
Jika Anda menggunakan Eclipse, sesederhana menghapus centang pada file di kotak dialog komit
Hamzahfrq

Jawaban:

10372

Anda dapat membatalkan git addsebelum komit dengan

git reset <file>

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

Kamu bisa menggunakan

git reset

tanpa nama file apa pun untuk menghapus tahapan perubahan yang terjadi. Ini bisa berguna ketika ada terlalu banyak file untuk dicantumkan satu per satu dalam jumlah waktu yang wajar.

Dalam versi lama Git, perintah di atas setara dengan git reset HEAD <file>dan git reset HEADmasing - masing, dan akan gagal jika HEADtidak terdefinisi (karena Anda belum membuat komitmen di repositori Anda) atau ambigu (karena Anda membuat cabang bernama HEAD, yang merupakan hal bodoh yang tidak seharusnya Anda lakukan). Ini diubah di Git 1.8.2 , jadi, di Git versi modern Anda dapat menggunakan perintah di atas bahkan sebelum membuat komit pertama Anda:

"git reset" (tanpa opsi atau parameter) digunakan untuk kesalahan ketika Anda tidak memiliki komit dalam sejarah Anda, tetapi sekarang memberi Anda indeks kosong (untuk mencocokkan komit tidak ada Anda bahkan tidak aktif).

genhack
sumber
92
Tentu saja, ini bukan benar-benar dibatalkan, karena jika kesalahan git addmenimpa versi uncommited yang dipentaskan sebelumnya, kami tidak dapat memulihkannya. Saya mencoba menjelaskan ini dalam jawaban saya di bawah.
leonbloy
7
git reset HEAD *.extdi mana extfile dari ekstensi yang diberikan ingin Anda hapus. Bagi saya itu *.bmp&*.zip
boulder_ruby
18
@ Jonny, indeks (alias area pementasan) berisi semua file, bukan hanya file yang diubah. Itu "mulai hidup" (ketika Anda memeriksa komit atau mengkloning repo) sebagai salinan dari semua file dalam komit yang ditunjuk oleh HEAD. Jadi, jika Anda menghapus file dari indeks ( git rm --cached) itu berarti Anda sedang bersiap untuk membuat komit yang menghapus file itu. git reset HEAD <filename>di sisi lain akan menyalin file dari KEPALA ke indeks, sehingga komit berikutnya tidak akan menunjukkan perubahan yang dibuat untuk file itu.
Wildcard
11
Saya baru tahu ada yang git reset -pseperti itu git add -p. Ini luar biasa!
donquixote
10
Anda benar - benar dapat memulihkan overwriten yang sebelumnya dipentaskan tetapi perubahan tidak dikomit tetapi tidak dengan cara yang ramah pengguna dan tidak 100% aman (setidaknya tidak ada yang saya temukan): goto .git / objek, cari file yang dibuat pada saat git addAnda ingin memulihkan ( 61/3AF3...- > object id 613AF3...), lalu git cat-file -p <object-id>(mungkin layak untuk memulihkan beberapa jam kerja tetapi juga pelajaran untuk melakukan lebih sering ...)
Peter Schneider
2151

Kamu ingin:

git rm --cached <added_file_to_undo>

Pemikiran:

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

git reset .

(untuk membatalkan seluruh penambahan awal saya), hanya untuk mendapatkan pesan bermanfaat ini (tidak begitu):

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

Ternyata ini karena HEAD ref (branch?) Tidak ada sampai setelah komit pertama. Artinya, Anda akan mengalami masalah pemula yang sama dengan saya jika alur kerja Anda, seperti milik saya, adalah sesuatu seperti:

  1. cd ke direktori proyek baru saya yang hebat untuk mencoba Git, hotness baru
  2. git init
  3. git add .
  4. git status

    ... banyak gulungan omong kosong oleh ...

    => Sial, saya tidak ingin menambahkan semua itu.

  5. google "undo git add"

    => temukan Stack Overflow - yay

  6. git reset .

    => fatal: Gagal menyelesaikan 'KEPALA' sebagai referensi yang valid.

Lebih lanjut ternyata ada bug yang dicatat karena tidak membantu hal ini di milis.

Dan bahwa solusi yang tepat ada di sana di keluaran status Git (yang, ya, saya anggap sebagai 'omong kosong)

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

Dan solusinya adalah menggunakan git rm --cached FILE.

Catat peringatan di tempat lain di sini - git rmmenghapus salinan file lokal yang berfungsi, tetapi tidak jika Anda menggunakan --cached . Inilah hasil dari git help rm:

--cached Gunakan opsi ini untuk menghapus stage dan menghapus path hanya dari indeks. File pohon yang berfungsi, apakah diubah atau tidak, akan ditinggalkan.

Saya mulai menggunakan

git rm --cached .

untuk menghapus semuanya dan mulai lagi. Namun tidak berhasil, karena sementara add .bersifat rekursif, ternyata rmperlu -rberulang. Mendesah.

git rm -r --cached .

Oke, sekarang saya kembali ke tempat saya mulai. Lain kali saya akan gunakan -nuntuk melakukan dry run dan melihat apa yang akan ditambahkan:

git add -n .

Saya zip semuanya ke tempat yang aman sebelum percaya git help rmtentang --cachedtidak menghancurkan apa-apa (dan bagaimana jika saya salah mengeja itu).

Perkelahian
sumber
15
Hah. Saya mengikuti proses yang sama ini. Kecuali saya menyerah dan berkata rm -rf .git, git initkarena saya tidak percaya git rm --cacheduntuk menyimpan copy pekerjaan saya. Dikatakan sedikit bagaimana git masih terlalu kompleks di beberapa tempat. git unstageseharusnya hanya perintah standar stok, saya tidak peduli jika saya bisa menambahkannya sebagai alias.
Adrian Macneil
5
Bagi saya git mengatakangit reset HEAD <File>...
drahnr
16
git rm --cached <file> sebenarnya jawaban yang benar, jika itu adalah impor awal <file> ke dalam repositori. Jika Anda mencoba untuk menghapus perubahan pada file, git reset adalah jawaban yang benar. Orang yang mengatakan bahwa jawaban ini salah sedang memikirkan pertanyaan yang berbeda.
Barry Kelly
14
Ini sebenarnya akan berfungsi, tetapi hanya pada komit pertama, di mana file tidak ada sebelumnya, atau di mana git addperintah menambahkan file baru, tetapi tidak berubah ke file yang ada.
naught101
4
hanya menunjukkan bagaimana intuisi dan git berbelit-belit. alih-alih memiliki perintah "batalkan" paralel, Anda harus mencari tahu cara membatalkannya. Seperti mencoba membebaskan kaki Anda di pasir cepat, dan kemudian membuat lengan Anda macet, kemudian membuat lengan Anda lainnya macet ... setiap perintah harus dilakukan melalui GUI, dengan item menu dropdown untuk opsi ... Pikirkan semua UI, peningkatan produktivitas yang kami miliki, tetapi kami memiliki antarmuka antarmuka perintah retro yang berantakan ini. Ini tidak seperti program git GUI yang membuatnya lebih intuitif.
ahnbizcad
532

Jika Anda mengetik:

git status

Git akan memberi tahu Anda apa yang dipentaskan, dll., Termasuk instruksi tentang cara unstage:

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

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

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

(use "git rm --cached <file>..." to unstage)
Paul Beckingham
sumber
19
Pesan akan berbeda tergantung pada apakah addfile ed sudah dilacak ( addsatu - satunya menyimpan versi baru ke cache - di sini akan ditampilkan pesan Anda). Di tempat lain, jika file itu sebelumnya tidak dipentaskan, itu akan menampilkanuse "git rm --cached <file>..." to unstage
leonbloy
Bagus! Yang git reset HEAD <file>ini adalah satu-satunya yang akan bekerja jika Anda ingin menghapus
stage
2
Versi git saya 2.14.3 mengatakan git reset HEADuntuk unstage.
SilverWolf - Reinstate Monica
246

Untuk memperjelas: git addmemindahkan perubahan dari direktori kerja saat ini ke area pementasan (indeks).

Proses ini disebut pementasan . Jadi perintah yang paling alami untuk melakukan perubahan (file yang diubah) adalah yang jelas:

git stage

git add hanya alias yang lebih mudah diketik untuk git stage

Sayang sekali tidak ada perintah git unstageatau pun tidak git unadd. Yang relevan 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 perintah baru:

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

Secara pribadi saya menggunakan alias yang lebih pendek:

git a # For staging
git u # For unstaging
takeshin
sumber
3
"bergerak"? Ini akan menunjukkan itu telah pergi dari direktori kerja. Bukan itu masalahnya.
Thomas Weller
4
Mengapa ini jelas?
Lenar Hoyt
Sebenarnya, git stageadalah alias untuk git add, yang merupakan perintah bersejarah, baik pada Git dan SCM lainnya. Telah ditambahkan pada bulan Desember 2008 dengan komit 11920d28da di "Git's git repository", jika saya bisa mengatakannya.
Obsidian
1
Ini mungkin tidak berhubungan, tetapi saya telah menemukan memvalidasi file sebelum bahkan menambahkan menjadi ide yang berguna, sesuatu seperti check-command nama file && git add nama file, saya mengganti git dengan g yang lebih pendek di mesin saya, dan sejauh ini telah bekerja ok untuk saya: github.com/dataf3l/g , saya tidak tahu apakah ini akan berguna bagi seseorang, tapi saya akan taruh di sini dengan harapan menghemat waktu beberapa orang.
Felipe Valdes
167

Tambahan untuk jawaban yang diterima, jika file Anda yang keliru ditambahkan sangat besar, Anda mungkin akan melihat bahwa, bahkan setelah menghapusnya dari indeks dengan ' git reset', tampaknya masih menempati ruang dalam .gitdirektori.

Ini tidak perlu dikhawatirkan; file tersebut memang masih dalam repositori, tetapi hanya sebagai "objek longgar". Itu tidak akan disalin ke repositori lain (melalui klon, push), dan ruang akhirnya akan direklamasi - meskipun mungkin tidak segera. Jika Anda cemas, Anda dapat menjalankan:

git gc --prune=now

Pembaruan (yang berikut adalah upaya saya untuk menghapus beberapa kebingungan yang dapat timbul dari jawaban yang paling banyak dipilih):

Jadi, yang merupakan nyata undo dari git add?

git reset HEAD <file> ?

atau

git rm --cached <file>?

Sebenarnya, dan jika saya tidak salah: tidak ada .

git add tidak dapat dibatalkan - dengan aman, secara umum.

Mari kita ingat dulu apa yang git add <file>sebenarnya dilakukannya:

  1. Jika <file>itu sebelumnya tidak dilacak , git add menambahkan ke cache , dengan konten saat ini.

  2. Jika <file>itu sudah dilacak , git add menyimpan konten saat ini (snapshot, versi) ke cache. Di Git, tindakan ini masih disebut add , (bukan sekadar memperbaruinya ), karena dua versi (snapshot) file yang berbeda dianggap sebagai dua item berbeda: karenanya, kami memang menambahkan item baru ke cache, untuk menjadi yang terakhir dilakukan nanti.

Sehubungan dengan ini, pertanyaannya sedikit ambigu:

Saya keliru menambahkan file menggunakan perintah ...

Skenario OP tampaknya menjadi yang pertama (file tidak terlacak), kami ingin "undo" menghapus file (bukan hanya konten saat ini) dari item yang dilacak. Jika ini masalahnya, maka tidak masalah untuk dijalankan git rm --cached <file>.

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

Tetapi ada dua peringatan.

Pertama: Ada (seperti yang ditunjukkan dalam jawaban) hanya satu skenario di mana git reset HEADtidak berfungsi, tetapi git rm --cachedtidak: repositori baru (tidak ada komitmen). Tapi, sungguh, ini kasus yang praktis tidak relevan.

Kedua: Sadarilah bahwa git reset HEAD tidak dapat secara ajaib memulihkan konten file yang sebelumnya di-cache, itu hanya menyinkronkannya kembali dari KEPALA. Jika salah kaprah kami git addmenimpa versi tidak berkomitmen yang dipentaskan sebelumnya, kami tidak dapat memulihkannya. Karena itulah, 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 irrevocably lost "version 2"
-version 1
+version 3

Tentu saja, ini tidak terlalu kritis jika kita hanya mengikuti alur kerja malas melakukan 'git add' hanya untuk menambahkan file baru (kasus 1), dan kami memperbarui konten baru melalui komit, git commit -aperintah.


* (Sunting: di atas secara praktis benar, tetapi masih ada beberapa cara yang agak retas / berbelit-belit untuk memulihkan perubahan yang dipentaskan, tetapi tidak dilakukan dan kemudian ditimpa - lihat komentar oleh Johannes Matokic dan iolsmit)

leonbloy
sumber
4
Sebenarnya ada cara untuk memulihkan file yang sudah dipentaskan yang diganti dengan git add. Seperti yang Anda sebutkan git add membuat objek git untuk file itu yang akan menjadi objek longgar tidak hanya saat menghapus file sepenuhnya tetapi juga ketika ditimpa dengan konten baru. Tetapi tidak ada perintah untuk memulihkannya secara otomatis. Sebaliknya file harus diidentifikasi dan diekstraksi secara manual atau dengan alat yang hanya ditulis untuk kasus ini (libgit2 akan memungkinkan ini). Tetapi ini hanya akan membayar jika file tersebut sangat penting dan besar dan tidak dapat dibangun kembali dengan mengedit versi sebelumnya.
Johannes Matokic
2
Untuk memperbaiki diri saya: Setelah file objek longgar ditemukan (gunakan meta-data seperti tanggal / waktu pembuatan) git cat-filedapat digunakan untuk memulihkan kontennya.
Johannes Matokic
2
Cara lain untuk memulihkan perubahan yang dipentaskan tetapi tidak dilakukan dan kemudian ditimpa oleh misalnya yang lain git addadalah melalui git fsck --unreachableitu akan mendaftar semua objek yang tidak dapat dijangkau, yang kemudian dapat Anda periksa dengan git show SHA-1_IDatau git fsck --lost-foundyang akan> Menulis objek menggantung ke dalam .git/lost-found/commit/atau .git/lost-found/other/, tergantung pada jenisnya. Lihat jugagit fsck --help
iolsmit
110

Membatalkan file yang sudah ditambahkan cukup mudah menggunakan Git. Untuk mengatur ulang myfile.txt, yang telah ditambahkan, gunakan:

git reset HEAD myfile.txt

Penjelasan:

Setelah Anda mengatur file yang tidak diinginkan, untuk membatalkan, Anda dapat melakukannya git reset. Headadalah kepala file Anda di lokal dan parameter terakhir adalah nama file Anda.

Saya telah membuat langkah-langkah pada gambar di bawah ini secara lebih rinci untuk Anda, termasuk semua langkah yang mungkin terjadi dalam kasus ini:

git atur ulang file HEAD

Alireza
sumber
Gambar: "Perintah tambahkan ...""Perintah menambahkan ..." ( present simple tense, person ketiga )
Peter Mortensen
Gambar: inginingin (tidak perlu menggunakan bahasa gaul di sini)
Peter Mortensen
92
git rm --cached . -r

akan "un-add" semua yang Anda tambahkan dari direktori Anda saat ini secara rekursif

braitsch
sumber
3
Saya tidak ingin menghapus semua, hanya SATU file tertentu.
paxos1977
3
Juga membantu jika Anda tidak memiliki komitmen sebelumnya. Dengan tidak adanya komitmen sebelumnya, git reset HEAD <file>akan mengatakanfatal: Failed to resolve 'HEAD' as a valid ref.
Priya Ranjan Singh
6
Tidak, ini menambahkan sebuah penghapusan dari segala sesuatu di direktori Anda saat ini. Sangat berbeda dengan hanya perubahan unstaging.
Mark Amery
88

Lari

git gui

dan hapus semua file secara manual atau dengan memilih semuanya dan mengklik unstage dari tombol komit .

Khaja Minhajuddin
sumber
1
Ya aku mengerti itu. Saya hanya ingin secara implisit menyarankan bahwa Anda mengindikasikan bahwa pada jawaban Anda seperti "Anda dapat menggunakan git-gui...." :)
Alexander Suraphel
1
Dikatakan, "git-gui: perintah tidak ditemukan". Saya tidak yakin apakah ini berhasil.
Parinda Rajapaksha
Wow, ini jauh lebih mudah daripada melakukan perintah baris yang tidak Anda mengerti. Ini sangat direkomendasikan untuk pemula seperti saya. Terima kasih telah menulis ini!
Irfandy Jip
Terima kasih. Tidak mau mengambil risiko, jadi harus menggunakan GUI.
Sagar Khatri
83

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

Apa yang Anda lakukan sebelumnya:

  • Mengubah file dan digunakan git add ., atau git add <file>.

Apa maumu:

  • 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, batalkan perubahan dan hapus dari indeks:

    # Think `svn revert <file>` IIRC.
    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>
    
sja
sumber
1
Saya tidak tahan dengan perbedaan 'git reset head <file>' dan 'git rm --cached <file>. Bisakah Anda menjelaskannya?
jeswang
6
File @jeswang dapat 'diketahui' untuk git (perubahan di dalamnya sedang dilacak.), atau file tersebut tidak 'diversi'. reset headbatalkan perubahan Anda saat ini, tetapi file tersebut masih dipantau oleh git. rm --cachedmengeluarkan file dari versi, jadi git tidak lagi memeriksanya untuk perubahan (dan juga menghapus perubahan sekarang yang diindeks, disuruh git oleh yang sebelumnya add), tetapi file yang diubah akan disimpan dalam copy pekerjaan Anda, yaitu di folder file Anda pada HDD.
Sjas
3
Perbedaannya bersifat git reset HEAD <file>sementara - perintah hanya akan diterapkan pada komit berikutnya, tetapi git rm --cached <file>akan menghapus tahapan sampai ditambahkan lagi dengan git add <file>. Juga, git rm --cached <file>berarti jika Anda mendorong cabang itu ke remote, siapa pun yang menarik cabang itu akan menghapus file yang SEBENARNYA dari folder mereka.
DrewT
80

Pertanyaannya tidak diajukan dengan jelas. Alasannya adalah git addada dua makna:

  1. menambahkan file baru ke area pementasan, lalu batalkan dengan git rm --cached file.
  2. menambahkan file yang dimodifikasi ke area pementasan, lalu batalkan dengan git reset HEAD file.

Jika ragu, gunakan

git reset HEAD file

Karena melakukan hal yang diharapkan dalam kedua kasus.

Peringatan: jika Anda melakukannya git rm --cached filepada file yang diubah (file yang sudah ada sebelumnya di repositori), maka file tersebut akan dihapus pada git commit! Itu masih akan ada di sistem file Anda, tetapi jika orang lain menarik komit Anda, file tersebut akan dihapus dari pohon kerja mereka.

git statusakan memberi tahu Anda jika file itu file 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
Michael_Scharf
sumber
7
+1. Sejumlah luar biasa dari jawaban dan komentar yang sangat tinggi di halaman ini benar-benar keliru tentang perilaku git rm --cached somefile. Saya berharap jawaban ini membuat jalan ke halaman ke posisi yang menonjol di mana ia dapat melindungi pemula dari disesatkan oleh semua klaim palsu.
Mark Amery
salah satu jawaban terbaik di sini, sayangnya itu cukup rendah pada daftar
Creos
64

Jika Anda berada di komit awal dan tidak dapat digunakan git reset, cukup nyatakan "Git kebangkrutan" dan hapus .gitfolder dan mulai lagi dari awal

Ana Betts
sumber
5
Salah satu tipnya adalah menyalin file .git / config Anda jika Anda telah menambahkan asal remote, sebelum menghapus folder.
Tiago
4
Komentar @ChrisJohnsen tepat. Terkadang, Anda ingin mengkomit semua file kecuali satu: git add -A && git rm --cached EXCLUDEFILE && git commit -m 'awesome commit' (Ini juga berfungsi ketika tidak ada komit sebelumnya, ulang Failed to resolve 'HEAD'masalah)
57

Sesuai dengan banyak jawaban lain, Anda dapat menggunakan git reset

TAPI:

Saya menemukan posting kecil yang hebat ini yang benar-benar menambahkan perintah Git (well, alias) untuk git unadd: lihat git unadd untuk detail atau ..

Secara sederhana,

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

Sekarang kamu bisa

git unadd foo.txt bar.txt
electblake
sumber
45

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

Menambahkan file yang tidak Anda inginkan:

$ 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)
# [...]#

Masuk ke add interaktif untuk membatalkan add Anda (perintah yang diketik di git di sini adalah "r" (revert), "1" (entri pertama dalam daftar revert shows), 'kembali' untuk keluar dari mode revert, dan "q" (berhenti):

$ 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.
$

Itu dia! Ini buktinya, menunjukkan bahwa "foo" kembali ke daftar yang tidak terlacak:

$ 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)
$
Alex North-Keys
sumber
42

git removeatau git rmdapat digunakan untuk ini, dengan --cachedbendera. Mencoba:

git help rm
Agak
sumber
9
Bukankah ini akan menghapus file sama sekali?
Willa
8
git rm --cached ...akan menghapus file dari repo git. Mereka masih akan ada di komputer Anda, tetapi ini SANGAT berbeda dari perubahan yang tidak dipentaskan ke file. Bagi siapa pun yang menemukan ini, itu bukan jawaban yang valid untuk pertanyaan itu.
Addison
38

Berikut adalah cara untuk menghindari masalah yang menjengkelkan ini ketika Anda memulai proyek baru:

  • Buat direktori utama untuk proyek baru Anda.
  • Lari git init.
  • Sekarang buat file .gitignore (walaupun kosong).
  • Komit file .gitignore Anda.

Git membuatnya sangat sulit untuk dilakukan git resetjika Anda tidak memiliki komitmen. Jika Anda membuat komitmen awal kecil hanya untuk memilikinya, setelah itu Anda bisa git add -Adan git resetsebanyak yang Anda inginkan untuk mendapatkan semuanya dengan benar.

Keuntungan lain dari metode ini adalah jika Anda mengalami masalah akhir baris nanti dan perlu menyegarkan semua file Anda, mudah:

  • Lihat komit awal itu. Ini akan menghapus semua file Anda.
  • Lalu periksa komit terbaru Anda lagi. Ini akan mengambil salinan baru file Anda, menggunakan pengaturan akhir baris Anda saat ini.
Ryan Lundy
sumber
1
Dikonfirmasi! Mencoba mengatur ulang git setelah penambahan git. dan git mengeluh tentang KEPALA yang korup. Mengikuti saran Anda, saya bisa git tambah & reset bolak-balik tanpa masalah :)
Kounavi
1
Bagian kedua berfungsi, tetapi agak canggung. Cara penanganan akhir baris, tergantung pada autocrlfnilai ... Ini tidak akan berfungsi di setiap proyek, tergantung pengaturannya.
sjas
1
Jawaban ini masuk akal pada saat itu diposting, tetapi sekarang sudah usang; git reset somefiledan git resetkeduanya berfungsi sebelum membuat komitmen pertama, sekarang. Ini telah menjadi kasus sejak beberapa rilis Git kembali.
Mark Amery
@MarkAmery, Anda mungkin benar (itu akan keren jika Anda memposting sumber untuk pernyataan Anda), tetapi masih ada nilai dalam memulai repo Anda dengan satu atau dua komit bersih.
Ryan Lundy
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 harus menjadi apa yang Anda cari.

Kokotte23
sumber
2
Tentu, tetapi kemudian Anda memiliki pertanyaan lanjutan tentang bagaimana seseorang harus menghapus satu dari dua (atau lebih) file yang ditambahkan. Manual "git reset" menyebutkan bahwa "git reset <paths>" adalah kebalikan dari "git add <paths>", namun.
Alex North-Keys
34

Perhatikan bahwa jika Anda gagal menentukan revisi maka 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)

Powlo
sumber
2
Saya mencoba git reset <path>dan berfungsi dengan baik tanpa pemisah. Saya juga menggunakan git 1.9.0. Mungkin itu tidak berfungsi di versi yang lebih lama?
31

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.

Ran
sumber
4
Pikiran bahwa itu --cachedadalah bagian yang sangat penting di sini.
takeshin
1
-1; tidak, ini tidak menghapus file, itu menghapus file (tanpa benar-benar menghapusnya dari pohon pekerjaan Anda).
Mark Amery
25

Untuk mengatur ulang setiap file dalam folder tertentu (dan subfoldernya), Anda dapat menggunakan perintah berikut:

git reset *
Zorayr
sumber
4
Sebenarnya, ini tidak mengatur ulang setiap file karena * menggunakan ekspansi shell dan mengabaikan dotfiles (dan dot-directories).
Luc
Anda dapat menjalankan git statusuntuk melihat apa pun yang tersisa dan mengatur ulang secara manual yaitu git reset file.
Zorayr
25

Gunakan *perintah untuk menangani banyak file sekaligus:

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

dll.

boulder_ruby
sumber
3
Pikiran bahwa * biasanya tidak akan menyertakan dotfiles atau 'dot-directories' kecuali jika Anda secara eksplisit menentukan .*atau.*.prj
Luc
23

Cukup ketik git resetitu akan kembali kembali dan sepertinya Anda tidak pernah mengetik git add .sejak komit terakhir Anda. Pastikan Anda sudah berkomitmen sebelumnya.

Donovan
sumber
Seperti yang terjadi, ada komit terakhir ... tapi saya secara khusus bertanya tentang menghapus satu file dari komit, tidak setiap file dari komit.
paxos1977
20

Misalkan saya membuat file baru, newFile.txt:

Masukkan deskripsi gambar di sini

Misalkan saya menambahkan file tidak sengaja, git add newFile.txt:

Masukkan deskripsi gambar di sini

Sekarang saya ingin membatalkan pengaya ini, sebelum komit, git reset newFile.txt:

Masukkan deskripsi gambar di sini

Vidura Mudalige
sumber
Misalkan saya pada foto pertama yang berarti saya belum melakukan "git.add". Juga, saya sama sekali tidak menginginkan semua perubahan ini. Maksud saya ketika saya melakukan status git, seharusnya tidak menampilkan file merah. Maksud saya itu harus disinkronkan seolah-olah tidak ada file tunggal diubah sejak dorongan git terakhir. bagaimana mencapainya.
Unbreakable
JADI, misalkan Anda baru pada langkah pertama. Dan Anda ingin menyingkirkan semua perubahan yang telah Anda lakukan yang membuat "newFile.txt" menjadi merah.
Unbreakable
Ketika saya melakukan status git. Saya seharusnya tidak melihat perubahan sama sekali. Semua file merah harus dikembalikan.
Unbreakable
Hai, saya pikir pertanyaan Anda adalah bagaimana cara menghapus file yang tidak terlacak dari pohon saat ini. Untuk itu, Anda dapat menggunakan "git clean -f -d". Ini juga akan menghapus direktori yang tidak terlacak.
Vidura Mudalige
Jika Anda tidak ingin menghapus file yang tidak dilacak, abaikan saja tanda "-f".
Vidura Mudalige
19

Untuk file tertentu:

  • git atur ulang my_file.txt
  • git checkout my_file.txt

Untuk semua file yang ditambahkan:

  • git reset.
  • git checkout.

Catatan: checkout mengubah kode dalam file dan pindah ke keadaan terakhir (berkomitmen). reset tidak mengubah kode; itu hanya me-reset header.

Hasib Kamal
sumber
3
Tolong jelaskan perbedaan antara git reset <file>dan git checkout <file>.
Trent
1
reset tidak mengubah file, cukup jauhkan dari panggung (= indeks, di mana ia diletakkan oleh git add)
franc
checkout mengubah kode dalam file dan pindah ke status terakhir yang diperbarui. reset tidak mengubah kode-kode itu hanya mengatur ulang header. Sebagai contoh, setel ulang penggunaan untuk file yang ditambahkan atau dikomit ulang sebelum push dan checkout gunakan untuk kembali ke tahap terakhir yang diperbarui / dikomit sebelum git menambahkan.
Hasib Kamal
1
reset = hapus file dari panggung namun perubahan masih akan ada. checkout = mendapatkan file yang diperbarui dari repositori dan akan menimpa file saat ini
Imam Bux
14

Perintah ini akan membatalkan perubahan Anda:

git reset HEAD filename.txt

Anda juga bisa menggunakan

git add -p 

untuk menambahkan bagian file.

wallerjake
sumber
14

Ada juga mode interaktif:

git add -i

Pilih opsi 3 untuk menghapus file. Dalam kasus saya, saya sering ingin menambahkan lebih dari satu file, dan dengan mode interaktif Anda dapat menggunakan angka seperti ini untuk menambahkan file. Ini akan mengambil semua kecuali 4: 1, 2, 3, dan 5

Untuk memilih urutan, cukup ketik 1-5 untuk mengambil semua dari 1 hingga 5.

Git pementasan file

Jonathan
sumber
"Saya terkejut bahwa tidak ada yang menyebutkan mode interaktif" - mereka melakukannya: stackoverflow.com/a/10209776/1709587
Mark Amery
14

Untuk membatalkan git add, gunakan:

git reset filename
Anirudh Sood
sumber
10
git reset filename.txt

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

Rahul Sinha
sumber
10

git add myfile.txt # Ini akan menambahkan file Anda ke dalam daftar yang harus dikomit

Kebalikan dari perintah ini adalah,

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

jadi, Anda akan berada di kondisi sebelumnya. Ditentukan akan kembali dalam daftar tidak terlacak (keadaan sebelumnya).

Ini akan mengatur ulang kepala Anda dengan file yang ditentukan. jadi, jika kepala Anda tidak memiliki arti, itu hanya akan meresetnya.

Mohideen bin Mohammed
sumber
9

Di Sourcetree Anda dapat melakukan ini dengan mudah melalui GUI. Anda dapat memeriksa perintah mana yang digunakan Sourcetree untuk menghapus stage file.

Saya membuat file baru dan menambahkannya ke Git. Kemudian saya unstaged menggunakan GUI Sourcetree. Ini hasilnya:

Menghapus file [08/12/15 10:43] git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q - path / ke / file / filename.java

Sourcetree digunakan resetuntuk menghapus file baru.

miva2
sumber
Ya, teknik yang sama dapat digunakan dengan TortoiseGit , mendapatkan perintah Git untuk kasus penggunaan umum.
Peter Mortensen
8
git reset filename.txt  

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

Joseph Mathew
sumber
git reset [nama file] ex: git reset src / main / java / com / dao / ImportCsvDataDaoImpl.java
Rohit Chaurasiya