Bagaimana cara menghapus simpanan yang dibuat dengan git simpanan buat?

549

Git menyimpan tampaknya melakukan banyak hal yang saya inginkan, kecuali bahwa itu agak sulit untuk skrip, karena jika Anda tidak memiliki perubahan, maka git stash; git stash popakan melakukan sesuatu yang berbeda daripada jika Anda memiliki perubahan dalam repositori Anda.

Tampaknya itu git stash createadalah jawaban untuk masalah itu, dan semuanya bekerja, kecuali untuk satu hal ... Saya tidak bisa menghilangkan simpanan yang dibuat. Apakah ada cara untuk menghilangkan simpanan?

Untuk memperjelas 100% apa yang saya lakukan:

Buat simpanan:

~/tmp/a(master) $ git stash create 
60629375d0eb12348f9d31933dd348ad0f038435
~/tmp/a(master) $ git st
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   b
#
~/tmp/a(master) $ git reset --hard
HEAD is now at 555d572 log message

Gunakan simpanan:

~/tmp/a(master) $ git apply 60629375d0eb12348f9d31933dd348ad0f038435
fatal: can't open patch '60629375d0eb12348f9d31933dd348ad0f038435': No such file or directory
~/tmp/a(master) $ git stash apply 60629375d0eb12348f9d31933dd348ad0f038435
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   b
#

Hapus simpanan: (kecuali bahwa bit terakhir ini tidak berfungsi)

~/tmp/a(master) $ git stash drop !$
git stash drop 60629375d0eb12348f9d31933dd348ad0f038435
'60629375d0eb12348f9d31933dd348ad0f038435' is not a stash reference
Paul Wagland
sumber
Terlepas dari jarak waktu, saya ingin menunjukkan kepada sesama pelancong bahwa git applyperjalanan di kotak kode kedua pada saat penulisan ini tidak menerapkan tambalan — pesan kesalahan dalam output memberi tahu Anda hal ini. Jadi sebenarnya, Anda mencoba untuk membuat simpanan (yang tidak berfungsi, lihat komentar di bawah) menerapkan simpanan yang tidak dibuat kemudian jatuhkan simpanan yang tidak bisa dibuat. Inilah sebabnya mengapa tidak ada yang berhasil.
Profesor Tom
1
@ProfessorTom simpanan telah dibuat, itulah sebabnya ia mengembalikan kode hash, dan mengapa git stash applyitu berhasil. The git applyupaya untuk membaca file patch lokal, yang tidak ada. Sejujurnya, mungkin tidak seharusnya ada di sana, dan itu tidak akan pernah berhasil. Saya agak tergoda untuk menghapusnya dari pertanyaan, tetapi mengingat bahwa ia telah membantu begitu banyak dalam bentuknya saat ini, saya akan membiarkannya apa adanya.
Paul Wagland

Jawaban:

369

Untuk menghapus simpanan normal yang dibuat dengan git stash, Anda ingin git stash dropatau git stash drop stash@{n}. Lihat di bawah untuk detail lebih lanjut.


Anda tidak perlu menghapus simpanan yang dibuat dengan git stash create. Dari dokumen:

Buat entri simpanan (yang merupakan objek komit biasa) dan kembalikan nama objeknya, tanpa menyimpannya di mana pun di ruang nama ref. Ini dimaksudkan untuk berguna bagi skrip. Ini mungkin bukan perintah yang ingin Anda gunakan; lihat "simpan" di atas.

Karena tidak ada referensi yang dilakukan simpanan, akhirnya sampah akan dikumpulkan.


Sebuah simpanan dibuat dengan git stashatau git stash savedisimpan ke refs/stash, dan dapat dihapus dengan git stash drop. Seperti halnya semua objek Git, isi simpanan aktual tidak dihapus dari komputer Anda sampai gcmemangkas objek-objek tersebut setelah kedaluwarsa (standarnya adalah 2 minggu kemudian).

Stash lama disimpan di refs/stash reflog (coba cat .git/logs/refs/stash), dan dapat dihapus dengan git stash drop stash@{n}, di mana nnomor ditunjukkan oleh git stash list.

