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?


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


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


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)

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

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)


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


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


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 .


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>
    

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

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


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

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

42

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

git help rm

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.

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.


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)


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.


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 *

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.


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.


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


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.


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.


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


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


10
git reset filename.txt

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


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.


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.


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.


git reset [nama file] ex: git reset src / main / java / com / dao / ImportCsvDataDaoImpl.java
Rohit Chaurasiya
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.