จะลบ stash ที่สร้างโดย git stash create ได้อย่างไร?


549

Git stash ดูเหมือนจะทำสิ่งที่ฉันต้องการเป็นอย่างมากยกเว้นว่ามันยากสำหรับสคริปต์ราวกับว่าคุณไม่มีการเปลี่ยนแปลงจากนั้นgit stash; git stash popจะทำสิ่งที่แตกต่างกว่าถ้าคุณมีการเปลี่ยนแปลงในที่เก็บของคุณ

ดูเหมือนว่านั่นgit stash createคือคำตอบสำหรับปัญหานั้นและทุกอย่างทำงานได้ยกเว้นสิ่งหนึ่ง ... ฉันไม่สามารถกำจัดการสะสมที่สร้างขึ้นได้ มีวิธีใดในการกำจัดที่ซ่อนหรือไม่

เพื่อให้ชัดเจน 100% สิ่งที่ฉันทำ:

สร้างที่เก็บ:

~/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

ใช้ที่ซ่อน:

~/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
#

ลบที่เก็บ: (ยกเว้นว่าบิตสุดท้ายนี้ใช้ไม่ได้)

~/tmp/a(master) $ git stash drop !$
git stash drop 60629375d0eb12348f9d31933dd348ad0f038435
'60629375d0eb12348f9d31933dd348ad0f038435' is not a stash reference

แม้จะมีระยะเวลาฉันต้องการชี้ให้เห็นสำหรับนักเดินทางเพื่อนว่าการgit applyวิ่งในกล่องรหัสที่สองในขณะที่เขียนนี้ไม่ได้ใช้ปะ - ข้อความแสดงข้อผิดพลาดในผลลัพธ์บอกคุณนี้ ดังนั้นในความเป็นจริงคุณพยายามสร้างที่ซ่อน (ซึ่งใช้งานไม่ได้ดูความคิดเห็นด้านล่าง) ใช้ที่ซ่อนซึ่งไม่ได้ถูกสร้างขึ้นแล้ววางที่ซ่อนซึ่งไม่ได้สร้าง นี่คือเหตุผลที่คุณไม่ได้ทำงานอะไรเลย
ศาสตราจารย์ Tom

1
@ProfessorTom ที่ซ่อนถูกสร้างขึ้นนั่นคือสาเหตุที่ส่งคืนรหัสแฮชและสาเหตุที่git stash applyทำงานได้ git applyความพยายามที่จะอ่านไฟล์แพทช์ท้องถิ่นซึ่งไม่ได้อยู่ ความจริงแล้วมันไม่ควรอยู่ที่นั่นและมันก็ไม่เคยทำงาน ฉันถูกล่อลวงให้ลบมันออกจากคำถาม แต่เนื่องจากมันช่วยได้มากมายในรูปแบบปัจจุบันของมันฉันจะปล่อยให้มันเป็นอย่างที่เป็นอยู่
Paul Wagland

คำตอบ:


367

การลบซ่อนปกติที่สร้างขึ้นด้วยgit stashที่คุณต้องการหรือgit stash drop git stash drop stash@{n}ดูด้านล่างสำหรับรายละเอียดเพิ่มเติม


git stash createคุณไม่จำเป็นต้องลบซ่อนที่สร้างขึ้นด้วย จากเอกสาร:

สร้างรายการสะสม (ซึ่งเป็นวัตถุกระทำปกติ) และส่งคืนชื่อวัตถุโดยไม่เก็บไว้ที่ใดก็ได้ใน ref namespace สิ่งนี้มีวัตถุประสงค์เพื่อเป็นประโยชน์สำหรับสคริปต์ อาจไม่ใช่คำสั่งที่คุณต้องการใช้ ดู "บันทึก" ด้านบน

เนื่องจากไม่มีการอ้างอิงถึงการกระทำที่ซ่อนไว้มันจะได้รับการเก็บขยะในที่สุด