dahlbyk
sumber
20
Itu tidak menjawab pertanyaan tituler. Akibatnya, orang-orang seperti saya, yang tiba di pertanyaan melalui Google mencari jawaban untuk pertanyaan tituler dan tidak terlalu peduli dengan detail aktual, memilih orang yang benar-benar menjawabnya. Beberapa orang juga memilih memberikan jawaban yang diterima karena itu tidak membantu mereka. Saya pribadi baru saja mengangkat jawaban yang membantu saya.
ArtOfWarfare
15
Jadi: 1) Google "git delete stash" 2) klik tautan SO berdasarkan bagian pertama dari judul pertanyaan 3) turunkan jawaban yang benar khusus untuk bagian kedua dari judul. Itu yang baru.
dahlbyk
10
@ ArtOfWarfare Itu akan menjadi kurangnya pemahaman bacaan, karena ini sangat jelas merupakan respons terhadap "pertanyaan tituler".
Chris Hayes
1
Cukup adil. Saya membuat simpanan saya hanya dengan menggunakan git stash- saya tidak tahu apakah itu benar-benar peta git stash createatau sesuatu yang lain. Git tentu adalah sesuatu yang masih saya pelajari (jika tidak, saya tidak akan membaca SO Q & As seperti ini.)
ArtOfWarfare
1
@AdrianPronk Ini persis seperti hal yang saya sarankan git stash createuntuk digunakan . Daripada menyimpan dalam file tambalan waktu yang dicentang, Anda mungkin membiarkan reflog git menyimpannya untuk Anda dalam referensi khusus (mis refs/backup.). Saya akan mencoba sesuatu seperti 1) git stash create, 2) membandingkan pohon simpanan baru dengan refs/backup^{tree}, 3) jika pohonnya berbeda git update-ref --create-reflog refs/backup <stash-sha>,. Akhirnya simpanan cadangan yang lama akan dipangkas secara otomatis.
dahlbyk
838

git stash droptidak mengambil parameter - yang menjatuhkan simpanan teratas - atau referensi simpanan yang terlihat seperti: stash@{n}yang nmenominasikan simpanan mana yang akan dibuang. Anda tidak dapat meneruskan id komit ke git stash drop.

git stash drop            # drop top hash, stash@{0}
git stash drop stash@{n}  # drop specific stash - see git stash list

Menjatuhkan simpanan akan mengubah para stash@{n}sebutan semua stashes lebih bawah tumpukan.

Saya tidak yakin mengapa Anda berpikir perlu menghapus simpanan karena jika Anda menggunakan stash createentri simpanan tidak dibuat untuk "simpanan" Anda, maka tidak ada apa pun untuk dibuang.

CB Bailey
sumber
Yah, entri dibuat menggunakan "simpanan" ... Orang akan secara logis berpikir bahwa itu akan dihapus menggunakan "simpanan".
Paul Wagland
2
Lihatlah halaman manual untuk simpanan git. penyimpanan simpanan tidak membuat entri, hanya objek komit untuk simpanan sehingga tidak ada entri dalam simpanan log untuk dihapus.
CB Bailey
3
From man : create Buat simpanan (yang merupakan objek komit reguler) dan kembalikan nama objeknya, tanpa menyimpannya di mana pun di ruang nama ref.
ruffin
40
Perhatian : Anda mungkin tidak boleh menjatuhkan banyak seperti 1, 2, 3, karena Anda akan benar-benar menjatuhkan apa yang awalnya angka 1, 3, dan 5. Cara yang benar untuk menjatuhkan 1, 2, dan 3, adalah dengan lakukan dalam urutan 3, 2, 1, atau 1, 1, 1. Juga, ini 0 diindeks, dengan 0 berada di bagian atas tumpukan.
ArtOfWarfare
2
Git Extensions mengeluarkan perintah yang tidak dikenal saat tombol "Stash Changes" ditekan, dan apa pun yang dilakukannya tetap ada saat keluar dan memulai ulang aplikasi. Tidak ada cara yang jelas untuk menghilangkan simpanan menggunakan GUI, tetapi dari baris perintah "git stash list" menunjukkan simpanan WIP, dan "git simpanan bersih" menghilangkannya.
Dave
215

Jika Anda 100% yakin bahwa Anda hanya memiliki satu simpanan atau Anda ingin menghapus semua simpanan (pastikan git stash list107% yakin), Anda dapat melakukan:

git stash clear

..dan lupakan mereka (menghapus semua simpanan).

Catatan: Menambahkan jawaban ini untuk mereka yang berakhir di sini mencari cara untuk menghapus semuanya (seperti saya).

