Git ต่างกับที่เก็บของ


1359

ฉันจะดูการเปลี่ยนแปลงที่ไม่มีการหยุดนิ่งได้อย่างไรกับแผนผังการทำงานปัจจุบัน ฉันต้องการทราบว่าจะมีการเปลี่ยนแปลงใดบ้างก่อนที่จะนำไปใช้!



1
โพสต์ที่เกี่ยวข้องที่นี่
RBT

คำตอบ:


1872

ดูที่สะสมล่าสุด:

git stash show -p

ดูที่เก็บของตามอำเภอใจ:

git stash show -p stash@{1}

จากgit stashmanpages:

โดยค่าเริ่มต้นคำสั่งจะแสดง diffstat แต่จะยอมรับรูปแบบใด ๆ ที่รู้จัก git diff (เช่น git stash show -p stash @ {1} เพื่อดู stash ล่าสุดที่สองในรูปแบบแพทช์)


72
stash@{0}เป็นค่าเริ่มต้น คุณต้องการอาร์กิวเมนต์ถ้าคุณต้องการดูที่เก็บข้อมูลก่อนหน้านี้
Cascabel

52
ขวา. ฉันแค่ให้มันเพื่อให้ชัดเจนว่าจะมองไปยังที่ซ่อนอื่น ๆ{0}ได้อย่างไร
แอมเบอร์

74
สิ่งนี้จะไม่แสดงความแตกต่างระหว่างที่ซ่อนและที่ทำงานปัจจุบัน แต่ระหว่างที่เก็บซ่อนและเป็นผู้ปกครองดั้งเดิม ขวา? จาก manpage: "แสดงการเปลี่ยนแปลงที่บันทึกไว้ในที่เก็บเป็นความแตกต่างระหว่างสถานะที่เก็บไว้กับพาเรนต์ดั้งเดิม"
Magne

14
@Amber - จริงแม้ว่าต้นไม้ทำงานปัจจุบันของคุณสกปรกมันสำคัญและทำให้ซับซ้อนขึ้นเล็กน้อย ฉันมาจากมุมมองนั้นและพบขั้นตอนที่ฉันแบ่งปันในคำตอบด้านล่าง
Magne

6
สิ่งที่-pยืนสำหรับ
เจอราลด์

308

หากต้องการดูที่สะสมล่าสุด:

git stash show -p

หากต้องการดูที่เก็บถาวร:

git stash show -p stash@{1}

นอกจากนี้ฉันใช้ git diff เพื่อเปรียบเทียบ stash กับสาขาใด ๆ

คุณสามารถใช้ได้:

git diff stash@{0} master

หากต้องการดูการเปลี่ยนแปลงทั้งหมดเมื่อเทียบกับสาขาหลัก


หรือคุณสามารถใช้:

git diff --name-only stash@{0} master

เพื่อให้ง่ายต่อการค้นหาเฉพาะชื่อไฟล์ที่เปลี่ยนแปลง


10
นี่ไม่ได้ตอบคำถามเฉพาะ หากคุณสร้างที่เก็บข้อมูลจากต้นแบบ (เพื่อบันทึกงานไว้ใช้ในภายหลัง) จากนั้นทำข้อผูกพันบางอย่างสำหรับงานอื่น ๆ ในงานหลักจากนั้นทำgit diff stash@{0} masterคุณจะได้รับผลต่างจากที่เก็บของคุณกับต้นแบบปัจจุบัน (ซึ่งรวมถึงงานที่ทำ ทำแล้ว) ไม่ใช่ไฟล์ / บรรทัดที่ stash จะเปลี่ยนซึ่งเป็นคำถามที่เกี่ยวกับ
Tom De Leu

52
ฉันดีใจที่คุณตอบคำถามแม้ว่ามันจะไม่ใช่คำตอบสำหรับคำถามที่แน่นอน มันให้ข้อมูลเพิ่มเติมและฉันคิดว่ามันเป็นเรื่องดีที่ได้ทราบวิธีการแตกต่างระหว่างสาขาและสาขาอื่น ๆ ที่คุณต้องการเปรียบเทียบ ฉันชอบการเรียนรู้ธง
Rebekah Waterbury

