git stash เฉพาะสาขาหรือสำหรับที่เก็บทั้งหมด?


95

ฉันเข้าไปในสาขาและทำงานบางอย่าง ฉันอยากไปสาขาอื่น แต่ไม่อยากผูกมัดฉันก็git stashเลยทำ git checkout <otherbranch>แล้วฉันจะทำ ฉันได้ทำงานที่นั่นและเช่นเดียวกับในสาขาแรกฉันต้องการที่จะเปลี่ยนจากสาขานี้ก่อนที่จะเริ่มทำงาน ฉันก็เลยไปที่git stashนั่นด้วย ฉันเปลี่ยนกลับไปที่สาขาแรกและพยายามที่จะปลดมันออก ( git stash pop) คิดว่ามันจะได้ที่ซ่อนจากสาขานั้น ๆ ฉันรู้สึกประหลาดใจที่มันปลดการซ่อนจาก<otherbranch>(ซ่อนล่าสุด) ฉันรู้สึกว่าที่เก็บเฉพาะสาขา แต่พฤติกรรมนี้บ่งชี้ว่ามีเพียงที่เก็บเดียวสำหรับที่เก็บในเครื่องทั้งหมด

เป็นgit stashสาขาที่เฉพาะเจาะจงหรือสำหรับพื้นที่เก็บข้อมูลทั้งหมด? ถ้าเป็นสำหรับที่เก็บทั้งหมดฉันสามารถส่งผ่านตัวเลือกไปยังที่เก็บเพื่อทำให้เฉพาะสาขาได้หรือไม่

คำตอบ:


43

หากต้องการดูสแต็คกองซ้อนปัจจุบัน:

git stash list

หากต้องการเลือกที่เก็บเฉพาะจากสแต็กให้อ้างอิงตามที่แสดงไว้ด้านบนstash@{number}

หากคุณต้องการให้ลักษณะการทำงานเป็นไปตามสาขาคุณสามารถทำการคอมมิต (หรือการคอมมิตหลายรายการ) ในสาขา คุณสามารถเสมอ "ล้ม" กระทำ (s) ต่อมา (เช่นมีgit resetอย่างใดอย่างหนึ่ง--softหรือ--mixed; ดูเอกสารคอมไพล์ตั้งค่าหรือมีgit rebase -iการเก็บเฉพาะในที่สุด "ของจริง" กระทำ (s) ในขณะที่ทิ้งชั่วคราว) ที่

(ในการเลียนแบบจริงๆgit stashคุณต้องมีการคอมมิตอย่างน้อยสองคอมมิตหนึ่งสำหรับสถานะดัชนีและอีกอันสำหรับสถานะแผนผังงานหากคุณไม่ได้วางแผนที่จะบันทึกและกู้คืนสถานะดัชนีคุณสามารถทำได้แค่git add -Aสถานะแผนผังงานทั้งหมด และใส่สิ่งนั้นไว้ในการกระทำชั่วคราวอีกทางหนึ่งgit stashคือเชลล์สคริปต์เพื่อให้คุณสามารถคัดลอกและแก้ไขได้อย่างง่ายดายเพื่อให้มันทำงานต่อสาขาตามค่าเริ่มต้นโดยใช้เช่นเป็นชื่อพื้นที่ที่ใช้งานได้แทนที่จะเป็นโกลบอลเดียวสำหรับ repo ทั้งหมดคุณยังคงสามารถนำที่ซ่อนจากสาขาหนึ่งไปยังอีกสาขาหนึ่งโดยตั้งชื่ออย่างชัดเจน)refs/pb-stash/branchrefs/stash


คุณรู้วิธีแสดงรายการไฟล์ของแต่ละstash listรายการนอกเหนือจากคำอธิบายหรือไม่?
สะเทินน้ำสะเทินบก

2
git stash show(หรือgit stash show stash@{<number>}สำหรับสิ่งอื่นที่ไม่ใช่@{0}เวอร์ชัน) ให้diff --stat; เพิ่ม-pเพื่อให้ได้ค่าต่างที่มากขึ้น หมายเหตุ: สิ่งนี้เปรียบเทียบ "ต้นไม้งาน" ใน"ถุงเก็บของ"กับการกระทำที่ค้างอยู่ ไม่มีอินเทอร์เฟซส่วนหน้าเพื่อดูว่ามีอะไรอยู่ใน "ดัชนี" ในถุงเก็บของที่ระบุ
torek

55

ไม่ใช่และไม่ใช่ git stash เป็นต่อที่เก็บ

นี่คือหน้าเว็บที่ดีเกี่ยวกับวิธีการใช้งาน


กองที่สองเขียนทับอันแรกหรือไม่ IOW ถ้าฉันทำสองที่ซ่อน แต่ไม่มีการยกเลิกการซ่อนระหว่างกันฉันจะสูญเสียที่เก็บครั้งแรกหรือไม่?
สัตว์สะเทินน้ำสะเทินบก

