คำตอบที่ได้รับการยอมรับในขณะนี้เป็นเทคนิคที่ถูกต้องคุณไม่สามารถบอก Git ที่จะผลักดัน stashes ทั้งหมดของคุณไปไกลแล้วดึงทุกอย่างลงใน stashes ท้องถิ่นของคุณบนคอมพิวเตอร์เครื่องอื่น
และในขณะที่คำตอบขณะนี้บน upvotedควรทำงานผมไม่ชอบที่จะสร้างพวงของสาขาชั่วคราวและมันต้องใช้ด้วยตนเองการตรวจสอบจากที่ซ่อนกระทำและบันทึกเป็นที่ซ่อนซึ่งสามารถนำไปสู่ปัญหาเช่นความคิดเห็นนี้ กล่าวถึงOn (no branch): On testing:
และนำไปสู่การซ้ำ แน่นอนต้องมีวิธีที่ดีกว่า!
ดังนั้นในขณะที่คุณไม่สามารถผลักดัน stashes, ซ่อนเป็นเพียงการกระทำ (ที่จริงทั้งสองกระทำ) และต่อgit push
หน้าคนคุณสามารถผลักดันกระทำ:
<src>
มักจะเป็นชื่อของสาขาที่คุณต้องการที่จะผลักดัน แต่ก็สามารถใด ๆ โดยพล "SHA-1 การแสดงออก" ...
ฉันเลือกที่จะผลัก stashes refs/stashes/*
เพื่อที่ฉันจะได้ไม่เกะกะระยะไกลด้วยกิ่งก้านพิเศษ ดังนั้นฉันสามารถทำได้ด้วย:
git push origin stash@{0}:refs/stashes/$(git rev-parse --short stash@{0})
( rev-parse
คำสั่งได้รับแฮชแบบสั้นของที่เก็บซึ่งจะไม่ซ้ำกันสำหรับ repo)
ต่อไปฉันต้องดึงข้อมูลที่เก็บซ่อนจากคอมพิวเตอร์เครื่องอื่น Git ดึงเฉพาะสาขาตามค่าเริ่มต้นดังนั้นฉันจำเป็นต้องดึงข้อมูลที่เก็บเฉพาะ:
git fetch origin refs/stashes/*:refs/stashes/*
ทีนี้การแปลงที่เก็บข้อมูลกระทำกลับเป็นที่สะสมจริง ตามที่กล่าวไว้ในขณะที่ฉันสามารถตรวจสอบการกระทำที่ซ่อนรีเซ็ตและสะสมตามปกติฉันไม่ชอบที่ต้องใช้ขั้นตอนพิเศษหรือว่ามันอาจจะไม่รักษาสถานะดัชนีสำหรับที่เก็บ ฉันกำลังหาวิธีทำออนไลน์โดยอัตโนมัติ แต่การค้นหาของฉันล้มเหลว ในที่สุดฉันก็ตรวจดูหน้า man สำหรับgit stash
ที่ฉันพบสิ่งนี้:
สร้าง
สร้าง stash (ซึ่งเป็นวัตถุกระทำปกติ) และส่งคืนชื่อวัตถุโดยไม่เก็บไว้ที่ใดก็ได้ใน ref namespace สิ่งนี้มีวัตถุประสงค์เพื่อเป็นประโยชน์สำหรับสคริปต์ อาจไม่ใช่คำสั่งที่คุณต้องการใช้ ดู "บันทึก" ด้านบน
ร้านค้าจัด
เก็บสะสมที่กำหนดที่สร้างขึ้นผ่าน Git Stash สร้าง (ซึ่งเป็นความมุ่งมั่นผสานผสาน) ในการอ้างอิงสะสมการปรับปรุงการอ้างอิงที่เก็บสะสม สิ่งนี้มีวัตถุประสงค์เพื่อเป็นประโยชน์สำหรับสคริปต์ อาจไม่ใช่คำสั่งที่คุณต้องการใช้ ดู "บันทึก" ด้านบน
เนื่องจากฉันมีความมุ่งมั่นแล้วstore
เสียงเหมือนสิ่งที่ฉันต้องการ ดังนั้นฉันสามารถทำ:
git stash store --message "$(git show --no-patch --format=format:%s <SHA>)" <SHA>
แทนที่<SHA>
ด้วยที่เก็บที่เพิ่งดึงมา
( git show
คำสั่งจะได้รับข้อความการส่งข้อมูลจาก stash commit เพื่อใช้เป็นข้อความสำหรับ stash log)
ที่เก็บตอนนี้ปรากฏขึ้นตามปกติใน repo ท้องถิ่นของฉัน:
$ git stash list
stash@{0}: On master: temp
...
เพื่อล้างข้อมูลรีโมตสามารถลบ stashes ออกจากรีโมตได้ดังนี้:
git push origin :refs/stashes/<SHA>
วิธีนี้ยังมีประโยชน์ในการเป็น idempotent: ถ้าคุณเรียกใช้คำสั่งอีกครั้งก็จะรายงานpush
คำสั่งนอกจากนี้ยังสามารถทำงานได้อย่างปลอดภัยซ้ำแล้วซ้ำอีก แม้ว่าจะข้ามการจัดเก็บที่เก็บหากเหมือนกันกับที่เก็บข้อมูลล่าสุด แต่ก็ไม่ได้ป้องกันการซ้ำซ้อนของที่เก็บที่เก่ากว่า สิ่งนี้สามารถแก้ไขได้ตามที่ฉันทำในสคริปต์ของฉันดูด้านล่างEverything up-to-date
fetch
stash store
git-rstash
สำหรับการทำให้สมบูรณ์คุณยังสามารถดันการหยุดทั้งหมด (ด้วย ทุบตี):
for i in $(seq 0 $(expr $(git rev-list --walk-reflogs --count stash) - 1))
do
git push origin stash@{$i}:refs/stashes/$(git rev-parse --short stash@{$i})
done
หรือนำเข้าที่เก็บข้อมูลที่ดึงมาทั้งหมด:
for stash in $(ls .git/refs/stashes)
do
git stash store --message "$(git show --no-patch --format=format:%s $stash)" $stash
done
ฉันได้สร้าง ทุบตีสคริปต์ที่สามารถเรียกได้ว่าเป็นคำสั่งย่อย (เช่นgit rstash push 0
) ดังนั้นฉันไม่จำเป็นต้องจำสิ่งเหล่านี้ทั้งหมด git-rstash
สามารถพบได้ที่นี่
git fetch some-remote +refs/stash:refs/remotes/some-remote/stash
git stash apply some-remote/stash