ที่เก็บข้อมูลที่สร้างด้วยgit stashหรือgit stash saveถูกบันทึกrefs/stashและสามารถลบgit stash dropได้ เช่นเดียวกับวัตถุ Git ทั้งหมดเนื้อหาที่เก็บสะสมจริงจะไม่ถูกลบออกจากคอมพิวเตอร์ของคุณจนกว่าจะgcตัดวัตถุเหล่านั้นหลังจากที่มันหมดอายุ (ค่าเริ่มต้นคือ 2 สัปดาห์ต่อมา)

stashes เก่าจะถูกบันทึกไว้ในrefs/stash reflog (ลองcat .git/logs/refs/stash) และสามารถลบได้ด้วยgit stash drop stash@{n}ซึ่งเป็นจำนวนที่แสดงโดยngit stash list


20
ไม่ตอบคำถามยั่วยุ เป็นผลให้คนอย่างฉันซึ่งมาถึงคำถามผ่านทาง Google เพื่อค้นหาคำตอบของคำถามที่มียศและไม่สนใจรายละเอียดที่แท้จริงลงคะแนนคนที่ตอบคำถามนั้นอย่างแท้จริง บางคนก็ลงคะแนนด้วยคำตอบที่ยอมรับไม่ได้เพราะมันไม่ได้ช่วย โดยส่วนตัวแล้วฉันเพียงแค่ลบคำตอบที่ช่วยฉัน
ArtOfWarfare

15
ดังนั้น: 1) Google "git delete stash" 2) คลิกลิงก์ตามครึ่งแรกของชื่อคำถาม 3) downvote คำตอบที่ถูกต้องเฉพาะสำหรับครึ่งหลังของชื่อ นั่นคือใหม่
dahlbyk

10
@ArtOfWarfare นั่นจะเป็นการขาดความเข้าใจในการอ่านแล้วเพราะนี่เป็นคำตอบที่ชัดเจนมากสำหรับ "คำถามระดับ"
Chris Hayes

1
ยุติธรรมพอสมควร ฉันสร้างการหยุดชั่วคราวของฉันโดยใช้เพียงgit stash- ฉันไม่ทราบว่าจริง ๆ แล้วแมปไปgit stash createหรืออย่างอื่น Git เป็นสิ่งที่ฉันยังคงเรียนรู้อยู่ (ถ้าไม่ใช่ฉันจะไม่อ่าน SO Q & อย่างนี้)
ArtOfWarfare

1
@AdrianPronk นี่คือสิ่งที่ฉันอยากจะแนะนำให้ใช้จริงgit stash createๆ แทนที่จะบันทึกในไฟล์ปะแก้เวลาที่บันทึกคุณอาจปล่อยให้ git reflog บันทึกให้คุณในการอ้างอิงที่กำหนดเอง (เช่นrefs/backup) ผมจะพยายามบางอย่างเช่น 1) git stash create2) เปรียบเทียบต้นไม้ที่ซ่อนใหม่ด้วยrefs/backup^{tree}3) git update-ref --create-reflog refs/backup <stash-sha>หากต้นไม้ที่แตกต่างกัน ระบบจะตัดการสำรองข้อมูลที่เก่าที่สุดในที่สุดโดยอัตโนมัติ
dahlbyk

838

git stash dropใช้พารามิเตอร์ไม่ - ซึ่งวางที่ซ่อนด้านบน - หรือการอ้างอิงที่เก็บซึ่งดูเหมือนว่า: stash@{n}ซึ่งnเสนอชื่อที่เก็บที่จะวาง คุณไม่สามารถผ่านการกระทำ ID git stash dropเพื่อ

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

การวางที่ซ่อนจะเปลี่ยนการstash@{n}กำหนดของที่เก็บทั้งหมดลงในสแต็ก

ฉันไม่แน่ใจว่าทำไมคุณคิดว่าจำเป็นต้องวางที่เก็บข้อมูลเพราะถ้าคุณใช้stash createรายการที่ซ่อนไม่ได้ถูกสร้างขึ้นสำหรับ "ที่เก็บของ" ดังนั้นจึงไม่มีอะไรที่จะทิ้ง