Felipe Pereira
sumber
26
Jika Anda hanya memiliki satu simpanan, saya masih akan merekomendasikan untuk menggunakannya git stash drop, karena simpanan hanya setetes, dan Anda tidak perlu khawatir kehilangan lebih dari yang diharapkan.
Paul Wagland
Terpilih karena sebenarnya menjawab pertanyaan, apakah itu praktik terbaik atau tidak. Saya benar-benar membutuhkan ini, karena simpanan yang saya buat hari ini harus hilang.
Alex McCabe
2
Saya telah menggunakan simpanan untuk waktu yang lama sekarang. Namun kali ini saya tidak dapat menyingkirkan simpanan terakhir yang saya buat hanya dengan menggunakan git stash dropseperti biasa. Saya tidak yakin apa yang saya lakukan berbeda. Bagaimanapun, git stash clearbekerja untuk saya. Tidak tahu itu ada. +1
Konstantinos Gaitanis
3
+1 karena git menolak untuk menghapus simpanan, karena salah satu file yang dibuat simpanan sudah ada sekarang
Thiago Barcala
12
khusus, 107% yakin.
levininja
84

Dari git doc: http://git-scm.com/docs/git-stash

drop [-q | --quiet] []

Hapus satu status simpanan dari daftar simpanan. Ketika tidak diberikan, itu menghapus yang terbaru. yaitu stash@{0}, sebaliknya harus menjadi referensi simpanan valid dari form simpanan @ {}.

contoh:

git stash drop stash@{5}

Ini akan menghapus entri simpanan 5. Untuk melihat semua daftar simpanan:

git stash list
Jorge
sumber
4
Kecuali bahwa saya secara eksplisit mengatakan di bagian bawah pertanyaan bahwa drop git tidak melakukan apa yang saya inginkan.
Paul Wagland
1
Saya akan merekomendasikan memeriksa konten simpanan menggunakan - git stash show stash@{REPLACE_IT_WITH_STASH_INDEX}sebelum mengeksekusi git stash drop. Percayalah, ini akan menghemat banyak masalah :)
realPK
71

Anda harus menggunakan

git stash save

dan tidak

git stash create

karena ini menciptakan simpanan (yang merupakan objek komit reguler) dan mengembalikan nama objeknya, tanpa menyimpannya di mana pun di ruang nama ref. Karenanya tidak akan dapat diakses dengan simpanan berlaku.

Gunakan git stash save "some comment"digunakan ketika Anda memiliki perubahan unstaged Anda ingin mereplikasi / pindah ke cabang lain

Gunakan git stash apply stash@{0}(dengan asumsi indeks simpanan simpanan Anda adalah 0) saat Anda menginginkan perubahan simpanan (simpanan) Anda tercermin pada cabang Anda saat ini

Anda selalu dapat menggunakan git stash listuntuk memeriksa semua indeks simpanan Anda

dan gunakan git stash drop stash@{0}(dengan asumsi indeks simpanan simpanan Anda adalah 0 dan Anda ingin menghapusnya) untuk menghapus simpanan tertentu.

Shalom Sam
sumber
3
Sekedar informasi - Cukup mengetik perintah git stashdefault kegit stash save
RBT
1
git stash createdimaksudkan untuk digunakan oleh skrip. Itu kasus penggunaan OP. Jadi, merekomendasikan git stash savemungkin berguna untuk penggunaan "normal", tetapi tidak untuk kasus penggunaan OP. OP mungkin ingin melihat pada dokumen : ada lebih banyak perintah yang terkait dengan scripting, misalnyagit stash store
Adrian W
1
git stash save "message"sekarang harus membaca git stash push -m "message". Bandingkangit commit -m "message"
Tino
2

Ini juga berfungsi

git stash drop <index>

Suka

git stash drop 5
Senin
sumber
1

Dokumen ada di sini (dalam bahasa Cina) silakan klik.

kamu bisa menggunakan

daftar simpanan git

git stash drop stash @ {0}

masukkan deskripsi gambar di sini

Longalei
sumber
git stash createberbeda dengan git stash save, khususnya, formulir buat tidak muncul dalam daftar, dan tidak bisa dijatuhkan, maka pertanyaannya.
Paul Wagland
@ PaulWagland Terima kasih atas balasan Anda dan berikan jawabannya. Jujur, saya tidak menemukan "git simpanan buat" di dokumen resmi. Tetapi tentang ini, Ini membuat saya tertarik. Jika Anda ingin mencari "git stash create" di "git stash list". Anda dapat melakukan ini di atas.
Longalei
0
git stash           // create stash,
git stash push -m "message" // create stash with msg,
git stash apply         // to apply stash,
git stash apply indexno // to apply  specific stash, 
git stash list          //list stash,
git stash drop indexno      //to delete stash,
git stash pop indexno,
stash pop = stash drop + stash apply
git stash clear         //clear all your local stashed code
Bilal Yaqoob
sumber