วิธีการคลายไฟล์เฉพาะบางไฟล์?


386

ฉันแก้ไขการเปลี่ยนแปลงของฉัน ตอนนี้ฉันต้องการยกเลิกการติดตั้งเฉพาะบางไฟล์จากที่เก็บ ฉันจะทำสิ่งนี้ได้อย่างไร


4
ฉันคิดว่าคุณต้องใช้ที่เก็บทั้งหมด แต่คุณสามารถเลือกซ่อนได้อีกครั้ง
Richard

4
@AbdouTahiri เกิดอะไรขึ้นกับที่เก็บสะสม?
alex

32
@AbdouTahiri Uhhhh .. git stash เป็นคุณสมบัติที่ถูกต้องและมีประโยชน์มาก ฉันใช้มันทุกวัน บอกว่าเพื่อนร่วมงานต้องการให้ฉันทบทวนบางสิ่ง แต่ฉันอยู่ในช่วงกลางของการเปลี่ยนแปลงที่ซับซ้อน ฉันจะไม่ส่งกองรหัสที่เสียไปเพื่อที่จะเปลี่ยนสาขาได้ ฉันจะซ่อน, สลับสาขา, วิจารณ์, สลับกลับ, ปลดออก คุณสนใจที่จะอธิบายอย่างละเอียดว่าใครหรือเพราะเหตุใดจึงไม่ควรแนะนำคอมไพล์ git stash? เพียงเพราะประวัติสะสมของคอมไพล์ของคุณเต็มไปด้วยโคลนและอ่านยากไม่ได้หมายความว่าทุกคนจะเป็น ชุด stash git ยุ่งเป็นเพียงขั้นตอนการทำงานที่ไม่ดีไม่ใช่ข้อบกพร่องของ Git
dudewad

6
@alex ไม่มีอะไร ไม่มีอะไรผิดปกติกับ git stash ใช้ต่อไป
dudewad

คำตอบ:


461

ตามที่กล่าวไว้ด้านล่างและรายละเอียดใน " ฉันจะแยกไฟล์เดียว (หรือเปลี่ยนแปลงไฟล์) จาก git stash ได้อย่างไร " คุณสามารถใช้การใช้งานgit checkoutหรือgit showเพื่อกู้คืนไฟล์ที่ระบุ

git checkout stash@{0} -- <filename>

ที่ไม่ทับ filename : ให้แน่ใจว่าคุณไม่ได้มีการปรับเปลี่ยนในท้องถิ่นหรือคุณอาจต้องการที่จะรวมไฟล์ stashed แทน

(ตามความเห็นโดยไจเมตรสำหรับเปลือกบางอย่างเช่น tcsh ที่คุณต้องการที่จะหลบหนีตัวอักษรพิเศษไวยากรณ์จะเป็น: git checkout 'stash@{0}' -- <filename>)

หรือบันทึกไว้ภายใต้ชื่อไฟล์อื่น:

git show stash@{0}:<full filename>  >  <newfile>

