git stash ใช้เวอร์ชัน


513

ฉันมี 2 สาขา: master | ออกแบบ

ทำงานในการออกแบบฉันได้สะสมและเปลี่ยนไปใช้ปริญญาโททำการปรับเปลี่ยนบางอย่าง เปลี่ยนกลับไปสู่การออกแบบและทำสิ่งstash applyเดียวที่ทำให้การเปลี่ยนแปลงทั้งหมดของฉันสูญเสียในสาขาการออกแบบ

ฉันหวังว่างานทั้งหมดของฉันจะอยู่ในที่ซ่อนเนื่องจากฉันยังไม่ได้ลบหรือลบออก

ถ้าฉันทำรายการซ่อนฉันได้รับ 4 ผลลัพธ์:

stash@{0}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{1}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{2}: WIP on design: eb65635... Email Adjust
stash@{3}: WIP on design: eb65635... Email Adjust

หากฉันลองgit stash apply f2c0c72ฉันพบข้อผิดพลาด:

fatal: Needed a single revision
f2c0c72: no valid stashed state found

ฉันจะใช้ที่ซ่อนเฉพาะได้อย่างไร


26
โปรดทราบว่าคุณมีตอนนี้ (Q4 2016, Git 2.11) ไวยากรณ์git stash apply 0(แทนgit stash apply stash@{0}) ดูคำตอบของฉันที่นี่
VonC

คำตอบ:


837

กุญแจเข้าไปในที่เก็บของจริง ๆ แล้วเป็นstash@{n}รายการทางด้านซ้าย ดังนั้นลอง:

git stash apply stash@{0}

(โปรดทราบว่าในบางเชลล์คุณจำเป็นต้องพูด"stash@{0}"เช่น zsh, ปลาและ powerhell)

ตั้งแต่เวอร์ชั่น 2.11 ก็สวยง่ายคุณสามารถใช้จำนวนสแต็ค N stash@{n}แทนการใช้ ดังนั้นตอนนี้แทนที่จะใช้:

git stash apply "stash@{n}"

คุณสามารถพิมพ์:

git stash apply n

ในการรับรายการการหยุด:

git stash list

อันที่จริงแล้วstash@{0}การแก้ไขในคอมไพล์ที่คุณสามารถเปลี่ยนเป็น ... แต่git stash apply ...ควรหาวิธี DTRT เพื่อใช้กับตำแหน่งปัจจุบันของคุณ


90
โปรดทราบว่าในเชลล์บางตัวจะต้องมีเครื่องหมาย @ {n}
Senjai

7
เคล็ดลับอื่น: คุณสามารถทำได้เช่นgitk stash@{0}เพื่อแสดงการเปลี่ยนแปลงที่คุณทำในที่ซ่อนเฉพาะ
antinome

11
ผู้ใช้ zsh จำเป็นต้องมีเครื่องหมายคำพูดคู่เช่นgit stash apply "stash@{0}"
mynameistechno

7
stash@{n}เป็นคำสั่งที่น่าอึดอัดใจที่สุดในการพิมพ์ มีทางลัดในการทำสิ่งอื่นนอกเหนือจากการสร้างนามแฝงหรือฟังก์ชันของคุณเองหรือไม่?
Dylanthepiguy

2
git stash apply nสงบสุข
Victor

241

หากต้องการใช้ที่เก็บข้อมูลและลบออกจากรายการที่เก็บของให้รัน:

git stash pop stash@{n}

หากต้องการใช้ที่เก็บและเก็บไว้ในที่เก็บข้อมูลแคชให้รัน:

git stash apply stash@{n}

8
ขอบคุณมากสำหรับความแตกต่างระหว่างสองตัวเลือก ฉันเพิ่งลองทำสิ่งนี้และปรากฏว่าถ้าคุณวางที่ซ่อนจาก branch-a ไปที่ branch-b ที่เก็บจะยังคงอยู่ในที่เก็บแคช ฉันเดาว่าน่าจะเป็นเช่นนั้นคุณจึงยังมีตัวเลือกป๊อป / นำไปใช้กับสาขาในอนาคต หวังอย่างยิ่งว่ามันสมเหตุสมผล ที่มีประโยชน์!
longda

