Pertanyaan Bagaimana cara membatalkan 'git add' sebelum melakukan commit?


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?


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


7450
2017-12-07 21:57


asal


Jawaban:


Anda dapat membatalkan git add sebelum berkomitmen dengan

git reset <file>

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

Kamu dapat memakai

git reset

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

Di 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 apa pun dalam repo Anda) atau ambigu (karena Anda membuat cabang bernama HEAD, yang merupakan hal bodoh yang seharusnya tidak Anda lakukan). Ini diubah dalam Git 1.8.2Namun demikian, dalam versi modern Git Anda dapat menggunakan perintah di atas bahkan sebelum membuat komitmen pertama Anda:

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


8357
2017-12-07 22:30



Kamu ingin:

git rm --cached <added_file_to_undo>

Pemikiran:

Ketika saya baru ini, saya pertama kali mencoba

git reset .

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

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 seperti saya jika alur kerja Anda, seperti saya, adalah sesuatu seperti:

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

    ... banyak gulungan omong kosong oleh ...

    => Sial, aku tidak ingin menambahkan semua itu.

  5. google "undo git add"

    => temukan Stack Overflow - yay

  6. git reset .

    => fatal: Gagal menyelesaikan 'HEAD' sebagai ref valid.

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

Dan bahwa solusi yang benar ada di sana dalam output status Git (yang, ya, saya dipoles sebagai 'omong kosong')

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

Dan solusinya memang harus digunakan git rm --cached FILE.

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

--cached       Gunakan opsi ini untuk membongkar dan menghapus jalur hanya dari indeks.       File pohon kerja, apakah dimodifikasi atau tidak, akan ditinggalkan.

Saya mulai menggunakannya

git rm --cached .

untuk menghapus semuanya dan mulai lagi. Tidak berhasil, karena sementara add . adalah rekursif, ternyata rm kebutuhan -r untuk rekursi. Mendesah.

git rm -r --cached .

Oke, sekarang saya kembali ke tempat saya mulai. Lain kali aku akan menggunakannya -n untuk melakukan lari kering dan melihat apa yang akan ditambahkan:

git add -n .

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


1950
2018-03-25 16:20



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

484
2017-12-07 23:22



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

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

git stage

git add hanya lebih mudah untuk mengetik alias git stage

Kasihan tidak ada git unstage maupun git unadd perintah. Yang relevan lebih sulit ditebak atau diingat, tetapi cukup jelas:

git reset HEAD --

Kita 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

220
2017-09-10 20:28



Tambahan untuk jawaban yang diterima, jika file Anda yang salah ditambahkan sangat besar, Anda mungkin akan memperhatikan itu, bahkan setelah menghapusnya dari indeks dengan 'git reset', tampaknya masih menempati ruang di .git direktori. Ini tidak perlu dikhawatirkan, file ini memang masih dalam repositori, tetapi hanya sebagai "objek longgar", file ini tidak akan disalin ke repositori lain (melalui klon, dorong), dan ruang akhirnya akan direklamasi - meskipun mungkin tidak secepat itu. Jika Anda cemas, Anda dapat menjalankan:

git gc --prune=now

Memperbarui (Berikut ini adalah usaha saya untuk menghapus beberapa kebingungan yang dapat muncul dari jawaban yang paling banyak dipilih):

Jadi, yang nyata membuka dari git add?

git reset HEAD <file> ?

atau

git rm --cached <file>?

Sebenarnya, dan jika saya tidak salah: tidak ada.

git add  tidak bisa dibatalkan - aman, secara umum.

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

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

  2. Jika <file> adalah sudah dilacak, git add  menyimpan konten saat ini (snapshot, versi) ke cache. Di GIT, tindakan ini masih disebut menambahkan, (bukan hanya memperbarui itu), karena dua versi yang berbeda (snapshot) dari sebuah file dianggap sebagai dua item yang berbeda: karenanya, kita memang menambahkan item baru ke cache, untuk akhirnya dilakukan nanti.

Dalam terang ini, pertanyaannya sedikit ambigu:

Saya keliru menambahkan file menggunakan perintah ...

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

Dan kita juga bisa lari git reset HEAD <file>. Ini secara umum lebih baik, karena berfungsi dalam kedua skenario: ini juga melakukan undo ketika kita salah menambahkan versi dari item yang sudah dilacak.

Tetapi ada dua keberatan.

Pertama: Ada (seperti yang disebutkan dalam jawaban) hanya satu skenario di mana git reset HEAD tidak berfungsi, tapi git rm --cached tidak: repositori baru (tidak ada commit). Tapi, sungguh, ini kasus yang praktis tidak relevan.

Kedua: Ketahuilah itu git reset HEAD  tidak bisa secara ajaib memulihkan isi file yang di-cache sebelumnya, itu hanya menyinkronkan ulang dari HEAD. Jika salah kami git add overwrote versi tanpa komitmen yang dipentaskan sebelumnya, kami tidak dapat memulihkannya. Itu sebabnya, tegasnya, kita tidak bisa membatalkannya.

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 yang biasa melakukan 'git add' hanya untuk menambahkan file baru (kasus 1), dan kami memperbarui konten baru melalui commit, git commit -a perintah.


136
2018-05-18 18:05



git rm --cached . -r

akan "tidak menambahkan" semua yang telah Anda tambahkan dari direktori saat ini secara rekursif


85
2017-12-09 21:19



Menjalankan

git gui

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


77
2017-10-12 01:12



Git memiliki perintah untuk setiap tindakan yang dapat dibayangkan, tetapi membutuhkan pengetahuan yang luas untuk menyelesaikan segala sesuatunya dengan benar dan karena itu sangat kontra-intuitif ...

Apa yang Anda lakukan sebelumnya:

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

Apa maumu:

  • Hapus file dari indeks, tetapi tetap diversi dan dibiarkan dengan perubahan tidak didukung dalam copy pekerjaan:

    git reset head <file>
    
  • Setel ulang file ke status terakhir dari HEAD, membatalkan perubahan dan menghapusnya 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 sejak git reset --hard HEAD tidak akan berfungsi dengan file tunggal.

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

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

    git rm <file>
    

73
2018-03-29 11:14



Pertanyaannya tidak jelas diajukan. Alasannya adalah itu git add memiliki dua makna:

  1. menambahkan a file baru ke area pementasan, lalu batalkan git rm --cached file.
  2. menambahkan a diubah file ke area pementasan, lalu batalkan git reset HEAD file.

jika ragu, gunakan

git reset HEAD file

Karena itu hal yang diharapkan dalam kedua kasus.

PERINGATAN: jika kamu melakukan git rm --cached file pada file itu diubah (file yang ada sebelumnya di repositori), maka file akan dihapus git commit! Ini akan tetap ada di sistem file Anda, tetapi jika ada orang lain yang menarik komit Anda, file tersebut akan dihapus dari pohon kerja mereka.

git status akan memberi tahu Anda apakah file itu a 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

62
2018-01-16 19:54



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

git reset HEAD myfile.txt

Menjelaskan:

Setelah Anda mementaskan file yang tidak diinginkan (s), untuk membatalkan, Anda dapat melakukannya 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 dengan lebih detail untuk Anda, termasuk semua langkah yang mungkin terjadi dalam kasus ini:

git reset HEAD


60
2018-06-28 10:43



Jika Anda melakukan commit awal dan Anda tidak dapat menggunakan git reset, cukup nyatakan "Git kebangkrutan" dan hapus folder git dan mulailah dari


55
2017-11-19 16:39