ฉันต้องการทราบว่าเป็นไปได้หรือไม่ที่จะแยกไฟล์เดียวหรือแตกต่างจากไฟล์จาก git stash โดยไม่ต้องหยุดเซ็ตการแก้ไขที่ซ่อน
ใครบ้างที่สามารถให้คำแนะนำ / แนวคิดเกี่ยวกับเรื่องนี้ได้บ้าง
ฉันต้องการทราบว่าเป็นไปได้หรือไม่ที่จะแยกไฟล์เดียวหรือแตกต่างจากไฟล์จาก git stash โดยไม่ต้องหยุดเซ็ตการแก้ไขที่ซ่อน
ใครบ้างที่สามารถให้คำแนะนำ / แนวคิดเกี่ยวกับเรื่องนี้ได้บ้าง
คำตอบ:
บนmanpage git stashคุณสามารถอ่านได้ (ในส่วน "Discussion" หลังจากคำอธิบาย "Options") ที่:
Stash จะถูกแสดงเป็นคอมมิชชันที่ทรีบันทึกสถานะของไดเร็กทอรีการทำงานและพาเรนต์แรกของมันคือ commit ที่ HEAD เมื่อสแตชถูกสร้าง
ดังนั้นคุณสามารถรักษาที่ซ่อน (เช่นstash@{0}
เป็นที่แรก / ที่เก็บสูงสุด) เป็นการรวมที่กระทำและใช้:
$ git diff stash@{0}^1 stash@{0} -- <filename>
คำอธิบาย: stash@{0}^1
หมายถึงผู้ปกครองคนแรกของที่เก็บที่กำหนดซึ่งตามที่ระบุไว้ในคำอธิบายข้างต้นคือการกระทำที่การเปลี่ยนแปลงถูกเก็บซ่อนไว้ เราใช้รูปแบบนี้ของ "git diff" (มีสองคอมมิท) เนื่องจากstash@{0}
/ refs/stash
เป็นการรวมที่คอมมิชชันและเราต้องบอกคอมไพล์ว่าผู้ปกครองใดที่เราต้องการแตกต่าง ความลับเพิ่มเติม:
$ git diff stash@{0}^! -- <filename>
ควรใช้งานได้ด้วย (ดูgit rev-parse manpage สำหรับคำอธิบายเกี่ยวกับrev^!
ไวยากรณ์ในส่วน "การระบุช่วง")
ในทำนองเดียวกันคุณสามารถใช้การชำระเงิน gitเพื่อตรวจสอบไฟล์เดียวจากที่เก็บ:
$ git checkout stash@{0} -- <filename>
หรือเพื่อบันทึกภายใต้ชื่อไฟล์อื่น:
$ git show stash@{0}:<full filename> > <newfile>
หรือ
$ git show stash@{0}:./<relative filename> > <newfile>
( โปรดทราบว่าที่นี่ <ชื่อไฟล์เต็ม> เป็นชื่อพา ธ เต็มของไฟล์ที่สัมพันธ์กับไดเรกทอรีบนสุดของโครงการ (คิดว่า: สัมพันธ์กับstash@{0}
))
คุณอาจจำเป็นต้องปกป้องstash@{0}
จากการขยายตัวของเปลือกใช้ IE หรือ"stash@{0}"
'stash@{0}'
git checkout
หน้าคนอีกครั้ง ไม่สามารถวางไฟล์ลงในตำแหน่งอื่นได้ มีการอ้างอิงถึงสิ่งนี้ใน: stackoverflow.com/questions/888414/…
git checkout
วิธีการคัดลอกไฟล์ที่ถูกต้องจากที่เก็บ - มันไม่ได้รวมกับสิ่งที่อยู่ในไดเรกทอรีการทำงานของคุณเช่นgit stash apply
จะ (ดังนั้นหากคุณมีการเปลี่ยนแปลงใด ๆ จากฐานที่สะสมถูกสร้างขึ้นพวกเขาจะหายไป)
git stash apply
การรวมการเปลี่ยนแปลงในไฟล์ที่ถูกแก้ไขในแผนผังการทำงานตั้งแต่ไฟล์ถูก stashed ไฟล์นั้นในแผนผังการทำงานจะต้องถูกจัดฉาก เพื่อให้การผสานอัตโนมัติทำงานไฟล์เดียวกันไม่สามารถแก้ไขได้ทั้งในสำเนาการทำงานและในการคัดลอกเพื่อรวมเข้าด้วยกัน ในที่สุดที่ซ่อนใช้ไม่ได้ลบรายการออกจากที่ซ่อนเช่นgit stash pop
หากว่า
หากคุณใช้git stash apply
มากกว่าgit stash pop
จะใช้ที่เก็บฝังกับต้นไม้ทำงานของคุณ แต่ก็ยังคงเก็บไว้
เมื่อทำสิ่งนี้แล้วคุณสามารถadd
/ commit
ไฟล์ที่คุณต้องการแล้วรีเซ็ตการเปลี่ยนแปลงที่เหลือ
git stash pop stash@{0}
(รายการการเปลี่ยนแปลง stashed: git stash list
)
มีวิธีง่ายๆในการรับการเปลี่ยนแปลงจากสาขาใด ๆ รวมถึงการหยุด:
$ git checkout --patch stash@{0} path/to/file
คุณอาจละเว้นข้อกำหนดไฟล์หากคุณต้องการแก้ไขในหลายส่วน หรือละเว้นแพทช์ (แต่ไม่ใช่พา ธ ) เพื่อรับการเปลี่ยนแปลงทั้งหมดในไฟล์เดียว แทนที่0
ด้วยหมายเลขที่เก็บจากgit stash list
หากคุณมีมากกว่าหนึ่ง โปรดทราบว่านี่เป็นสิ่งที่ชอบdiff
และเสนอที่จะใช้ความแตกต่างทั้งหมดระหว่างสาขา ที่จะได้รับการเปลี่ยนแปลงจากเพียงคนเดียวกระทำ / ซ่อน, git cherry-pick --no-commit
มีลักษณะที่
git help checkout
อ่าน --patch
ทำการผสานแบบโต้ตอบมันจะใช้สิ่งใดก็ตามที่คุณอนุมัติก้อนในเชลล์ (หรืออะไรก็ตามที่คุณบันทึกถ้าคุณเลือกที่จะe
แก้ไขแพตช์) เส้นทางเพียงอย่างเดียวจะเขียนทับไฟล์เช่นฉันเขียนว่า "การเปลี่ยนแปลงทั้งหมด"
git config --global alias.applydiffat '!git checkout --patch "$1" -- $(git diff --name-only "$1"^ "$1")'
- จากนั้นgit applydiffat stash@{4}
ใช้ไฟล์ที่เปลี่ยนแปลงระหว่างที่เก็บข้อมูลและพาเรนต์เท่านั้น
หากต้องการดูไฟล์ทั้งหมด: git show stash@{0}:<filename>
เพื่อดูความแตกต่าง: git diff stash@{0}^1 stash@{0} -- <filename>
diff
ด้วยdifftool
เพื่อใช้ diff ภายนอกที่คุณชื่นชอบ
$ git checkout stash@{0} -- <filename>
หมายเหตุ:
ตรวจสอบให้แน่ใจว่าคุณใส่ช่องว่างหลัง "-"และพารามิเตอร์ชื่อไฟล์
แทนที่ศูนย์ (0) ด้วยหมายเลขที่เก็บเฉพาะของคุณ ในการรับรายการที่ซ่อนใช้:
git stash list
ตามคำตอบของ Jakub Narębski - เวอร์ชั่นที่สั้นลง
คุณสามารถรับส่วนต่างสำหรับสะสมด้วย " git show stash@{0}
" (หรือจำนวนที่เก็บคือดู "รายการ gash สะสม") มันง่ายที่จะแยกส่วนของ diff สำหรับไฟล์เดียว
git show stash
เพื่อแสดงที่ซ่อนสูงสุด (โดยปกติแล้วจะมีเพียงอันเดียวที่คุณมี) git diff head stash
ในทำนองเดียวกันคุณสามารถแสดงความแตกต่างระหว่างสาขาปัจจุบันของคุณและสะสมด้วย
แนวคิดที่ง่ายที่สุดที่จะเข้าใจแม้ว่าอาจจะไม่ดีที่สุดคือคุณมีสามไฟล์ที่เปลี่ยนแปลงและคุณต้องการซ่อนไฟล์หนึ่งไฟล์
หากคุณgit stash
ต้องการซ่อนทั้งหมดgit stash apply
เพื่อนำพวกเขากลับมาอีกครั้งและจากนั้นgit checkout f.c
ในไฟล์ที่เป็นปัญหาเพื่อรีเซ็ตอย่างมีประสิทธิภาพ
เมื่อคุณต้องการคลายการเรียกใช้ไฟล์นั้นให้ทำgit reset --hard
และเรียกใช้git stash apply
อีกครั้งโดยใช้ประโยชน์จากข้อเท็จจริงที่git stash apply
ไม่ได้ลบส่วนต่างจากสแต็กสแต็ก
หากไฟล์ที่ถูกซ่อนจำเป็นต้องรวมกับเวอร์ชันปัจจุบันดังนั้นให้ใช้วิธีการก่อนหน้านี้โดยใช้ diff มิฉะนั้นคุณอาจใช้git pop
สำหรับการคลายพวกเขาgit add fileWantToKeep
สำหรับการจัดเตรียมไฟล์ของคุณและทำgit stash save --keep-index
เพื่อเก็บทุกอย่างยกเว้นสิ่งที่อยู่บนเวที โปรดจำไว้ว่าความแตกต่างของวิธีนี้กับตัวก่อนหน้าคือ "pops" ไฟล์จากที่เก็บ คำตอบก่อนหน้าเก็บไว้git checkout stash@{0} -- <filename>
เพื่อให้เป็นไปตามความต้องการของคุณ
ใช้สิ่งต่อไปนี้เพื่อนำการเปลี่ยนแปลงไปใช้กับไฟล์ในที่เก็บของต้นไม้การทำงานของคุณ
git diff stash^! -- <filename> | git apply
โดยทั่วไปจะดีกว่าการใช้git checkout
เพราะคุณจะไม่สูญเสียการเปลี่ยนแปลงใด ๆ ที่คุณทำกับไฟล์ตั้งแต่คุณสร้างที่เก็บ
ใช้Git Stash extension ในVisual Studio Code