6
สิ่งนี้ยังอนุญาตให้ดูความแตกต่างโดยใช้ตัวแสดง diff ที่กำหนดเองเช่นgit difftool --tool=... stash@{0} HEAD
Andre Holzner

9
@TomDeLeu การสังเกตที่ดีและเป็นจุดสำคัญ เพื่อเปรียบเทียบรายการสะสมกับผู้ปกครองของมันดูเหมือนว่าจะใช้งานได้:git diff stash@{0}^ stash@{0}
erikprice

1
เช่นกันคุณสามารถเพิ่มชื่อไฟล์git diff stash@{0} master -- filenameเพื่อรับการเปลี่ยนแปลงไปยังไฟล์เฉพาะ
เดวิด

104

หากสาขาที่การเปลี่ยนแปลงที่คุณเก็บไว้มีการเปลี่ยนแปลงในระหว่างนี้คำสั่งนี้อาจมีประโยชน์:

git diff stash@{0}^!

สิ่งนี้เปรียบเทียบการซ่อนเร้นกับการคอมมิทมันขึ้นอยู่กับ


ดีมากฉันได้เพิ่มนามแฝงไปยัง~/.gitconfig:laststash = diff stash@{0}^!
sbeam

5
คู่ที่สมบูรณ์แบบ: git difftool stash^!สำหรับความแตกต่างของการสะสมครั้งสุดท้ายเมื่อเทียบกับการส่งมอบมันขึ้นอยู่กับgit difftool stash HEADสำหรับความแตกต่างของการสะสมครั้งสุดท้ายกับการกระทำในปัจจุบัน (stash @ {n} สำหรับการสะสมก่อนหน้านี้)
ChrisV


"git diff stash @ {0} ^!" เดือดลงไปที่ "git diff stash @ {0} ^ stash @ {0} ~ 1 ^ stash @ {0} ~ 2 ....... " แต่เมื่อ git diff ใช้เพียง 2 คอมมิทมันจะแสดงความแตกต่างระหว่าง stash @ {0} และ ^ stash @ {0} ~ 1 และดู ^ ที่จุดเริ่มต้นของการคอมมิชชันที่ 2 ไม่ได้ทำให้แตกต่างกันและคอมไพล์ละเว้นมัน
นาคคีราน

ฉันชอบรุ่นนี้เพื่อให้สามารถใช้เครื่องมือ diff ที่ฉันต้องการ (นอกเหนือจากการเปรียบเทียบแน่นอน!) สิ่งนี้ยังแสดงให้เห็นถึงการเปลี่ยนแปลงที่ซ่อนนี้ซึ่งฉันเชื่อว่าเป็นคำถามเดิมเมื่อเทียบกับทางเลือกอื่นที่กล่าวถึงในความคิดเห็นข้างต้น "git diff stash @ {X} ^ stash @ {X}" ซึ่งแสดงมากกว่า diff ที่ถูกจัดเก็บ
user107172

44

ถ้าต้นไม้ทำงานของคุณสกปรกคุณสามารถเปรียบเทียบกับที่เก็บข้อมูลได้โดยการยอมรับต้นไม้ทำงานที่สกปรกก่อนแล้วจึงเปรียบเทียบกับที่เก็บ หลังจากนั้นคุณอาจยกเลิกการผูกมัดกับแผนผังการทำงานที่สกปรก (เนื่องจากคุณอาจไม่ต้องการให้คอมมิทสกปรกในบันทึกการกระทำของคุณ)

คุณยังสามารถใช้วิธีการต่อไปนี้เพื่อเปรียบเทียบการจัดเก็บสองครั้งด้วยกัน (ซึ่งในกรณีนี้คุณเพิ่งเปิดหนึ่งในการจัดเก็บครั้งแรก)

  • มอบแผนผังการทำงานที่สกปรกของคุณ:

    git add .
    git commit -m "Dirty commit"
    
  • สร้างความแตกต่างด้วยการกระทำที่:

    git diff HEAD stash@{0}
    
  • จากนั้นหลังจากนั้นคุณสามารถคืนความมุ่งมั่นและนำกลับมาใช้ใน dir ที่ทำงาน:

    git reset --soft HEAD~1
    git reset .
    