42
สำหรับ PowerShell:git stash pop "stash@{n}"
ankitjaininfo

1
PowerShell มีความสุขกับการจัดฟันแบบหยักในเครื่องหมายคำพูด / คำพูดเดี่ยว:git stash apply stash@"{n}"
m1kael

PowerShell ก็จะยอมรับgit stash apply stash@`{n`}(หมายเหตุ backticks ก่อนวงเล็บปีกกา)
Ian Kemp

52

ตั้งแต่เวอร์ชั่น 2.11 ก็สวยง่ายคุณสามารถใช้จำนวนสแต็ค N "stash@{n}"แทนที่จะพูดว่า ดังนั้นตอนนี้แทนที่จะใช้:

git stash apply "stash@{n}"

คุณสามารถพิมพ์:

git stash apply n

ตัวอย่างเช่นในรายการของคุณ:

stash@{0}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{1}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{2}: WIP on design: eb65635... Email Adjust
stash@{3}: WIP on design: eb65635... Email Adjust

หากคุณต้องการสมัครstash@{1}คุณสามารถพิมพ์:

git stash apply 1

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

error: Your local changes to the following files would be overwritten by merge:
        file
Please commit your changes or stash them before you merge.

ในรุ่นก่อน 1.7.5.1 มันปฏิเสธที่จะทำงานหากมีการเปลี่ยนแปลงในไดเรกทอรีการทำงาน


บันทึกประจำรุ่น Git:

ผู้ใช้จะต้องพูดว่า "stash @ {$ N}" เสมอเมื่อตั้งชื่อองค์ประกอบเดียวในตำแหน่งเริ่มต้นของที่เก็บข้อมูลเช่น reflogs ใน refs / stash คำสั่ง "git stash" เรียนรู้ที่จะยอมรับ "git stash Apply 4" เป็นคำย่อสำหรับ "git stash Apply stash @ {4}"

git stash ใช้ "ใช้เพื่อปฏิเสธที่จะทำงานหากมีการเปลี่ยนแปลงใด ๆ ในแผนผังการทำงานแม้ว่าการเปลี่ยนแปลงจะไม่ทับซ้อนกับการเปลี่ยนแปลงที่บันทึกไว้


41

หากมีอยู่ในเครื่อง Windows และใน PowerShell ต้องมีการอ้างอาร์กิวเมนต์เช่น:

git stash apply "stash@{0}"

... หรือเพื่อใช้การเปลี่ยนแปลงและลบออกจากที่เก็บข้อมูล:

git stash pop "stash@{0}"

มิฉะนั้นหากไม่มีเครื่องหมายอัญประกาศคุณอาจได้รับข้อผิดพลาดนี้:

ร้ายแรง: อาร์กิวเมนต์ที่คลุมเครือ 'stash @': การแก้ไขที่ไม่รู้จักหรือเส้นทางที่ไม่ได้อยู่ในแผนผังการทำงาน


เห็นได้ชัดว่านี่เป็นวิธีที่คุณต้องทำเมื่อใช้ Fish shell บน Mac OSX 10.11 เช่นกัน
lps

8
git stash list

จากนั้นเลือกที่เก็บที่จะใช้และใช้เฉพาะตัวเลข:

git stash apply 1

2
Git Stash list 

รายการจะแสดงรายการที่ถูกซ่อนทั้งหมดเช่น: stash @ {0} :, stash @ {1}:, .. , stash @ {n}:

จากนั้นเลือกหมายเลข n ซึ่งหมายถึง stash @ {n}:

git stash apply n 

for eg: git stash apply 1 will apply that particular stashed changes to the current branch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.