เป็นไปได้ไหมที่จะดูตัวอย่างเนื้อหาที่ซ่อนใน git?


554

ฉันมักจะออกไปทำงานในภายหลังจากนั้นมีสิ่งอื่นเข้ามาและอีกไม่กี่สัปดาห์ต่อมาฉันต้องการตรวจสอบที่ซ่อนและค้นหาการเปลี่ยนแปลงที่จะเกิดขึ้นถ้าฉันใช้มันกับต้นไม้ทำงานในสถานะปัจจุบัน

ฉันรู้ว่าฉันสามารถทำคอมไพล์บน stash ได้ แต่นี่แสดงให้ฉันเห็นถึงความแตกต่างทั้งหมดระหว่างแผนผังการทำงานกับ stash ในขณะที่ฉันแค่สนใจที่จะรู้ว่า stash ที่ใช้นั้นจะเปลี่ยนไปอย่างไร

ฉันจะทำสิ่งนี้ได้อย่างไร


1
เอาท์พุท diffized colorized: git stash show -p stash@{1} >~/.diff && vim ~/.diff(ไม่จำเป็นต้องมีvimตัวแก้ไขข้อความใด ๆ ตราบใดที่ตัวแก้ไขข้อความของคุณมีการเน้นไวยากรณ์เพื่อรองรับdiffเอาต์พุต)
เทรเวอร์บอยด์สมิ ธ

คำตอบ:


727

git stash showจะแสดงไฟล์ที่เปลี่ยนแปลงในที่เก็บล่าสุดของคุณ คุณสามารถเพิ่ม-pตัวเลือกเพื่อแสดงส่วนต่าง

git stash show -p

หาก stash ที่คุณสนใจไม่ใช่ที่ล่าสุดให้เพิ่มชื่อของ stash ที่ท้ายคำสั่ง:

git stash show -p stash@{2}

มันดูดีและฉันเห็นมันในคู่มือ แต่เมื่อฉันลองมันก็ให้fatal: unable to create temp-file: Invalid argumentความคิดกับฉันทำไม?
Benjol

29
ใช้git stash show -p stash@{0}เพื่อดูที่ซ่อนเฉพาะ 0 แสดงเสียงสุดท้าย 1 เสียงสุดท้ายที่สอง .. ฯลฯgit stash listจะแสดงทั้งหมดที่มี
brita_

6
หากคุณใช้ PowerShell คุณจะต้องใส่ชื่อที่ซ่อนไว้ในเครื่องหมายคำพูด (เช่น: git stash show -p 'stash@{0}')
สกอตต์ Pascoe


1
หากคุณต้องการบันทึกส่วนต่างในการใช้ไฟล์git stash show -p stash@{0}> stash.txt
S_K

87

หากต้องการดูรายการที่เก็บปัจจุบัน:

git stash list

คุณจะเห็นรายการดังนี้:

stash@{0}: WIP on ...
stash@{1}: ...
stash@{2}: ...
...

หากต้องการดู diff ต่าง ๆ ของ stashes เหล่านี้:

git stash show -p stash@{n}

34

ฉันเป็นแฟนตัวยงของgitkกราฟิก UI ของภาพ repos คอมไพล์ คุณสามารถดูรายการสุดท้ายที่ถูก stashed ด้วย:

gitk stash

นอกจากนี้คุณยังสามารถใช้ดูการเปลี่ยนแปลงที่ถูกเก็บถาวรใด ๆ ของคุณ (ตามที่ระบุไว้git stash list) ตัวอย่างเช่น:

gitk stash@{2}

ในภาพหน้าจอด้านล่างคุณจะเห็น stash เป็นการกระทำที่ด้านซ้ายบนเวลาและสถานที่ที่มันมาจากประวัติการกระทำรายการของไฟล์ที่แก้ไขที่ด้านล่างขวาและ diff-line-by-line ในด้านล่าง -ซ้าย. ทั้งหมดในขณะที่ซ่อนยังคงซ่อนตัวอยู่

gitk ดูที่ซ่อน


5
คุณสามารถระบุstash@{X}ค่าได้หลายค่าในบรรทัดคำสั่งเพื่อดูผลลัพธ์เพิ่มเติมในคราวเดียว แต่ฉันไม่พบวิธีง่ายๆในการพูดว่า 'แสดงรายการที่ซ่อนทั้งหมด' ใน gitk
สูงศักดิ์

5
gitk stashดูเหมือนว่าจดชวเลขgitk stash@{0}
Leif Gruenwoldt