1
ไม่คุณจะได้รับกองซ้อน (เข้าก่อนออก) ของที่เก็บ คุณดันที่ซ่อนไปที่กองเก็บของคุณจากนั้นอีกอันหนึ่งคุณจะโผล่ออกมาที่ 2 จากนั้นคุณก็โผล่ออกมาตัวแรก ฯลฯ
abasterfield

18

git stash ไม่ใช่รายสาขา

  • แทนgit stash(ซึ่งสามารถหายได้ง่ายเมื่อคุณมีที่เก็บของและกิ่งไม้จำนวนมาก)
  • ฉันขอแนะนำให้ทำgit commitเพื่อบันทึกรหัสที่ยังไม่เสร็จในสาขาของคุณและเมื่อคุณพร้อมที่จะทำรหัสให้เสร็จให้ทำgit reset ${COMMIT_HASH_VALUE}เพื่อรับรหัสที่ยังไม่เสร็จ
  • git commitและgit resetเมื่อใช้ร่วมกันอย่างถูกต้องสามารถจำลองgit stashสำหรับสาขาเฉพาะ

นี่คือสถานการณ์ในชีวิตจริงทั่วไปที่แสดงให้เห็นถึงคุณค่าและการใช้คำสั่งcommitand reset:

  • คุณกำลังทำงานกับ feature branch X และโค้ดของคุณไม่ได้รวบรวมหรือผ่านการทดสอบ
  • มีข้อบกพร่องที่มีลำดับความสำคัญสูงกว่าคุณลักษณะใหม่ในปัจจุบันดังนั้นคุณต้องเริ่มทำงานทันทีในการแก้ไขข้อบกพร่อง
  • แทนที่จะทำ git stash (และที่ซ่อนจะหายไปในการผสมผสานเพราะคุณมีที่เก็บมากมายและหลายสาขา)
  • คุณสามารถทำgit commitในสาขาคุณลักษณะ X
    • เขียนลงในCOMMIT_HASH_VALUEภายหลัง
  • ชำระเงินสาขา Y ใหม่สำหรับการแก้ไขด่วน
  • เสร็จสิ้นการแก้ไขด่วนในสาขา Y (ทำคำขอรวมเพื่อให้โปรแกรมแก้ไขด่วนเข้าสู่ฐานข้อมูลพื้นฐานและลบสาขาโปรแกรมแก้ไขด่วน)
  • จากนั้นชำระเงินสาขาคุณลักษณะ X อีกครั้ง
  • เพื่อสร้างงานที่ยังไม่เสร็จของคุณซึ่งไม่ได้รวบรวมหรือผ่านการทดสอบ -> เพียงแค่ทำไฟล์ git reset ${COMMIT_HASH_VALUE}

(FYI ค่าเริ่มต้นgit resetคือ--mixed)


2
git reset HEAD~1ทางลัดที่มีประโยชน์สำหรับตั้งค่าในสถานการณ์นี้คือ
Sam A. Horvath-Hunt

1
@samHH ฉันมีหนึ่งมากเกินไปกรณีที่มีการตั้งค่า HEAD คอมไพล์ ^ 1 บังเอิญถูกตีสองครั้ง ... ดังนั้นผมจึงเลือกที่จะไม่ใช้หรือHEAD^1 HEAD~1
Trevor Boyd Smith

11

ผมไม่แน่ใจว่าทำไมทุกคำตอบที่นี่ขอแนะนำให้สะสมเลียนแบบด้วย+commit resetStash ใช้งานได้ดีโดยเฉพาะอย่างยิ่งเมื่อทำงานในหลายสาขา ฉันไม่ต้องการผูกมัดเมื่อฉันทำงานในหลายสาขาเพราะฉันต้องการให้การเปลี่ยนแปลงที่แก้ไขทั้งหมดยังคงถูกเน้นในตัวแก้ไขของฉันเมื่อฉันกลับมา

ดังนั้นนี่คือขั้นตอนการซ่อน:

เมื่อใดก็ตามที่คุณต้องเปลี่ยนสาขาและไม่พร้อมที่จะคอมมิตให้บันทึกการเปลี่ยนแปลงลงในสแต็ก

git stash save "Your custom stash message"

เมื่อคุณกลับไปที่สาขาให้ชำระเงินที่ซ่อน

git stash list

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

หากคุณอยู่ในสาขาFixIssue0203คุณสามารถใช้ได้git stash popเพราะจะใช้ส่วนบนstash@{0}และลบออกจากที่ซ่อน

แต่ถ้าคุณได้ในสาขาที่ImproveReadmeคุณควรใช้สะสม 1 git stash apply stash@{1}แล้วลบซ่อน 1 git stash drop stash@{1}จากสแต็ค

แค่นั้นแหละ!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.