ถ้าฉันเรียกใช้git stash -u
ฉันสามารถซ่อนไฟล์ที่ไม่ถูกติดตามได้ อย่างไรก็ตามกล่าวว่าไฟล์ที่ไม่ได้ติดตามจะไม่ปรากฏเลยด้วยgit stash show stash@{0}
ไฟล์. มีวิธีใดบ้างในการแสดงไฟล์ที่ซ่อนไว้โดยไม่ใช้ที่เก็บ
ถ้าฉันเรียกใช้git stash -u
ฉันสามารถซ่อนไฟล์ที่ไม่ถูกติดตามได้ อย่างไรก็ตามกล่าวว่าไฟล์ที่ไม่ได้ติดตามจะไม่ปรากฏเลยด้วยgit stash show stash@{0}
ไฟล์. มีวิธีใดบ้างในการแสดงไฟล์ที่ซ่อนไว้โดยไม่ใช้ที่เก็บ
คำตอบ:
ไฟล์ที่ไม่ได้ติดตามจะถูกเก็บไว้ในพาเรนต์ที่สามของ stash คอมมิต (สิ่งนี้ไม่ได้บันทึกไว้จริง ๆ แต่ค่อนข้างชัดเจนจากการกระทำที่แนะนำคุณลักษณะ -u, 787513 ...และวิธีที่เหลือของเอกสารสำหรับgit-stash
วลีต่างๆ ... หรือเพียงแค่ทำgit log --graph stash@{0}
)
คุณสามารถดูเฉพาะส่วนที่ "ไม่ถูกติดตาม" ของที่ซ่อนผ่าน:
git show stash@{0}^3
หรือเพียงแค่ต้นไม้ที่ "ไม่ถูกติดตาม" เท่านั้นเองผ่านทาง:
git show stash@{0}^3:
หรือไฟล์ที่ "ไม่ถูกติดตาม" โดยเฉพาะในแผนภูมิผ่าน:
git show stash@{0}^3:<path/to/file>
น่าเสียดายที่ไม่มีวิธีใดที่ดีในการสรุปความแตกต่างระหว่างสถานะที่จัดฉาก + ไม่จัดฉาก + ไม่มีการติดตามกับสถานะ "ปัจจุบัน" ทั้งหมด เช่น: git show stash@{0}
ไม่สามารถทำการรวมไฟล์ที่ไม่ได้ติดตาม เนื่องจากอ็อบเจ็กต์ทรีของสแตชคอมมิตตัวเองที่เรียกว่าstash@{0}:
ไม่มีการเปลี่ยนแปลงใด ๆ จากพาเรนต์ที่สาม
สาเหตุนี้เกิดจากการใช้ Stashes ซ้ำ: ไฟล์ที่ติดตามสามารถนำไปใช้เป็นแพตช์ได้อย่างง่ายดายในขณะที่ไฟล์ที่ไม่ได้ติดตามสามารถใช้ได้เฉพาะในทางทฤษฎีเป็น "ทั้งไฟล์"
git log --graph --topo-order -m -u
แต่คุณสามารถดูข้อมูลที่สมบูรณ์ในหนึ่งคำสั่งด้วย: matthewlmcclure.com/s/2014/01/10/…
fatal: ambiguous argument 'stash@{0}^3': unknown revision or path not in the working tree.
) หากคุณไม่มีไฟล์ที่ไม่ได้ติดตามในที่เก็บข้อมูลนั้น (แต่คิดว่าคุณทำ)
git stash show
ไม่ไม่แสดงไฟล์ที่ไม่ได้ติดตาม (จริงอย่างน้อย git 2.7.4):
git stash pop
แรกจะพยายามกู้คืนไฟล์ที่ไม่ถูกติดตามจากนั้นพยายามกู้คืนไฟล์ที่ติดตาม หากการดำเนินการหลังล้มเหลว (เช่นความขัดแย้ง) การดำเนินการแรกจะไม่ย้อนกลับ (ไฟล์ที่ไม่ถูกติดตามจะยังคงอยู่เหมือนเดิม แต่ไฟล์จะไม่ถูกลบออกจากดิสก์) ดังนั้นแม้ว่าคุณจะแก้ไขข้อขัดแย้งป๊อปถัดไปก็จะล้มเหลว อย่างไรก็ตาม.
คุณสามารถแสดงรายการ stash commits ทั้งหมดด้วยคำสั่งต่อไปนี้:
git rev-list -g stash
เนื่องจากการจัดเก็บจะแสดงเป็นคอมมิตการผสาน 3 ทางของ HEAD ดัชนีและการคอมมิต "root" ที่ไม่มีพาเรนต์ของไฟล์ที่ไม่ถูกติดตามจึงสามารถแสดงที่เก็บไฟล์ที่ไม่ได้ติดตามได้โดยการไพพ์เอาต์พุตด้านบนลงในรายการต่อไปนี้:
git rev-list -g stash | git rev-list --stdin --max-parents=0
แอปพลิเคชันที่เป็นประโยชน์ดังกล่าวข้างต้น:
git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git show --stat
แน่นอนลบ--stat
เพื่อดูเนื้อหาของไฟล์
git rev-list -g stash | xargs -n1 git ls-tree -r | sort -u | grep <pattern>
git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git grep <pattern>
git rev-list -g stash | git rev-list --stdin | xargs git show --stat
Find a specific file
คำสั่งฉันจะได้รับ: 100644 blob 05e25619a6f2649b7d635b5aa897cbfc68a4f15d widget/app.css
ตอนนี้ฉันจะแสดงการเปลี่ยนแปลงนี้ได้อย่างไร? (ฉันไม่แน่ใจว่าอยู่ในที่ซ่อนใด)
git show 05e25619a6f2649b7d635b5aa897cbfc68a4f15d > widget/app.css
. ( widget/
แน่นอนว่าต้องมีไดเรกทอรีอยู่ดังนั้นจึงไม่สะดวกเท่าการใช้git checkout
กับ pathspec)
หากต้องการแสดงรายการไฟล์ที่ไม่ได้ติดตามในที่เก็บ:
git ls-tree -r stash@{0}^3 --name-only
หากต้องการแสดงความแตกต่างทั้งหมดของไฟล์ที่ไม่ได้ติดตามทั้งหมด (พร้อมเนื้อหา):
git show stash@{0}^3
คำสั่งเหล่านี้อ่านที่เก็บล่าสุด (ล่าสุด) สำหรับการเก็บก่อนหน้านี้ให้เพิ่มตัวเลขที่อยู่ด้านหลัง "stash @" เป็นต้นstash@{2}
ครั้งที่สองจากที่เก็บล่าสุด
เหตุผลที่ใช้งานได้คือgit stash
สร้างการรวมคอมมิตสำหรับแต่ละที่เก็บซึ่งสามารถอ้างอิงได้ว่าstash@{0}
, stash@{1}
ฯลฯ ผู้ปกครองครั้งแรกของการกระทำนี้เป็นหัวหน้าในช่วงเวลาของสะสมที่ผู้ปกครองที่สองมีการเปลี่ยนแปลงไปยังไฟล์การติดตามและ ประการที่สาม (ซึ่งอาจไม่มีอยู่) การเปลี่ยนแปลงไฟล์ที่ไม่ได้ติดตาม
นี้จะอธิบายบางส่วนในmanpage ภายใต้ "การสนทนา"
หากต้องการดูไฟล์ทั้งหมดในที่ซ่อน (ทั้งที่ติดตามและไม่ถูกติดตาม) ฉันได้เพิ่มนามแฝงนี้ในการกำหนดค่าของฉัน:
showstash = "!if test -z $1; then set -- 0; fi; git show --stat stash@{$1} && git show --stat stash@{$1}^3 2>/dev/null || echo No untracked files -"
ใช้อาร์กิวเมนต์เดียวที่คุณต้องการดู โปรดทราบว่าจะยังคงนำเสนอในรายการย้อนกลับสองรายการ
if...fi
ส่วนเปลี่ยนแปลงอาร์กิวเมนต์ทุบตี $ 1-0 ถ้าไม่มีก็ผ่านไปได้
git stash show
ดูเหมือนจะแสดงความแตกต่างระหว่างสำเนาที่ใช้งานได้และ # 1 (รหัสที่เกี่ยวข้องจาก git-stash.sh:git diff ${FLAGS:---stat} $b_commit $w_commit
โดยที่ $ b_commit คือ # 1 และ $ w_commit คือ stash คอมมิต); มีวิธีในตัวสำหรับgit stash show
การรวม # 3 ด้วยหรือไม่?