ตอนนี้คุณได้กระจายต้นไม้ทำงานที่สกปรกด้วยที่ซ่อนของคุณและกลับไปที่จุดเริ่มต้นของคุณ


มีวิธีการทำเช่นนี้ แต่จะเห็นความแตกต่างของไฟล์ที่จะเปลี่ยนแปลงโดยสิ่งที่อยู่ในที่ซ่อน?
lagweezle

ในปี2020สิ่งนี้ง่ายกว่ามาก ตรวจสอบคำตอบล่าสุดของฉัน
David Deprost

git stash show -l ที่น่าสนใจผมไม่ทราบเกี่ยวกับ มันแตกต่างที่สะสมล่าสุดกับสำเนาทำงาน (สกปรก) หรือไม่? คุณใช้งานโดยไม่ได้รับได้error: switch l requires a valueอย่างไร?
Magne

ใช่มันแตกต่างกับสำเนาทำงาน (อาจสกปรก) git stash show -lคุณสามารถใช้มันก็โดยการป้อน ทำไมมันใช้ไม่ได้กับคุณฉันเดาได้แค่ว่าคุณเป็น git รุ่นเก่า? ฉันใช้ v2.20.1 คอมไพล์แล้วและมันทำงานได้อย่างไร้ที่ติโดยไม่มีข้อผิดพลาด
David Deprost

25

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

git stash save "temp"
git diff stash@{0} stash@{1}
git stash pop

ที่แสดงความแตกต่างระหว่างด้านบนสุดของสแต็กสแต็กและโฟลเดอร์ที่ทำงานของคุณโดยการเปลี่ยนแปลงโฟลเดอร์ทำงานชั่วคราวของคุณจะกลายเป็นด้านบนของสแต็คสแตช (stash @ {0}) ย้ายด้านบนลงหนึ่งต้นฉบับ (Stash @ {1} ) จากนั้นเปรียบเทียบโดยใช้อันดับต้น ๆ ในตำแหน่ง 'ชุดใหม่' เพื่อให้คุณเห็นการเปลี่ยนแปลงที่เกิดขึ้นจากการนำไปใช้กับงานปัจจุบันของคุณ

"แต่ถ้าฉันไม่มีงานปัจจุบันล่ะ" จากนั้นคุณจะอยู่ในกรณีที่น่าเบื่อปกติ เพียงใช้คำตอบของ @ Amber

git stash show

หรือคำตอบของ @ czerasz

git diff stash@{0}

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

git stash apply
git diff
git reset
git checkout

3
วิธีการง่ายๆนี้ (ที่เก็บแล้วเปรียบเทียบกับที่เก็บอื่น) ปลอดภัยและง่ายต่อการเข้าใจ สำหรับกรณีการใช้งานบางกรณีคุณอาจต้องการซ่อนไฟล์ที่ไม่ได้ติดตามด้วยgit stash save -u
mleonard

19

สิ่งนี้ใช้ได้กับฉันใน git เวอร์ชั่น 1.8.5.2:

git diff stash HEAD

2
ทำให้เข้าใจผิด! คำถามคือ: ฉันจะเห็นการเปลี่ยนแปลงที่ไม่มีการหยุดนิ่งได้อย่างไรกับแผนผังการทำงานปัจจุบัน git stash applyนี้แสดงให้เห็นความแตกต่างระหว่างการสะสมและหัวซึ่งอาจจะแตกต่างจากสิ่งที่จะนำมาประยุกต์ใช้กับมาก
MikeJansen

โปรดอ่านคำถามเพิ่มเติม "ฉันต้องการทราบว่าการเปลี่ยนแปลงใดที่จะเกิดขึ้นก่อนที่จะนำไปใช้!" ฉันกำลังให้คำตอบอย่างรวดเร็วนี้
yerlilbilgin