(โปรดทราบว่านี่<full filename>คือชื่อพา ธ เต็มของไฟล์ที่สัมพันธ์กับไดเรกทอรีบนสุดของโครงการ (คิดว่า: สัมพันธ์กับstash@{0})

yucerแนะนำในความคิดเห็น :

หากคุณต้องการเลือกด้วยตนเองการเปลี่ยนแปลงที่คุณต้องการใช้จากไฟล์นั้น:

git difftool stash@{0}..HEAD -- <filename>

วิเวกเพิ่มในความคิดเห็น :

ดูเหมือนว่า " git checkout stash@{0} -- <filename>" จะเรียกคืนเวอร์ชันของไฟล์ตามเวลาที่มีการดำเนินการเก็บข้อมูลซึ่งจะไม่ใช้ (เพียง) การเปลี่ยนแปลงที่เก็บไว้สำหรับไฟล์นั้น
เมื่อต้องการทำหลัง:

git diff stash@{0}^1 stash@{0} -- <filename> | git apply

(ตามที่แสดงความคิดเห็นโดยpeterflynnคุณอาจต้อง| git apply -p1ในบางกรณีลบหนึ่ง ( p1) นำเครื่องหมายทับจากเส้นทาง diff แบบดั้งเดิม)


ตามที่แสดงความคิดเห็น: "unstash" (git stash pop ) จากนั้น:

  • เพิ่มสิ่งที่คุณต้องการเก็บไว้ในดัชนี ( git add)
  • สะสมที่เหลือ: git stash --keep-index

จุดสุดท้ายคือสิ่งที่ช่วยให้คุณเก็บไฟล์ไว้ในขณะที่อื่น ๆ
มันแสดงให้เห็นใน " วิธีการซ่อนเพียงหนึ่งไฟล์จากหลายไฟล์ที่มีการเปลี่ยนแปลง "


5
วิธีนี้ใช้ไม่ได้หากคุณไม่สามารถทำได้git stash popเนื่องจากไฟล์ขัดแย้งกัน คำตอบของ Balamurugan A ได้ทำเพื่อฉันในกรณีนี้
Andrey

1
หากคุณต้องการเลือกด้วยตนเองซึ่งการเปลี่ยนแปลงที่คุณต้องการใช้จากไฟล์นั้นคุณสามารถใช้ git difftool stash @ {0} .. HEAD - <filename>
yucer

5
ดูเหมือนว่า "git checkout stash @ {0} - <filename>" กู้คืนเวอร์ชันของไฟล์ ณ เวลาที่ stash ถูกดำเนินการ - มันไม่ได้ใช้ (แค่) การเปลี่ยนแปลงที่ stashed สำหรับไฟล์นั้น ในการทำหลัง: "git diff stash @ {0} ^ 1 stash @ {0} - <filename> | git ใช้"
Vivek

1
@JaimeM ขอบคุณ. ฉันได้รวมความคิดเห็นของคุณไว้ในคำตอบเพื่อให้มองเห็นได้ชัดเจนขึ้น
VonC

1
สมมติว่านั่นunstashหมายความว่าpopในกรณีส่วนใหญ่ดูเหมือนว่าฉันอาจจะในกรณีส่วนใหญ่นี้เพียงบางส่วนตอบคำถาม จากนั้นคุณจะลบชิ้นส่วนที่เลือกใช้ออกจากที่เก็บเพื่อหลีกเลี่ยงความขัดแย้งและ / หรือความสับสนในภายหลังเมื่อ popping การเปลี่ยนแปลงที่เหลืออยู่ได้อย่างไร
DylanYoung

115
git checkout stash@{N} <File(s)/Folder(s) path> 

เช่น. ในการกู้คืนเฉพาะไฟล์. / test.c และโฟลเดอร์. / รวมจากไฟล์ที่ถูกซ่อนครั้งล่าสุด

git checkout stash@{0} ./test.c ./include

12
นี่คือคำตอบที่ถูกต้อง! คำสั่งบรรทัดเดียวเพื่อใช้เฉพาะการเปลี่ยนแปลงที่ถูกจัดเก็บจากไฟล์เฉพาะทำงานเหมือนเครื่องราง!
4

1
หากต้องการใช้ (เพียง) การเปลี่ยนแปลงที่เก็บไว้สำหรับไฟล์: "git diff stash @ {N} ^ 1 stash @ {N} - <filename> | git ใช้"
Vivek

มันก็ใช้ได้กับฉันเช่นกัน เพียงแค่ทำการเลือกไฟล์ที่ต้องการใช้จากที่เก็บข้อมูลและคุณก็ทำเสร็จแล้ว ฉันติดอยู่ในนี้ฉันได้ใช้-aธงในขณะที่สร้างที่เก็บของ
Rajeev Ranjan

1
@ 4 ระดับฉันคิดว่า "ใช้การเปลี่ยนแปลงที่ถูกทับ" ไม่เกิดอะไรขึ้นใช่มั้ย ฉันคิดว่า "เขียนทับสิ่งที่คุณมีกับสำเนาจากที่ซ่อน" คือสิ่งที่เกิดขึ้น
msouth

35

ฉันคิดว่าคำตอบของ VonC อาจเป็นสิ่งที่คุณต้องการ แต่นี่เป็นวิธีในการเลือก "git Apply" ที่เลือกได้:

git show stash@{0}:MyFile.txt > MyFile.txt

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

สิ่งนี้ใช้ได้กับฉันเนื่องจากฉันต้องการคัดลอกไฟล์ที่มีอยู่ในที่เก็บเท่านั้นและไม่สนใจcheckoutสิ่งใดเลย
Tom Russell

1
สำหรับ Windows PowerShell: git show stash@`{0`}:Path/To/MyFile.txt |sc Path/To/MyFile.txt - backticks จำเป็นสำหรับ PS ที่จะไม่ตีความการจัดฟันเป็นพิเศษและscเป็นสิ่งที่จำเป็นเพราะ>ผู้ให้บริการเริ่มต้นของ PS เป็นUTF-16 (จริง ๆ แล้วคือ UCS-2)ซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ @Balamurugan คำตอบของ A ไม่ได้ประสบปัญหาเหล่านี้
Ian Kemp

