การยกเลิกป๊อปที่เก็บคอมไพล์โดยไม่ตั้งใจ


186

ฉัน stashed git stash popเปลี่ยนแปลงบางท้องถิ่นก่อนที่จะทำผสานซับซ้อนได้ผสานแล้วโง่ลืมที่จะกระทำก่อนที่จะใช้ ป๊อปสร้างปัญหาบางอย่าง (การเรียกใช้วิธีที่ไม่ดีใน codebase ขนาดใหญ่) ซึ่งพิสูจน์ได้ยากที่จะติดตาม ฉันวิ่งgit stash showดังนั้นอย่างน้อยฉันก็รู้ว่าไฟล์ใดถูกเปลี่ยนแปลง ถ้าไม่มีอะไรฉันเดาว่านี่เป็นบทเรียนที่จะต้องทำมากกว่านี้

คำถามของฉัน: เป็นไปได้ไหมที่จะเลิกทำป๊อปสะสมโดยไม่เลิกทำการผสาน?


2
คุณไม่ควรได้รับอนุญาตให้ดำเนินgit stash popการก่อน คุณทำอะไรเพื่อให้บรรลุเป้าหมายนั้น
Chris Jester-Young

ไม่แน่ใจว่าจะซื่อสัตย์ (เมื่อวานนี้) การผสานไม่ได้กระทำด้วยตนเองเนื่องจากมีข้อขัดแย้ง ฉันก็สามารถที่จะเรียกป๊อปสะสมหลังจากนั้น
nren

1
ฉันทำสิ่งนี้เพิ่งรู้ว่าใช้ git รุ่น 1.7.9.msysgit.0 ฉันมีไฟล์ที่ไม่มีการจัดเก็บและป๊อปอัพเพียงรวมทุกอย่างเข้าด้วยกัน
PandaWood

ฉันสามารถเรียกใช้git stash popหลังจากแสดงการเปลี่ยนแปลง (ฉันไม่ได้ทำอะไร) กับ 2.25.0.windows.1 รุ่น git
Artem Hevorhian

หากคุณจัดทำดัชนีการเปลี่ยนแปลงและทำสิ่งเหล่านั้นหายไปในขณะที่คุณวิ่งstash pop/applyก่อนที่จะทำการคอมมิทคุณสามารถยิงgit fsck --lost-foundได้ คำสั่งนี้จะวนซ้ำผ่าน blob dangling (ไฟล์จริงสำหรับผู้ที่ไม่คุ้นเคยกับคำศัพท์ git) ที่ถูก staged แต่ไม่ยอมรับที่ใดก็ได้ (ดังนั้น dangling) และวางไว้ในไดเรกทอรี. git / lost-found / directory ซึ่งคุณสามารถgit showดูได้ หากไฟล์เหล่านี้เป็นไฟล์ที่คุณกำลังมองหา
Artem Hevorhian

คำตอบ:


69

ลองใช้วิธีการกู้คืนที่ถูกทิ้งใน Git? เพื่อค้นหาที่ซ่อนที่คุณโผล่ ฉันคิดว่ามีการผูกมัดสองครั้งสำหรับการซ่อนเนื่องจากมันเก็บรักษาดัชนีและสำเนาการทำงาน (ดังนั้นบ่อยครั้งที่ดัชนีการกระทำจะว่างเปล่า) จากนั้นgit showพวกเขาจะเห็นความแตกต่างและใช้patch -Rเพื่อนำไปใช้พวกเขา


6
ว้าวที่ทำงาน ฉันสามารถค้นหาที่เก็บข้อมูลคอมมิชชันด้วยgit fsck --no-reflog | awk '/dangling commit/ {print $3}'(จากลิงก์) และฉันเพิ่งพบปัญหาด้วยตนเองจากความแตกต่างนั้น ขอบคุณ!
nren

1
fsck ให้ผลลัพธ์เป็นรายการใหญ่ มันน่าเบื่อที่จะคอมไพล์ SHA1 ทุกตัวที่นั่น คุณทำเช่นนี้ได้อย่างไร
meson10

