ในคอมไพล์มีวิธีแสดงไฟล์ที่ไม่ได้ติดตามโดยไม่ใช้ที่ซ่อนหรือไม่?


105

ถ้าฉันเรียกใช้git stash -uฉันสามารถซ่อนไฟล์ที่ไม่ถูกติดตามได้ อย่างไรก็ตามกล่าวว่าไฟล์ที่ไม่ได้ติดตามจะไม่ปรากฏเลยด้วยgit stash show stash@{0}ไฟล์. มีวิธีใดบ้างในการแสดงไฟล์ที่ซ่อนไว้โดยไม่ใช้ที่เก็บ

คำตอบ:


127

ไฟล์ที่ไม่ได้ติดตามจะถูกเก็บไว้ในพาเรนต์ที่สามของ 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 ซ้ำ: ไฟล์ที่ติดตามสามารถนำไปใช้เป็นแพตช์ได้อย่างง่ายดายในขณะที่ไฟล์ที่ไม่ได้ติดตามสามารถใช้ได้เฉพาะในทางทฤษฎีเป็น "ทั้งไฟล์"


ดังนั้นผู้ปกครองของ stash คอมมิตคือ (1. Commit stash ทำกับ 2. Index 3. Untracked working copy) และ stash คอมมิตเองมีสำเนาการทำงานที่ถูกติดตาม? 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 ด้วยหรือไม่?
Max Nanasy

ในขณะที่คุณบอกว่าผมยังไม่ได้พบวิธีที่จะได้รับมุมมองสรุปเดียวของสะสม git log --graph --topo-order -m -uแต่คุณสามารถดูข้อมูลที่สมบูรณ์ในหนึ่งคำสั่งด้วย: matthewlmcclure.com/s/2014/01/10/…
Matt McClure

4
โปรดทราบว่าคุณได้รับข้อผิดพลาดที่น่าเกลียด ( fatal: ambiguous argument 'stash@{0}^3': unknown revision or path not in the working tree.) หากคุณไม่มีไฟล์ที่ไม่ได้ติดตามในที่เก็บข้อมูลนั้น (แต่คิดว่าคุณทำ)
Randall

2
@antak: git stash showไม่ไม่แสดงไฟล์ที่ไม่ได้ติดตาม (จริงอย่างน้อย git 2.7.4):
Norbert Bérci

1
หมายเหตุ (2.13.2-linux): ขั้นgit stash popแรกจะพยายามกู้คืนไฟล์ที่ไม่ถูกติดตามจากนั้นพยายามกู้คืนไฟล์ที่ติดตาม หากการดำเนินการหลังล้มเหลว (เช่นความขัดแย้ง) การดำเนินการแรกจะไม่ย้อนกลับ (ไฟล์ที่ไม่ถูกติดตามจะยังคงอยู่เหมือนเดิม แต่ไฟล์จะไม่ถูกลบออกจากดิสก์) ดังนั้นแม้ว่าคุณจะแก้ไขข้อขัดแย้งป๊อปถัดไปก็จะล้มเหลว อย่างไรก็ตาม.
Marinos

24

คุณสามารถแสดงรายการ 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>

Grep ไฟล์ที่ไม่ถูกติดตาม

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 ตอนนี้ฉันจะแสดงการเปลี่ยนแปลงนี้ได้อย่างไร? (ฉันไม่แน่ใจว่าอยู่ในที่ซ่อนใด)
John Smith

1
แฮชนั้นมีไว้สำหรับออบเจ็กต์ไฟล์ (หยด) ดังนั้นคุณสามารถใช้git show 05e25619a6f2649b7d635b5aa897cbfc68a4f15d > widget/app.css. ( widget/แน่นอนว่าต้องมีไดเรกทอรีอยู่ดังนั้นจึงไม่สะดวกเท่าการใช้git checkoutกับ pathspec)
Steve

วิธีที่ดีในการแก้ปัญหานี้ @Steve
John Smith

10

หากต้องการแสดงรายการไฟล์ที่ไม่ได้ติดตามในที่เก็บ:

git ls-tree -r stash@{0}^3 --name-only

หากต้องการแสดงความแตกต่างทั้งหมดของไฟล์ที่ไม่ได้ติดตามทั้งหมด (พร้อมเนื้อหา):

git show stash@{0}^3

คำสั่งเหล่านี้อ่านที่เก็บล่าสุด (ล่าสุด) สำหรับการเก็บก่อนหน้านี้ให้เพิ่มตัวเลขที่อยู่ด้านหลัง "stash @" เป็นต้นstash@{2}ครั้งที่สองจากที่เก็บล่าสุด

เหตุผลที่ใช้งานได้คือgit stashสร้างการรวมคอมมิตสำหรับแต่ละที่เก็บซึ่งสามารถอ้างอิงได้ว่าstash@{0} , stash@{1}ฯลฯ ผู้ปกครองครั้งแรกของการกระทำนี้เป็นหัวหน้าในช่วงเวลาของสะสมที่ผู้ปกครองที่สองมีการเปลี่ยนแปลงไปยังไฟล์การติดตามและ ประการที่สาม (ซึ่งอาจไม่มีอยู่) การเปลี่ยนแปลงไฟล์ที่ไม่ได้ติดตาม

นี้จะอธิบายบางส่วนในmanpage ภายใต้ "การสนทนา"


6

หากต้องการดูไฟล์ทั้งหมดในที่ซ่อน (ทั้งที่ติดตามและไม่ถูกติดตาม) ฉันได้เพิ่มนามแฝงนี้ในการกำหนดค่าของฉัน:

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 ถ้าไม่มีก็ผ่านไปได้


5

วิธีแก้ปัญหา: การจัดเตรียมไฟล์ก่อนที่จะเก็บไว้จะทำให้git stash show -pทำงานได้ตามที่คาดไว้

git add .
git stash save

หมายเหตุ:วิธีการนี้จะช่วยให้อำนาจในการเพิ่มส่วนโต้ตอบเกินไปนี่คือวิธี
ข้อควรระวัง:ตรวจสอบให้แน่ใจว่าคุณไม่ได้จัดฉากงานมาก่อนมิฉะนั้นคุณจะไม่สามารถแยกแยะได้
นี่อาจเป็นประโยชน์

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