19

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

git stash list

stash@{0}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{1}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{2}: WIP on master: 7e450c81 Merge branch 'Offlineseite'

จากนั้นแสดงไฟล์ที่อยู่ในที่เก็บ (ให้เลือกที่เก็บ 1):

git stash show 1 --name-only

//Hint: you can also write
//git stash show stash@{1} --name-only

 ajax/product.php
 ajax/productPrice.php
 errors/Company/js/offlineMain.phtml
 errors/Company/mage.php
 errors/Company/page.phtml
 js/konfigurator/konfigurator.js

จากนั้นใช้ไฟล์ที่คุณต้องการ:

git checkout stash@{1} -- <filename>

หรือทั้งโฟลเดอร์:

git checkout stash@{1} /errors

มันยังใช้งานได้โดยไม่--แนะนำให้ใช้ ดูนี้โพสต์

นอกจากนี้ยังเป็นเรื่องปกติที่จะรับรู้เครื่องหมายยัติภังค์คู่เป็นสัญญาณที่จะหยุดการตีความตัวเลือกและปฏิบัติต่อข้อโต้แย้งดังต่อไปนี้อย่างแท้จริง


1
ชัดเจนยิ่งขึ้นด้วยการแก้ไขนี้ +1
VonC

1
ฉันลองหลายวิธีและวิธีนี้เป็นสิ่งที่ฉันต้องการ ฉันประสบปัญหาที่ทำให้git stash popเกิดข้อผิดพลาดสำหรับไฟล์ที่ไม่ได้ติดตาม ขอบคุณ.
Ramin Firooz

10

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


2
ในการชี้แจงส่วนที่ขัดแย้งของโพสต์นี้หากคุณgit stash popและมีข้อขัดแย้งคุณจะต้องแก้ไขด้วยตนเองและจะไม่ลบที่เก็บ
Thomas McCabe

6

อีกวิธีหนึ่ง:

git diff stash@{N}^! -- path/to/file1 path/to/file2  | git apply -R

2
นี่เป็นคำตอบที่ถูกต้องเพียงข้อเดียวของ IMO การใช้checkoutหรือshowจะเขียนทับไฟล์แทนการใช้การเปลี่ยนแปลง "อีกทางหนึ่ง" เป็นการพูดที่น้อยไป
cambunctious

1
ฉันไม่ได้รับpath/to/file2ตามที่คุณต้องการแตกต่างจากไฟล์เดียวกันในพื้นที่ทำงานของคุณ ออกจากเส้นทางที่สองทำงานได้ดีสำหรับฉัน - และฉันได้รับข้อความแสดงข้อผิดพลาดโดยใช้-Rตัวเลือก ("ใช้ตัวแก้ไขในทางตรงกันข้าม" พยายามที่จะแก้ไขเวอร์ชันที่ถูกจัดเก็บ?!) git diff stash@{N}^! -- path/to/file | git apply -ดังนั้นการทำงานลักษณะเหมือนรุ่นของฉัน
ThomasH

"แพตช์ล้มเหลว"? ลองผสาน 3 ทาง ...| git apply -3 -
John Mee

6

สำหรับผู้ใช้ Windows: การจัดฟันแบบหยิกมีความหมายพิเศษใน PowerShell คุณสามารถล้อมรอบด้วยคำพูดเดียวหรือหลบหนีด้วย backtick ตัวอย่างเช่น:

git checkout 'stash@{0}' YourFile

หากไม่มีคุณอาจได้รับข้อผิดพลาด:

Unknown switch 'e'


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