pengembangan-web-mp.com

Bagaimana cara menerima 'git add' sebelum melakukan?

Saya keliru menambahkan file ke git menggunakan perintah:

git add myfile.txt

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


Ada 48 jawaban sejauh ini (beberapa dihapus). Tolong jangan tambahkan yang baru kecuali Anda memiliki informasi baru.

8101
paxos1977

Anda dapat membatalkan git add sebelum melakukan

git reset <file>

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

Kamu bisa memakai

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 HEAD masing-masing, dan akan gagal jika HEAD tidak terdefinisi (karena Anda belum membuat komitmen dalam repo Anda) atau ambigu (karena Anda membuat cabang bernama HEAD, yang adalah hal bodoh yang tidak seharusnya kamu lakukan). Ini telah diubah di Git 1.8.2 , jadi, dalam versi modern Git 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).

9181
genehack

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 (cabang?) 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 melawan ketidakmampuan 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.

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

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

Saya terus menggunakan

git rm --cached .

untuk menghapus semuanya dan mulai lagi. Namun tidak berhasil, karena sementara add . bersifat rekursif, ternyata rm membutuhkan -r untuk diulang. Mendesah.

git rm -r --cached .

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

git add -n .

Saya zip semuanya ke tempat yang aman sebelum percaya git help rm tentang --cached tidak menghancurkan apa pun (dan bagaimana jika saya salah mengeja kata-kata itu).

2047
Rhubarb

Jika Anda mengetik:

git status

git akan memberi tahu Anda apa yang dipentaskan, dll, termasuk petunjuk tentang cara melepaskan panggung:

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

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

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

(use "git rm --cached <file>..." to unstage)
507
Paul Beckingham

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

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

git stage

git add hanya lebih mudah untuk mengetik alias untuk git stage

Sayang sekali tidak ada perintah git unstage atau 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
238
takeshin

Sebagai tambahan untuk jawaban yang diterima, jika file yang Anda tambahkan secara keliru berukuran besar, Anda mungkin akan memperhatikan bahwa, bahkan setelah menghapusnya dari indeks dengan 'git reset', ia masih menempati ruang dalam direktori .git. 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

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

Jadi, manakah undo asli dari git add?

git reset HEAD <file>?

atau

git rm --cached <file>?

Sebenarnya, dan jika saya tidak salah: tidak ada.

git addtidak dapat diurungkan - dengan aman, secara umum.

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

  1. Jika <file> adalah sebelumnya tidak dilacak, git addmenambahkannya ke cache, dengan kontennya saat ini.

  2. Jika <file> adalah sudah dilacak, git addmenyimpan konten saat ini (foto, versi) ke cache. Di GIT, tindakan ini masih disebut tambah, (bukan sekadar perbarui itu), karena dua versi berbeda (foto) suatu file dianggap sebagai dua item berbeda: maka, memang menambahkan item baru ke cache, untuk akhirnya dilakukan nanti.

Mengingat hal 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 apa-apa untuk menjalankan git rm --cached <file>.

Dan kita juga bisa menjalankan 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 HEAD tidak berfungsi, tetapi git rm --cached tidak: 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 di-cache sebelumnya, itu hanya menyinkronkannya kembali dari HEAD. Jika git add salah kami menimpa versi sebelumnya yang tidak dikomit, 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 lost irrevocably "version 2"
-version 1
+version 3

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


* (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)

161
leonbloy
git rm --cached . -r

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

91
braitsch

Menjalankan

git gui

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

85

Undo file yang sudah ditambahkan cukup mudah menggunakan git , untuk mengatur ulang myfile.txt yang sudah ditambahkan, gunakan:

git reset HEAD myfile.txt

Jelaskan:

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

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

 git reset HEAD file

82
Alireza

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 menggunakan 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 HEAD tidak akan berfungsi dengan satu file.

  • 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>
    
