ฉันจะดูการเปลี่ยนแปลงที่ไม่มีการหยุดนิ่งได้อย่างไรกับแผนผังการทำงานปัจจุบัน ฉันต้องการทราบว่าจะมีการเปลี่ยนแปลงใดบ้างก่อนที่จะนำไปใช้!
ฉันจะดูการเปลี่ยนแปลงที่ไม่มีการหยุดนิ่งได้อย่างไรกับแผนผังการทำงานปัจจุบัน ฉันต้องการทราบว่าจะมีการเปลี่ยนแปลงใดบ้างก่อนที่จะนำไปใช้!
คำตอบ:
ดูที่สะสมล่าสุด:
git stash show -p
ดูที่เก็บของตามอำเภอใจ:
git stash show -p stash@{1}
จากgit stash
manpages:
โดยค่าเริ่มต้นคำสั่งจะแสดง diffstat แต่จะยอมรับรูปแบบใด ๆ ที่รู้จัก git diff (เช่น git stash show -p stash @ {1} เพื่อดู stash ล่าสุดที่สองในรูปแบบแพทช์)
stash@{0}
เป็นค่าเริ่มต้น คุณต้องการอาร์กิวเมนต์ถ้าคุณต้องการดูที่เก็บข้อมูลก่อนหน้านี้
{0}
ได้อย่างไร
-p
ยืนสำหรับ
หากต้องการดูที่สะสมล่าสุด:
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
เพื่อให้ง่ายต่อการค้นหาเฉพาะชื่อไฟล์ที่เปลี่ยนแปลง
git diff stash@{0} master
คุณจะได้รับผลต่างจากที่เก็บของคุณกับต้นแบบปัจจุบัน (ซึ่งรวมถึงงานที่ทำ ทำแล้ว) ไม่ใช่ไฟล์ / บรรทัดที่ stash จะเปลี่ยนซึ่งเป็นคำถามที่เกี่ยวกับ
git difftool --tool=... stash@{0} HEAD
git diff stash@{0}^ stash@{0}
git diff stash@{0} master -- filename
เพื่อรับการเปลี่ยนแปลงไปยังไฟล์เฉพาะ
หากสาขาที่การเปลี่ยนแปลงที่คุณเก็บไว้มีการเปลี่ยนแปลงในระหว่างนี้คำสั่งนี้อาจมีประโยชน์:
git diff stash@{0}^!
สิ่งนี้เปรียบเทียบการซ่อนเร้นกับการคอมมิทมันขึ้นอยู่กับ
~/.gitconfig
:laststash = diff stash@{0}^!
git difftool stash^!
สำหรับความแตกต่างของการสะสมครั้งสุดท้ายเมื่อเทียบกับการส่งมอบมันขึ้นอยู่กับgit difftool stash HEAD
สำหรับความแตกต่างของการสะสมครั้งสุดท้ายกับการกระทำในปัจจุบัน (stash @ {n} สำหรับการสะสมก่อนหน้านี้)
ถ้าต้นไม้ทำงานของคุณสกปรกคุณสามารถเปรียบเทียบกับที่เก็บข้อมูลได้โดยการยอมรับต้นไม้ทำงานที่สกปรกก่อนแล้วจึงเปรียบเทียบกับที่เก็บ หลังจากนั้นคุณอาจยกเลิกการผูกมัดกับแผนผังการทำงานที่สกปรก (เนื่องจากคุณอาจไม่ต้องการให้คอมมิทสกปรกในบันทึกการกระทำของคุณ)
คุณยังสามารถใช้วิธีการต่อไปนี้เพื่อเปรียบเทียบการจัดเก็บสองครั้งด้วยกัน (ซึ่งในกรณีนี้คุณเพิ่งเปิดหนึ่งในการจัดเก็บครั้งแรก)
มอบแผนผังการทำงานที่สกปรกของคุณ:
git add .
git commit -m "Dirty commit"
สร้างความแตกต่างด้วยการกระทำที่:
git diff HEAD stash@{0}
จากนั้นหลังจากนั้นคุณสามารถคืนความมุ่งมั่นและนำกลับมาใช้ใน dir ที่ทำงาน:
git reset --soft HEAD~1
git reset .
ตอนนี้คุณได้กระจายต้นไม้ทำงานที่สกปรกด้วยที่ซ่อนของคุณและกลับไปที่จุดเริ่มต้นของคุณ
git stash show -l
ที่น่าสนใจผมไม่ทราบเกี่ยวกับ มันแตกต่างที่สะสมล่าสุดกับสำเนาทำงาน (สกปรก) หรือไม่? คุณใช้งานโดยไม่ได้รับได้error: switch l requires a value
อย่างไร?
git stash show -l
คุณสามารถใช้มันก็โดยการป้อน ทำไมมันใช้ไม่ได้กับคุณฉันเดาได้แค่ว่าคุณเป็น git รุ่นเก่า? ฉันใช้ v2.20.1 คอมไพล์แล้วและมันทำงานได้อย่างไร้ที่ติโดยไม่มีข้อผิดพลาด
@ คำตอบของ 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
git stash save -u
สิ่งนี้ใช้ได้กับฉันใน git เวอร์ชั่น 1.8.5.2:
git diff stash HEAD
git stash apply
นี้แสดงให้เห็นความแตกต่างระหว่างการสะสมและหัวซึ่งอาจจะแตกต่างจากสิ่งที่จะนำมาประยุกต์ใช้กับมาก
ในกรณีที่ต้องการเปรียบเทียบไฟล์ในแผนผังการทำงานและในที่เก็บซ่อนให้ใช้คำสั่งด้านล่าง
git diff stash@{0} -- fileName (with path)
หากคุณมีเครื่องมือต่าง ๆ (เช่นการเปรียบเทียบ)
git difftool stash HEAD
git stash apply
นี้แสดงให้เห็นความแตกต่างระหว่างการสะสมและหัวซึ่งอาจจะแตกต่างจากสิ่งที่จะนำมาประยุกต์ใช้กับมาก
HEAD
ต้องการอย่างแน่นอน ฉันสามารถแก้ไข @ yerlilbilgin คำตอบเพื่อลบ HEAD แต่ฉันคิดว่าทุกคนที่ใช้ git สามารถคิดส่วนนั้นและฉันยาวคำตอบจะทำให้อ่านได้น้อย ไม่มีตำหนิบน @yerlibilgin
วิธีหนึ่งในการทำสิ่งนี้โดยไม่เคลื่อนย้ายสิ่งใดคือการใช้ประโยชน์จากความจริงที่ว่าpatch
สามารถอ่าน git diff's ได้
git stash show -p | patch -p1 --verbose --dry-run
นี่จะแสดงตัวอย่างทีละขั้นตอนว่าแพทช์ปกติจะทำอะไร สิทธิประโยชน์เพิ่มเติมสำหรับสิ่งนี้คือแพทช์จะไม่ป้องกันตัวเองจากการเขียนแพตช์ลงในแผนผังการทำงานเช่นกันถ้าด้วยเหตุผลบางอย่างที่คุณต้องใช้คอมไพล์เพื่อปิดคอมมิชชัน - ก่อน - แก้ไข เรียกใช้และทำตามคำแนะนำอย่างละเอียด
รวมสิ่งที่ฉันได้เรียนรู้ในหัวข้อนี้และในตอนนี้เมื่อฉันต้องการที่จะเห็น "สิ่งที่อยู่ในที่ซ่อน" ฉันวิ่งครั้งแรก:
git stash show stash@{0}
ที่จะแสดงไฟล์ที่ถูกแก้ไข จากนั้นเพื่อให้ได้ภาพที่ดีใน diffftool ฉันจะ:
git difftool --dir-diff stash@{0} stash@{0}^
สิ่งนี้จะแสดงความแตกต่างทั้งหมดในครั้งเดียวของที่เก็บที่กำหนดกับผู้ปกครอง
คุณสามารถกำหนดค่าเครื่องมือ diff ใน~/.gitconfig
เช่นด้วยMeld :
...
[diff]
tool = meld
FWIW นี่อาจจะซ้ำซ้อนกับคำตอบอื่น ๆ ทั้งหมดและคล้ายกับคำตอบที่ยอมรับซึ่งเป็นจุด แต่บางทีมันอาจจะช่วยใครบางคนออกมา
git stash show --help
จะให้ทุกสิ่งที่คุณต้องการ รวมถึงข้อมูลการแสดงที่ซ่อน
แสดง [<stash>]
แสดงการเปลี่ยนแปลงที่บันทึกไว้ในที่เก็บเป็นความแตกต่างระหว่างสถานะที่เก็บไว้และพาเรนต์ดั้งเดิม เมื่อไม่ได้รับแสดงล่าสุด โดยค่าเริ่มต้นคำสั่งจะแสดง diffstat แต่จะยอมรับรูปแบบใด ๆ ที่รู้จัก git diff (เช่น git stash show -p stash @ {1} เพื่อดู stash ล่าสุดที่สองในรูปแบบแพทช์) คุณสามารถใช้ตัวแปรการตั้งค่า stash.showStat และ / หรือ stash.showPatch เพื่อเปลี่ยนพฤติกรรมเริ่มต้น
เธอเป็นรายชื่อที่ซ่อน
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
ถ้าคุณใช้ที่ซ่อนอยู่ในสาขาที่ไม่ถูกต้อง ... ดีบางครั้งก็ยากที่จะกู้คืนรหัสของคุณ
ขึ้นอยู่กับสิ่งที่คุณต้องการเปรียบเทียบการสะสมด้วย (แผนผังการทำงานในท้องถิ่น / การกระทำหลัก / การกระทำของหัวหน้า) มีหลายคำสั่งที่ใช้ได้ในระหว่างที่ดีเก่า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 คอมไพล์ปลั๊กอิน