ดังที่ได้กล่าวไว้ที่อื่นคำตอบคือgit add
ไฟล์ เช่น:
git add path/to/untracked-file
git stash
อย่างไรก็ตามคำถามก็ถูกยกขึ้นในอีกคำตอบหนึ่ง: ถ้าคุณไม่ต้องการเพิ่มไฟล์จริงๆ เท่าที่ฉันสามารถบอกได้คุณต้อง และสิ่งต่อไปนี้จะไม่ทำงาน:
git add -N path/to/untracked/file # note: -N is short for --intent-to-add
git stash
สิ่งนี้จะล้มเหลวดังนี้:
path/to/untracked-file: not added yet
fatal: git-write-tree: error building trees
Cannot save the current index state
ดังนั้นคุณจะทำอย่างไร คุณต้องเพิ่มไฟล์อย่างแท้จริงอย่างไรก็ตามคุณสามารถยกเลิกการเพิ่มได้อย่างมีประสิทธิภาพในภายหลังด้วยgit rm --cached
:
git add path/to/untracked-file
git stash save "don't forget to un-add path/to/untracked-file" # stash w/reminder
# do some other work
git stash list
# shows:
# stash@{0}: On master: don't forget to un-add path/to/untracked-file
git stash pop # or apply instead of pop, to keep the stash available
git rm --cached path/to/untracked-file
และจากนั้นคุณสามารถทำงานต่อได้ในสถานะเดียวกับที่คุณอยู่ก่อนหน้าgit add
(คือไฟล์ที่ไม่ได้ติดตามที่เรียกว่าpath/to/untracked-file
พร้อมการเปลี่ยนแปลงอื่น ๆ ที่คุณอาจต้องติดตามไฟล์)
ความเป็นไปได้อีกอย่างสำหรับเวิร์กโฟลว์ในเรื่องนี้จะเป็นอย่างไร:
git ls-files -o > files-to-untrack
git add `cat files-to-untrack` # note: files-to-untrack will be listed, itself!
git stash
# do some work
git stash pop
git rm --cached `cat files-to-untrack`
rm files-to-untrack
[หมายเหตุ: ตามที่ระบุไว้ในความคิดเห็นจาก @mancocapac คุณอาจต้องการที่จะเพิ่ม--exclude-standard
ไปที่git ls-files
คำสั่ง (เช่นนั้นgit ls-files -o --exclude-standard
).]
... ซึ่งสามารถสคริปต์ได้อย่างง่ายดาย - แม้นามแฝงจะทำ (นำเสนอในไวยากรณ์ zsh; ปรับได้ตามต้องการ) [ยังฉันย่อชื่อไฟล์ให้สั้นลงเพื่อให้พอดีกับหน้าจอโดยไม่ต้องเลื่อนในคำตอบนี้; อย่าลังเลที่จะทดแทนชื่อไฟล์อื่นที่คุณเลือก]:
alias stashall='git ls-files -o > .gftu; git add `cat .gftu`; git stash'
alias unstashall='git stash pop; git rm --cached `cat .gftu`; rm .gftu'
โปรดทราบว่าหลังอาจดีกว่าในฐานะเชลล์สคริปต์หรือฟังก์ชั่นเพื่ออนุญาตให้มีการส่งพารามิเตอร์ไปให้git stash
ในกรณีที่คุณไม่ต้องการpop
แต่apply
และ / หรือต้องการระบุที่ซ่อนเฉพาะแทนที่จะใช้ด้านบน หนึ่ง. บางทีนี่ (แทนที่จะเป็นนามแฝงที่สองด้านบน) [ช่องว่างที่ถูกถอดออกให้พอดีโดยไม่ต้องเลื่อน เพิ่มอีกครั้งเพื่อให้อ่านง่ายขึ้น]:
function unstashall(){git stash "${@:-pop}";git rm --cached `cat .gftu`;rm .gftu}
หมายเหตุ : ในแบบฟอร์มนี้คุณจะต้องระบุอาร์กิวเมนต์การกระทำรวมถึงตัวระบุหากคุณกำลังจะให้ตัวระบุที่ซ่อนเช่นunstashall apply stash@{1}
หรือunstashall pop stash@{1}
หลักสูตรใดที่คุณใส่ใน.zshrc
หรือเทียบเท่าเพื่อให้มีอยู่ในระยะยาว
หวังว่าคำตอบนี้จะเป็นประโยชน์กับใครบางคนโดยรวมทุกอย่างไว้ในคำตอบเดียว
git stash show
ไม่มีอะไรคืนและคุณอาจถูกล่อลวงให้วางมัน (อย่างที่ฉันเพิ่งทำในขณะที่มันมีสคริปต์ที่มีประโยชน์ → วิธีกู้คืนที่ถูกทิ้ง )