3
เพื่อแสดงการซ่อนทั้งหมดใน gitk คุณสามารถใช้gitk `git stash list --pretty=format:%gd`แล้วค้นหา "WIP บน" เพื่อข้ามไปยังที่เก็บถัดไป
Ikar Pohorský

2
gitk --reflogช่วยให้คุณเห็นการหยุดชะงักทั้งหมดและอื่น ๆ
สูงศักดิ์

1
gitk เป็นเครื่องมือเดียวที่แสดงให้ฉันเห็นโดยตรงว่าที่เก็บมีไฟล์ที่ไม่ได้ติดตามซึ่งถูกบันทึกไว้ คนอื่น ๆ ทั้งหมดแสดงให้ฉันเห็นว่า "ไม่แตกต่าง"
Martin Bonner สนับสนุน Monica

22

หากต้องการดูการเปลี่ยนแปลงทั้งหมดในที่เก็บที่ไม่ได้ผุดให้ทำดังนี้

git stash show -p stash@{0}

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

git diff HEAD stash@{0} -- path/to/filename.php

ในกรณีที่หนึ่งจำชื่อไฟล์ไม่ได้มันก็ใช้ได้กับทุกไฟล์ที่เปลี่ยน git diff HEAD stash @ {0}
Simeon

เพียงเพื่อความชัดเจน: สั้นสำหรับ-p ตัวเลือกนี้ได้มาจาก--patch ถ้าคุณชอบแบบยาวคุณสามารถเขียนgit-diff git stash show --patch
Peterino

5

นอกเหนือจากคำแนะนำ gitk ในเป็นไปได้ไหมที่จะแสดงตัวอย่างเนื้อหาที่ซ่อนใน git? คุณสามารถติดตั้งtigและ call tig stashได้ โปรแกรมคอนโซลฟรี / เปิดนี้ช่วยให้คุณสามารถเลือกที่ซ่อนที่จะเปรียบเทียบ


1
ดูเหมือนว่าเป็นเครื่องมือที่สมบูรณ์แบบสำหรับการจัดการ stashes หลายรายการ! นอกจากนี้คุณยังสามารถป๊อปอัพและวางการหยุดด้วยปุ่มPและ!ตามลำดับ
Ikar Pohorský

ทางเลือก TUI ดีอยู่เสมอ แต่สำหรับชาวบ้านที่ใช้แล้วหรืออย่างใดพอใจที่gitk มันค่อนข้างง่ายที่จะตัดมันจะแสดง stashes
1737973

4

ฉันใช้สิ่งนี้เพื่อดูการหยุดของฉันทั้งหมดด้วยการเน้นสีที่ต่างกัน (ใน Fedora 21):

git stash list | 
  awk -F: '{ print "\n\n\n\n"; print $0; print "\n\n"; 
  system("git -c color.ui=always stash show -p " $1); }' | 
  less -R

(ดัดแปลงมาจากGit: ดูว่ามีอะไรซ่อนอยู่โดยไม่ใช้ที่ซ่อน )


4

เมื่อคำถามนี้ถูกถามครั้งแรกสิ่งนี้อาจไม่ได้เป็นตัวเลือก แต่ถ้าคุณใช้ PyCharm คุณสามารถใช้UnStash Changesเครื่องมือ (VCS-> Git-> UnStash Changes ... ) สิ่งนี้ช่วยให้คุณสามารถดูรายการการเปลี่ยนแปลงที่ถูกจัดเก็บรวมถึงป๊อป, ปล่อย, ล้างหรือนำไปใช้ (ลงในสาขาใหม่หากต้องการ):

Unstash หน้าต่างการเปลี่ยนแปลง

และดูไฟล์ที่เปลี่ยนแปลงต่อที่เก็บ:

เส้นทางที่ได้รับผลกระทบหน้าต่าง

เช่นเดียวกับ diffs ต่อไฟล์ ใน diffs คุณสามารถเลือกการเปลี่ยนแปลงแต่ละอย่างเพื่อนำไปใช้จากการเปลี่ยนแปลงที่เก็บไว้ในสาขาการทำงาน (โดยใช้เครื่องหมายบั้งชี้ซ้าย):

ป้อนคำอธิบายรูปภาพที่นี่


3

คุณสามารถดูรายการหยุดทั้งหมดได้โดยใช้คำสั่งต่อไปนี้:

$ git stash list

stash@{0}: WIP on dev: ddd4d75 spelling fix

stash@{1}: WIP on dev: 40e65a8 setting width for messages

......

......

......


stash@{12}: WIP on dev: 264fdab added token based auth

ใหม่ล่าสุดคือที่ซ่อนตัวแรก