รายการถูกสร้างโดยใช้ "stash" ... ใครจะคิดว่ามันจะถูกลบออกโดยใช้ "stash"
พอล Wagland

2
ดูที่หน้า man สำหรับ git stash สร้างสร้างไม่ได้สร้างรายการเพียงวัตถุกระทำสำหรับสะสมดังนั้นจึงไม่มีรายการในบันทึกที่จะลบ
CB Bailey

3
จากมนุษย์ : สร้างสร้าง stash (ซึ่งเป็นวัตถุกระทำปกติ) และส่งคืนชื่อวัตถุโดยไม่เก็บไว้ที่ใดก็ได้ใน ref namespace
ruffin

40
ข้อควรระวัง : คุณไม่ควรวางหลายอย่างเช่น 1, 2, 3 เนื่องจากคุณจะวางสิ่งที่เดิมเป็นหมายเลข 1, 3 และ 5 วิธีที่ถูกต้องในการปล่อย 1, 2 และ 3 คือ ทำตามลำดับ 3, 2, 1 หรือ 1, 1, 1 นอกจากนี้ยังมีดัชนี 0 โดย 0 อยู่ที่ด้านบนสุดของสแต็ก
ArtOfWarfare

2
Git Extensions ออกคำสั่งที่ไม่รู้จักเมื่อกดปุ่ม "Stash Changes" และสิ่งใดก็ตามที่ยังคงมีอยู่ในการออกและรีสตาร์ทแอปพลิเคชัน ไม่มีวิธีที่ชัดเจนในการกำจัดการสะสมโดยใช้ GUI แต่จากบรรทัดคำสั่ง "รายการ git stash" แสดง WIP stash และ "git stash clear" กำจัดมันออกไป
เดฟ

215

หากคุณเป็น 100% แน่ใจว่าคุณมีเพียงหนึ่งซ่อนหรือคุณต้องการที่จะลบ stashes ทั้งหมด (ทำให้การgit stash listที่จะเป็น 107% ว่า) คุณสามารถทำ:

git stash clear

.. และลืมเกี่ยวกับพวกเขา (มันลบการเก็บซ่อนทั้งหมด)

หมายเหตุ: เพิ่มคำตอบนี้สำหรับผู้ที่ลงเอยด้วยการหาวิธีล้างพวกเขาทั้งหมด (เช่นฉัน)


26
หากคุณมีที่ซ่อนเพียงอันเดียวฉันยังคงแนะนำให้ใช้git stash dropเนื่องจากจะมีที่เก็บเพียงอันเดียวและคุณไม่ต้องกังวลเกี่ยวกับการสูญเสียมากกว่าที่คาดไว้
พอล Wagland

โหวตขึ้นเนื่องจากมันตอบคำถามได้จริงไม่ว่าจะเป็นการปฏิบัติที่ดีที่สุดหรือไม่ ฉันต้องการสิ่งนี้จริงๆเพราะปัญหาที่ฉันสร้างไว้ในวันนี้จำเป็นต้องหายไป
Alex McCabe

2
ตอนนี้ฉันใช้ที่เก็บของมานานแล้ว เวลานี้ แต่ฉันไม่สามารถกำจัดที่ซ่อนสุดท้ายที่ฉันทำโดยใช้เพียงแค่git stash dropตามปกติ ฉันไม่แน่ใจในสิ่งที่ฉันทำแตกต่างกัน อย่างไรก็ตามgit stash clearทำงานให้ฉัน ไม่รู้ว่ามันมีอยู่จริง +1
Konstantinos Gaitanis

3
+1 เนื่องจากคอมไพล์ปฏิเสธที่จะลบที่เก็บเนื่องจากไฟล์ใดไฟล์หนึ่งที่สร้างโดยที่เก็บมีอยู่แล้วในตอนนี้ ..
Thiago Barcala

12
โดยเฉพาะ 107% แน่นอน
levininja

84

จาก git doc: http://git-scm.com/docs/git-stash

วาง [-q | --quiet] []