80
sjas

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

  1. menambahkan file baru ke area pementasan, lalu batalkan dengan git rm --cached file.
  2. menambahkan memodifikasi file 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 melakukan git rm --cached file pada file yang telah dimodifikasi (file yang 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 status akan memberi tahu Anda apakah file itu file baru atau dimodifikasi :

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
71
Michael_Scharf

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

61
Paul Betts

Sesuai dengan banyak jawaban lainnya, Anda dapat menggunakan git reset

TAPI:

Saya menemukan posting kecil yang hebat ini yang sebenarnya menambahkan perintah Git (juga 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
55
electblake

git remove atau git rm dapat digunakan untuk ini, dengan bendera --cached. Mencoba:

git help rm
46
gnud

Gunakan git add -i untuk 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 dilacak:

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

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

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

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

Keuntungan lain dari metode ini adalah bahwa 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.
37
Ryan Lundy

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.

33
Kokotte23

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)

33
powlo

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.

30
Ran

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

git reset *
24
Zorayr

gunakan perintah * untuk menangani beberapa file sekaligus

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

dll

24
boulder_ruby

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

22
Donovan

Misalkan saya membuat file baru newFile.txt.

 enter image description here

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

 enter image description here

Sekarang saya ingin membatalkan add ini, sebelum melakukan, git reset newFile.txt

 enter image description here

18
Vidura Mudalige

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.

17
Hasib Kamal

Untuk membatalkan git tambahkan gunakan

git reset filename

13
Anirudh Sood

Perintah ini akan melepaskan perubahan Anda:

git reset HEAD filename.txt

Anda juga bisa menggunakan

git add -p 

untuk menambah bagian file.

13
wallerjake

Saya terkejut bahwa tidak ada yang menyebutkan mode interaktif:

git add -i

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

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

Git file pementasan

13
Jonathan

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

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 (kondisi sebelumnya).

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

9
Silent Spectator
git reset filename.txt

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

9
Rahul Sinha

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. Lalu saya unstaged menggunakan SourceTree gui. Ini hasilnya:

File yang tidak dipentaskan [08/12/15 10:43]
.

SourceTree menggunakan reset untuk menghapus stage file baru.

8
miva2
git reset filename.txt  

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

7
Joseph Mathew

Salah satu solusi paling intuitif adalah menggunakan SourceTree .

Anda cukup menarik dan melepaskan file dari stage dan unstaged  enter image description here

7
Marcin Szymczak

Perintah git reset membantu Anda untuk memodifikasi area pementasan atau area pementasan dan pohon yang berfungsi. Kemampuan Git untuk membuat komitmen persis seperti yang Anda inginkan berarti bahwa Anda terkadang harus membatalkan perubahan terhadap perubahan yang Anda lakukan dengan git add.

Anda dapat melakukannya dengan memanggil git reset HEAD <file to change>. Anda memiliki dua opsi untuk menyingkirkan perubahan sepenuhnya. git checkout HEAD <file(s) or path(s)> adalah cara cepat untuk membatalkan perubahan pada area pementasan dan pohon kerja Anda. Berhati-hatilah dengan perintah ini, karena menghapus semua perubahan pada pohon kerja Anda. Git tidak tahu tentang perubahan itu karena mereka tidak pernah berkomitmen. Tidak ada cara untuk mendapatkan perubahan itu kembali setelah Anda menjalankan perintah ini.

Perintah lain yang Anda inginkan adalah git reset --hard. Ini sama merusak pohon kerja Anda - setiap perubahan yang tidak dikomit atau perubahan bertahap hilang setelah menjalankannya. Menjalankan git reset -hard HEAD melakukan hal yang sama dengan git checkout HEAD. Itu hanya tidak memerlukan file atau jalur untuk bekerja.

Anda dapat menggunakan --soft dengan git reset. Ini mengatur ulang repositori ke komit yang Anda tentukan dan tahapan semua perubahan itu. Perubahan apa pun yang telah Anda lakukan tidak akan terpengaruh, atau perubahan di pohon kerja Anda.

Akhirnya, Anda dapat menggunakan --mixed untuk mengatur ulang pohon yang berfungsi tanpa melakukan perubahan apa pun. Ini juga menghapus tahapan perubahan apa pun yang dilakukan.

1
SAIguru011