คุณสามารถเลือกดัชนีnของที่เก็บไว้ในรายการด้านบนและใช้คำสั่งต่อไปนี้เพื่อดูรายละเอียดที่เก็บไว้

git stash show -p stash@{3}

ในทำนองเดียวกัน

git stash show -p stash@{n}

คุณสามารถตรวจสอบความแตกต่างได้โดยใช้คำสั่ง:

git diff HEAD stash@{n} -- /path/to/file

3

ใช่วิธีที่ดีที่สุดในการดูสิ่งที่ถูกแก้ไขคือการบันทึกในไฟล์เช่นนั้น:

git stash show -p stash@{0} > stash.txt

2

ก่อนอื่นเราสามารถใช้รายการ git stash เพื่อรับรายการ stash ทั้งหมด:

$git stash list
stash@{0}: WIP on ...
stash@{1}: WIP on ....
stash@{2}: WIP on ...

แล้วเราสามารถใช้ประโยชน์จากการตรวจสอบไฟล์ที่อยู่ภายใต้การสะสมที่เฉพาะเจาะจงgit stash show stash@{N} Nถ้าเรายิงมันเราก็จะได้:

$ git stash show stash@{2}
fatal: ambiguous argument 'stash@2': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

เหตุผลนี้อาจเป็นได้ว่าเปลือกกินวงเล็บปีกกาและคอมไพล์เห็นและไม่ได้stash@2 stash@{2}และเพื่อแก้ไขปัญหานี้เราจำเป็นต้องใช้เครื่องหมายคำพูดเดี่ยวสำหรับการจัดฟันเป็น

git stash show stash@'{2'}
com/java/myproject/my-xml-impl.xml                     | 16 ++++++++--------
com/java/myproject/MyJavaClass.java                    | 16 ++++++++--------
etc.

2

ดูรายการการเปลี่ยนแปลงที่ถูกซ่อน

git stash list

สำหรับการดูรายการไฟล์ที่เปลี่ยนแปลงในที่ซ่อนเฉพาะ

git stash show -p stash@{0} --name-only

สำหรับการดูไฟล์โดยเฉพาะอย่างยิ่งในที่ซ่อน

git show stash@{0} path/to/file

1

แสดงการหยุดทั้งหมด

ชื่อไฟล์เท่านั้น:

for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show $i; done

เนื้อหาไฟล์เต็มในที่เก็บทั้งหมด:

for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show -p $i; done

คุณจะได้รับเอาต์พุต diffized colorized ที่คุณสามารถเพจด้วยspace ( ไปข้างหน้า ) และb( ข้างหลัง ) และqเพื่อปิดเพจเจอร์สำหรับที่เก็บปัจจุบัน หากคุณต้องการมีไว้ในไฟล์> stashes.diffให้ผนวกเข้ากับคำสั่ง


1

เพิ่มเติมจากคำตอบที่มีอยู่ซึ่งแนะนำให้ใช้ (เพื่อแสดงความแตกต่างของที่ซ่อนที่สามถึงครั้งสุดท้าย)

git stash show -p stash@{2}

โปรดทราบว่าในgit-stashเอกสารนั้นมีการเขียนไว้ว่า

Stashes อาจถูกอ้างอิงด้วยการระบุเพียงดัชนี stash (เช่นจำนวนเต็มnเทียบเท่าstash@{n})

ดังนั้นจึงเป็นไปได้ที่จะใช้ (ซึ่งเทียบเท่ากับคำสั่งด้านบน)

git stash show -p 2

ซึ่งยังควรหลีกเลี่ยงบางประเด็น Powershell


1

ฉันชอบที่gitkจะแสดงให้คุณเห็นว่าอะไรที่ไม่ได้ติดตามหรือนั่งอยู่ในดัชนี แต่โดยค่าเริ่มต้นแล้วมันจะแสดง "การกระทำ" ที่ซ่อนอยู่ตรงกลางของการกระทำอื่น ๆ ของคุณในสาขาปัจจุบัน

เคล็ดลับคือการรัน gitk ดังนี้:

gitk "stash@{0}^!"

(การอ้างอิงอยู่ที่นั่นเพื่อทำให้มันทำงานใน Powershell แต่วิธีนี้มันควรจะทำงานในกระสุนอื่น ๆ เช่นกัน)

หากคุณค้นหาไวยากรณ์นี้ในหน้าช่วยเหลือ gitrevisionsคุณจะพบสิ่งต่อไปนี้:

r1^!สัญกรณ์รวมถึงการกระทำr1แต่ไม่รวมทั้งหมดของผู้ปกครองของตน โดยตัวมันเองเครื่องหมายนี้หมายถึงการกระทำเดียวr1