ลบสถานะที่ถูกเก็บเดี่ยวออกจากรายการที่เก็บ เมื่อไม่ได้รับมันจะลบล่าสุด เช่นstash@{0}มิฉะนั้นจะต้องเป็นการอ้างอิงบันทึกที่ถูกต้องของ form stash @ {}

ตัวอย่าง:

git stash drop stash@{5}

นี่จะเป็นการลบรายการที่เก็บ 5. หากต้องการดูรายการที่เก็บทั้งหมด:

git stash list

4
ยกเว้นว่าฉันพูดอย่างชัดเจนที่ด้านล่างของคำถามที่ว่าการเก็บซ่อนคอมไพล์ไม่ได้ทำในสิ่งที่ฉันต้องการ
Paul Wagland

1
ฉันจะแนะนำให้ตรวจสอบเนื้อหาของสะสมใช้ - ก่อนที่จะดำเนินgit stash show stash@{REPLACE_IT_WITH_STASH_INDEX} git stash dropเชื่อฉันมันจะช่วยปัญหาได้มาก :)
realPK

71

คุณควรจะใช้

git stash save

และไม่

git stash create

เพราะสิ่งนี้จะสร้าง stash (ซึ่งเป็นวัตถุกระทำปกติ) และส่งคืนชื่อวัตถุโดยไม่เก็บไว้ที่ใดก็ได้ใน ref namespace ดังนั้นจะไม่สามารถเข้าถึงได้โดยใช้ที่เก็บ

การใช้งานgit stash save "some comment"จะถูกใช้เมื่อคุณมีการเปลี่ยนแปลงที่ไม่คงที่คุณต้องการทำซ้ำ / ย้ายไปยังสาขาอื่น

ใช้git stash apply stash@{0}(สมมติว่าดัชนีที่เก็บไว้ที่บันทึกไว้ของคุณคือ 0) เมื่อคุณต้องการให้การเปลี่ยนแปลงที่บันทึกไว้ (stashed) ของคุณสะท้อนไปที่สาขาปัจจุบันของคุณ

คุณสามารถใช้git stash listเพื่อตรวจสอบดัชนีที่ซ่อนทั้งหมด

และใช้git stash drop stash@{0}(สมมติว่าดัชนีที่เก็บไว้ที่บันทึกไว้ของคุณคือ 0 และคุณต้องการลบ) เพื่อลบที่เก็บเฉพาะ


3
สำหรับข้อมูล - เพียงพิมพ์คำสั่งgit stashเริ่มต้นไปที่git stash save
RBT

1
git stash createมีวัตถุประสงค์เพื่อใช้งานโดยสคริปต์ นั่นเป็นกรณีการใช้ OP ดังนั้นการแนะนำgit stash saveอาจมีประโยชน์สำหรับการใช้ "ปกติ" แต่ไม่ใช่สำหรับกรณีการใช้ของ OP OP อาจต้องการดูเอกสาร : มีคำสั่งเพิ่มเติมที่เกี่ยวข้องกับการเขียนสคริปต์เช่นgit stash store
Adrian W

1
git stash save "message"git stash push -m "message"ในปัจจุบันควรอ่าน เปรียบเทียบgit commit -m "message"
Tino


1

เอกสารอยู่ที่นี่ (เป็นภาษาจีน) โปรดคลิก

คุณสามารถใช้ได้

gash stash list

git stash drop stash @ {0}

ป้อนคำอธิบายรูปภาพที่นี่


git stash creategit stash saveโดยเฉพาะอย่างยิ่งแตกต่างไปจากแบบฟอร์มการสร้างไม่ปรากฏในรายการและไม่สามารถลบได้ดังนั้นคำถาม
Paul Wagland

@ PaulWagland ขอบคุณคำตอบของคุณและจัดหาคำตอบ สุจริต, ฉันไม่พบ "git stash create" int เอกสารอย่างเป็นทางการ แต่เกี่ยวกับเรื่องนี้ฉันสนใจถ้าคุณต้องการค้นหา "git stash create" ใน "git stash list" คุณสามารถทำสิ่งนี้ได้
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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.