นอกจากนี้คุณยังสามารถดูคำตอบอื่น ๆ ทั้งหมดเกี่ยวกับการกระจายหัวปัจจุบัน (หรือชุดการทำงาน) กับที่ซ่อน ทำไมคำตอบของฉันเพียงทำให้เข้าใจผิด? มันไม่ยุติธรรม.
yerlilbilgin

@yerlilbilgin ดูคำตอบของฉันตามคำตอบของคุณด้านล่าง
MikeJansen

เราสามารถ ommit HEAD เป็นค่าเริ่มต้นใช่ไหม
อัลจี

10

ในกรณีที่ต้องการเปรียบเทียบไฟล์ในแผนผังการทำงานและในที่เก็บซ่อนให้ใช้คำสั่งด้านล่าง

git diff stash@{0} -- fileName (with path)

9

หากคุณมีเครื่องมือต่าง ๆ (เช่นการเปรียบเทียบ)

git difftool stash HEAD

1
ทำให้เข้าใจผิด! คำถามคือ: ฉันจะเห็นการเปลี่ยนแปลงที่ไม่มีการหยุดนิ่งได้อย่างไรกับแผนผังการทำงานปัจจุบัน git stash applyนี้แสดงให้เห็นความแตกต่างระหว่างการสะสมและหัวซึ่งอาจจะแตกต่างจากสิ่งที่จะนำมาประยุกต์ใช้กับมาก
MikeJansen

1
หากคุณคิดว่านี่เป็นสิ่งที่ทำให้เข้าใจผิดโปรดตรวจสอบคำตอบอื่น ๆ ทั้งหมด มันไม่ยุติธรรม!
yerlilbilgin

1
คุณจะทราบว่าฉันได้คัดลอกความคิดเห็นเดียวกันนั้นไปยังคำตอบอื่นซึ่งเป็นเพียงการทำให้เข้าใจผิด คำตอบอื่น ๆ ที่มีความคิดเห็นคล้าย ๆ กันที่ฉันทิ้งไว้คนเดียว หากคุณเข้าใจวิธีการทำงานของ git stash คุณจะรู้ได้ว่าการกระจายที่ซ่อนไว้กับ HEAD นั้นไม่ใช่สิ่งที่นำไปใช้ (ซึ่งเป็นสิ่งที่ OP ถาม) "ที่ซ่อน" ที่แท้จริงคือความแตกต่างระหว่างที่เก็บข้อมูลและสิ่งที่อยู่ก่อนหน้า แพตช์นี้จะถูกนำไปใช้กับ HEAD ดังนั้นหากคุณต้องการรู้ว่า OP ถามอะไรคุณต้องแสดงความแตกต่างระหว่างที่เก็บของและคำสั่งก่อนหน้าซึ่งคำตอบที่ถูกต้องทำ
MikeJansen

1
วิธีนี้จะตอบคำถามได้โดยตรงมากกว่าคำตอบแบบยาว ๆ (ไม่จำเป็น) และทำในสิ่งที่ OP HEADต้องการอย่างแน่นอน ฉันสามารถแก้ไข @ yerlilbilgin คำตอบเพื่อลบ HEAD แต่ฉันคิดว่าทุกคนที่ใช้ git สามารถคิดส่วนนั้นและฉันยาวคำตอบจะทำให้อ่านได้น้อย ไม่มีตำหนิบน @yerlibilgin
Sridhar Sarnobat

4

วิธีหนึ่งในการทำสิ่งนี้โดยไม่เคลื่อนย้ายสิ่งใดคือการใช้ประโยชน์จากความจริงที่ว่าpatchสามารถอ่าน git diff's ได้

git stash show -p | patch -p1 --verbose --dry-run

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


2

รวมสิ่งที่ฉันได้เรียนรู้ในหัวข้อนี้และในตอนนี้เมื่อฉันต้องการที่จะเห็น "สิ่งที่อยู่ในที่ซ่อน" ฉันวิ่งครั้งแรก:

git stash show stash@{0}

ที่จะแสดงไฟล์ที่ถูกแก้ไข จากนั้นเพื่อให้ได้ภาพที่ดีใน diffftool ฉันจะ:

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

สิ่งนี้จะแสดงความแตกต่างทั้งหมดในครั้งเดียวของที่เก็บที่กำหนดกับผู้ปกครอง