เห็นได้ชัดว่านี่จะทำให้ gitk อยู่ในโหมดที่แสดงเฉพาะผู้ปกครองที่ได้รับมอบหมายทันทีซึ่งเป็นสิ่งที่ฉันชอบ


หากคุณต้องการใช้สิ่งนี้เพิ่มเติมและแสดงรายการการหยุดทั้งหมดคุณสามารถเรียกใช้สิ่งนี้:

gitk `git stash list '--pretty=format:%gd^!'`

(คำพูดเดียวภายใน backticks จำเป็นต้องเอาใจ Bash ไม่เช่นนั้นจะบ่นเกี่ยวกับเครื่องหมายอัศเจรีย์)

หากคุณใช้ Windows และใช้ cmd หรือ Powershell:

gitk "--argscmd=git stash list --pretty=format:%gd^!"

0

คำสั่งดังต่อไปนี้สามารถใช้เพื่อแยกความแตกต่างของการเปลี่ยนแปลงที่ถูกเก็บไว้อีกครั้งเพื่อซ่อนหรือกระทำหรือสาขาหรือหัวหน้า

git stash show
git show
git diff
git difftool

มาดูกันว่าเราจะใช้คำสั่งที่กล่าวถึงข้างต้นได้อย่างไร

  1. git stash show

คำสั่ง git stash show ที่เรียบง่ายให้ข้อมูลสรุปโดยย่อเกี่ยวกับการเปลี่ยนแปลงของไฟล์ แต่จะไม่แสดงความแตกต่างของการเปลี่ยนแปลงกับ HEAD ปัจจุบัน

  1. แสดงคอมไพล์

คำสั่ง git-show ใช้เพื่อดูวัตถุประเภทต่างๆ

คำสั่ง git-show ไม่เพียง แต่ใช้เพื่อให้เห็นภาพการเปลี่ยนแปลงของสแตช แต่ยังใช้เพื่อดูวัตถุหนึ่งรายการหรือมากกว่าเช่น blobs, ต้นไม้, แท็กและคอมมิชชัน

  1. คอมไพล์ diff

คำสั่ง git-diff เป็นหนึ่งในคำสั่งทั่วไปที่ใช้เพื่อแสดงการเปลี่ยนแปลงระหว่างคอมมิท, คอมมิทและแผนผังการทำงานเป็นต้น

ตามค่าเริ่มต้น git diff จะแสดงผลต่างของการสะสมที่เลือกกับ (ไฟล์ที่แก้ไข) สถานะปัจจุบันของที่เก็บเว้นแต่จะมีการระบุการอ้างอิงหรือการคอมมิชชันอื่น ๆ

ในการรับความแตกต่างระหว่างที่ซ่อนส่วนใหญ่ที่ซ่อน @ {0} และสาขาหลัก:

$ git diff stash @ {0} หลัก

แสดงเฉพาะชื่อไฟล์ที่ไม่ต่างจากการเปลี่ยนแปลงเท่านั้น:

$ git diff - ชื่อเฉพาะที่ซ่อน @ {0} ต้นแบบ

ดูความแตกต่างระหว่างการซ่อนที่เลือกสำหรับไฟล์ที่เลือก:

$ git diff stash @ {0} ^ 1 stash @ {0} -

  1. คอมไพล์ difftool

คำสั่ง git-difftool ยังสามารถใช้เพื่อค้นหาความแตกต่างระหว่างที่เก็บที่เลือกและการกระทำที่เลือกหรือสาขาหรือที่เก็บสะสม

ดูความแตกต่างระหว่างการซ่อนสองครั้งล่าสุด:

$ git difftool stash @ {0} stash @ {0} ^ 1

git difftool --dir-diff stash @ {0} stash @ {0} ^ 1

สรุป:

คำสั่งที่มีประโยชน์ในการแยกความแตกต่างจาก stash git stash show, git diff, git diff, git difftool

ดูความแตกต่างโดยใช้คำสั่ง git stash show

git stash show -p stash @ {0}

ดูการเปลี่ยนแปลงในที่เก็บของโดยใช้คำสั่ง git show

git show stash @ {1}

ดูความแตกต่างระหว่างที่เก็บล่าสุดและคอมมิชชันที่เลือกโดยใช้คำสั่ง git diff

git diff stash @ {0}

อ้างอิง:

https://howto.lintel.in/how-to-see-stashed-changes-using-git-stash/

https://git-scm.com/docs/git-show

https://git-scm.com/docs/git-stash

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