5
@ meson10: น่าเสียดายที่ stashes นั้นถูกเก็บไว้ใน reflog ซึ่งจะเป็นวิธีที่ชัดเจน (ถ้าเป็นสาขาจริง) เพื่อดูประวัติของ pashes ที่หยุดทำงาน ฉันขอแนะนำว่าการขอ downvote + เพื่อขอความช่วยเหลือไม่ใช่กลยุทธ์ที่ดีที่สุด
Ben Jackson

2
มันทำให้ฉันสับสนเล็กน้อยเพื่อทำให้ถูกต้อง นี่คือผลงานของฉัน: git diff -p ${STACH_SHA1}~1 ${STASH_SHA1} | patch -R -p1; ฉันลองด้วยgit showตามที่แนะนำ แต่ผลลัพธ์ไม่ดีสำหรับการแก้ไข ฉันยังต้องให้-p1ตัวเลือกในการแก้ไขเพื่อตัดa/..และb/..องค์ประกอบที่git diffวางไว้ด้านหน้าของไฟล์มิฉะนั้นจะไม่แก้ไขเส้นทางจากที่เก็บราก คำแนะนำ: ใช้ความระมัดระวังและกระทำความยุ่งเหยิงในสาขาแยกก่อนที่จะเล่นกับปะ
basilikode

@BenJackson ในคำตอบของคุณ "เสมอ" หมายถึงทั้งคู่stash popและstash pushจะทริกเกอร์คอมมิชชันที่จะบันทึกการเปลี่ยนแปลงในดัชนีและไดเรกทอรีการทำงานใช่ไหม
Artem Hevorhian

36

จาก git stash --help

Recovering stashes that were cleared/dropped erroneously
   If you mistakenly drop or clear stashes, they cannot be recovered through the normal safety mechanisms. However, you can try the
   following incantation to get a list of stashes that are still in your repository, but not reachable any more:

       git fsck --unreachable |
       grep commit | cut -d\  -f3 |
       xargs git log --merges --no-walk --grep=WIP

สิ่งนี้ช่วยฉันได้ดีกว่าคำตอบที่ยอมรับในสถานการณ์เดียวกัน


13
โปรดทราบว่าโซลูชันจำนวนมากที่เกี่ยวข้องกับการค้นหา "WIP" นั้นขึ้นอยู่กับข้อความที่เก็บไว้เป็นค่าเริ่มต้น หากคุณให้ข้อความที่ซ่อนอยู่ชัดเจนพวกเขาอาจไม่มี WIP
Ben Jackson

ขอบคุณ ฉันเพิ่มตัวเลือก - ออนไลน์ไปยังคำสั่งบันทึกเพื่อปรับปรุงความสามารถในการอ่าน
basslo

สิ่งนี้จะช่วยให้คุณค้นพบ SHA ของที่เก็บข้อมูลคอมมิชชัน แต่ถ้ารวมเข้ากับความคิดเห็น @basilikode จากคำตอบที่ยอมรับ (git diff SHA ~ 1 SHA | patch -R) ก็ใช้งานได้ดี ฉันแนะนำให้ใช้เส้นทาง - แห้งก่อนเพื่อตรวจสอบ
Jarek C

3

หากการผสานของคุณไม่ซับซ้อนเกินไปตัวเลือกอื่นจะ:

  1. ย้ายการเปลี่ยนแปลงทั้งหมดรวมถึงการเปลี่ยนแปลงผสานกลับไปยังที่เก็บข้อมูลโดยใช้ "git stash"
  2. เรียกใช้การผสานอีกครั้งและยืนยันการเปลี่ยนแปลงของคุณ (โดยไม่มีการเปลี่ยนแปลงจากที่เก็บของที่หายไป)
  3. เรียกใช้ "git stash pop" ซึ่งควรละเว้นการเปลี่ยนแปลงทั้งหมดจากการผสานก่อนหน้าของคุณเนื่องจากไฟล์เหมือนกันในตอนนี้

หลังจากนั้นคุณจะเหลือเพียงการเปลี่ยนแปลงจากที่เก็บที่คุณทิ้งไว้เร็วเกินไป

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