คุณสามารถกำหนดค่าเครื่องมือ diff ใน~/.gitconfigเช่นด้วยMeld :

...
[diff]
    tool = meld

1

FWIW นี่อาจจะซ้ำซ้อนกับคำตอบอื่น ๆ ทั้งหมดและคล้ายกับคำตอบที่ยอมรับซึ่งเป็นจุด แต่บางทีมันอาจจะช่วยใครบางคนออกมา

git stash show --helpจะให้ทุกสิ่งที่คุณต้องการ รวมถึงข้อมูลการแสดงที่ซ่อน

แสดง [<stash>]

แสดงการเปลี่ยนแปลงที่บันทึกไว้ในที่เก็บเป็นความแตกต่างระหว่างสถานะที่เก็บไว้และพาเรนต์ดั้งเดิม เมื่อไม่ได้รับแสดงล่าสุด โดยค่าเริ่มต้นคำสั่งจะแสดง diffstat แต่จะยอมรับรูปแบบใด ๆ ที่รู้จัก git diff (เช่น git stash show -p stash @ {1} เพื่อดู stash ล่าสุดที่สองในรูปแบบแพทช์) คุณสามารถใช้ตัวแปรการตั้งค่า stash.showStat และ / หรือ stash.showPatch เพื่อเปลี่ยนพฤติกรรมเริ่มต้น


1

เธอเป็นรายชื่อที่ซ่อน

git stash list 
stash@{0}: WIP on feature/blabla: 830335224fa Name Commit
stash@{1}: WIP on feature/blabla2: 830335224fa Name Commit 2

ดังนั้นขอหมายเลขที่เก็บและทำ:

คุณทำได้:

 git stash show -p stash@{1}

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

คุณสามารถใช้ได้:

git diff stash@{0}

หรือ

git diff stash@{0} <branch name>

อีกสิ่งที่น่าสนใจคือ:

git stash apply
git stash apply stash@{10}

นี่ใช้การซ่อนโดยไม่ลบออกจากรายการคุณสามารถgit checkout .ลบการเปลี่ยนแปลงเหล่านั้นหรือหากคุณยินดีที่git stash drop stash@{10}จะลบการซ่อนออกจากรายการ

จากที่นี่ฉันไม่เคยแนะนำให้ใช้git stash popและใช้การรวมกันของgit stash applyและgit stash dropถ้าคุณใช้ที่ซ่อนอยู่ในสาขาที่ไม่ถูกต้อง ... ดีบางครั้งก็ยากที่จะกู้คืนรหัสของคุณ


1

ขึ้นอยู่กับสิ่งที่คุณต้องการเปรียบเทียบการสะสมด้วย (แผนผังการทำงานในท้องถิ่น / การกระทำหลัก / การกระทำของหัวหน้า) มีหลายคำสั่งที่ใช้ได้ในระหว่างที่ดีเก่าgit diffและเฉพาะเจาะจงมากขึ้นgit stash show:

╔══════════════════════╦═══════════════════════════════╦═══════════════════╗
║ Compare stash with ↓ ║ git diff                      ║ git stash show    ║
╠══════════════════════╬═══════════════════════════════╬═══════════════════╣
║ Local working tree   ║ git diff stash@{0}            ║ git stash show -l ║
║----------------------║-------------------------------║-------------------║
║ Parent commit        ║ git diff stash@{0}^ stash@{0} ║ git stash show -p ║
║----------------------║-------------------------------║-------------------║
║ HEAD commit          ║ git diff stash@{0} HEAD       ║   /               ║
╚══════════════════════╩═══════════════════════════════╩═══════════════════╝

ในขณะที่git stash showดูเป็นมิตรกับผู้ใช้มากขึ้นตั้งแต่แรกเห็นแล้วgit diffมันมีประสิทธิภาพมากกว่าในการระบุชื่อไฟล์สำหรับโฟกัสที่ต่างกัน ฉันได้ตั้งขึ้นเองนามแฝงสำหรับทุกคำสั่งเหล่านี้ในฉันzsh คอมไพล์ปลั๊กอิน

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