ฉันพยายามใช้การเปลี่ยนแปลงที่เก็บไว้ก่อนหน้านี้git stash pop
และได้รับข้อความ:
Cannot apply to a dirty working tree, please stage your changes
มีข้อเสนอแนะเกี่ยวกับวิธีจัดการกับสิ่งนั้นหรือไม่?
ฉันพยายามใช้การเปลี่ยนแปลงที่เก็บไว้ก่อนหน้านี้git stash pop
และได้รับข้อความ:
Cannot apply to a dirty working tree, please stage your changes
มีข้อเสนอแนะเกี่ยวกับวิธีจัดการกับสิ่งนั้นหรือไม่?
คำตอบ:
เมื่อฉันต้องใช้การเปลี่ยนแปลงที่ซ่อนอยู่กับสำเนาที่ใช้งานได้สกปรกเช่นเปิดชุดการเปลี่ยนแปลงมากกว่าหนึ่งรายการจากที่เก็บฉันใช้สิ่งต่อไปนี้:
$ git stash show -p | git apply -3 && git stash drop
โดยทั่วไปแล้ว
ฉันสงสัยว่าทำไมไม่มี-f
ตัวเลือก (บังคับ) git stash pop
ที่ควรมีพฤติกรรมเหมือนซับในข้างต้น
ในระหว่างนี้คุณอาจต้องการเพิ่ม one-liner นี้เป็น git alias:
$ git config --global --replace-all alias.unstash \
'!git stash show -p | git apply -3 && git stash drop'
$ git unstash
ขอบคุณ @SamHasler ที่ชี้ให้เห็น-3
พารามิเตอร์ที่ช่วยให้แก้ไขข้อขัดแย้งได้โดยตรงผ่านการผสาน 3 ทาง
git stash apply
จะไม่ใช้การเปลี่ยนแปลงที่ซ่อนไว้หากคุณมีสำเนาที่ใช้งานได้สกปรก ดังนั้นคุณจะเห็นgit stash show -p | git apply
ว่ามีการบังคับใช้การเก็บซ่อนบางประเภท
ฉันทำในลักษณะนี้:
git add -A
git stash apply
แล้ว (ไม่บังคับ):
git reset
git add -u
ซึ่งก็เหมือนกับ-A
ว่ามันไม่ได้เพิ่มไฟล์ที่ไม่ได้ติดตาม
คุณสามารถทำได้โดยไม่ต้องซ่อนการเปลี่ยนแปลงปัจจุบันของคุณโดยส่งออกที่เก็บที่คุณต้องการเป็นไฟล์แพตช์และนำไปใช้ด้วยตนเอง
ตัวอย่างเช่นสมมติว่าคุณต้องการใช้ stash @ {0} กับต้นไม้สกปรก:
ส่งออกที่เก็บ @ {0} เป็นแพตช์:
git stash show -p stash @ {0}> Stash0.patch
ใช้การเปลี่ยนแปลงด้วยตนเอง:
git ใช้ Stash0.patch
หากขั้นตอนที่สองล้มเหลวคุณจะต้องแก้ไขไฟล์ Stash0.patch เพื่อแก้ไขข้อผิดพลาดจากนั้นลองใช้ git อีกครั้ง
ทำความสะอาดไดเร็กทอรีการทำงานของคุณด้วยการรีเซ็ตคอมไพล์ทำการเปลี่ยนแปลงหรือหากคุณต้องการซ่อนการเปลี่ยนแปลงปัจจุบันให้ลอง:
$ git stash save "คำอธิบายการเปลี่ยนแปลงปัจจุบัน" $ git stash pop stash @ {1}
การดำเนินการนี้จะซ่อนการเปลี่ยนแปลงปัจจุบันจากนั้นเปิดที่ซ่อนที่สองจากกองซ้อน
โซลูชันของ Mathias นั้นใกล้เคียงที่สุดกับ git stash pop --force (และจริงๆแล้ว c'mon Git devs มารับตัวเลือกนี้กันเถอะ!)
อย่างไรก็ตามหากคุณต้องการทำสิ่งเดียวกันโดยใช้คำสั่ง git เท่านั้นคุณสามารถ:
กล่าวอีกนัยหนึ่งคือทำการคอมมิต (ซึ่งเราจะไม่ผลักดัน) ของการเปลี่ยนแปลงปัจจุบันของคุณ เมื่อพื้นที่ทำงานของคุณสะอาดแล้วให้เปิดที่เก็บของคุณ ตอนนี้ยอมรับการเปลี่ยนแปลงที่ซ่อนเป็นการแก้ไขการกระทำก่อนหน้าของคุณ เมื่อทำเสร็จแล้วตอนนี้คุณมีการเปลี่ยนแปลงทั้งสองชุดรวมกันในคอมมิตเดียว ("Fixme"); เพียงแค่ตั้งค่าใหม่ (- ไม่ต้องใช้ - เพื่อให้ไม่มีอะไรสูญหายจริง ๆ ) การชำระเงินของคุณเป็น "หนึ่งก่อนที่จะกระทำ" และตอนนี้คุณมีการเปลี่ยนแปลงทั้งสองชุดโดยไม่มีข้อผูกมัดใด ๆ
** แก้ไข * *
ฉันเพิ่งรู้ว่ามันง่ายกว่านั้นจริงๆ คุณสามารถข้ามขั้นตอนที่ 3 ได้ทั้งหมดดังนั้น ...
(ยอมรับการเปลี่ยนแปลงปัจจุบันปิดการเปลี่ยนแปลงที่เก็บไว้รีเซ็ตการกระทำนั้นก่อนเพื่อรับการเปลี่ยนแปลงทั้งสองชุดรวมกันในสถานะที่ไม่ได้กำหนดไว้)
คำตอบเหล่านี้ไม่ได้ผลจริงหากคุณพบว่าตัวเองอยู่ในสถานการณ์นี้เหมือนที่ฉันทำในวันนี้ ไม่ว่าgit reset --hard
ฉันจะทำกี่ครั้งแต่ก็ทำให้ฉันไม่มีที่ไหนเลย คำตอบของฉัน (ไม่เป็นทางการ แต่อย่างใดคือ):
git reflog --all
ฉันยังพบว่าโซลูชันของ Mathias Leppichทำงานได้ดีดังนั้นฉันจึงเพิ่มนามแฝงสำหรับมันใน. gitconfig ส่วนกลางของฉัน
[alias]
apply-stash-to-dirty-working-tree = !git stash show -p | git apply && git stash drop
ตอนนี้ฉันสามารถพิมพ์ได้
git apply-stash-to-dirty-working-tree
ซึ่งใช้งานได้ดีสำหรับฉัน
(ระยะทางของคุณอาจแตกต่างกันไปตามชื่อนามแฝงแบบยาวนี้ แต่ฉันชอบความฟุ่มเฟื่อยเมื่อมันมาพร้อมกับการทุบเสร็จ)
คุณสามารถนำที่ซ่อนไปใช้กับต้นไม้ที่ "สกปรก" ได้โดยทำการgit add
เปลี่ยนแปลงใด ๆ ที่คุณได้ทำไว้ดังนั้นจึงเป็นการทำความสะอาดต้นไม้ จากนั้นคุณสามารถgit stash pop
และใช้การเปลี่ยนแปลงที่ซ่อนอยู่ได้ไม่มีปัญหา
คุณมีไฟล์ที่ถูกแก้ไข แต่ไม่ได้คอมมิต ทั้ง:
git reset --hard HEAD (to bring everything back to HEAD)
หรือหากคุณต้องการบันทึกการเปลี่ยนแปลงของคุณ:
git checkout -b new_branch
git add ...
git commit
git checkout -b old_branch
git stash pop
ฉันมีปัญหาเดียวกัน แต่คอมไพล์ไม่มีไฟล์ที่เปลี่ยนแปลง ปรากฎว่าฉันมีไฟล์ index.lock ที่วางอยู่รอบ ๆ การลบจะช่วยแก้ปัญหาได้
ฉันไม่สามารถทำงานส่วนใหญ่ได้ ด้วยเหตุผลบางอย่างมันมักจะคิดว่าฉันมีการเปลี่ยนแปลงในไฟล์ ฉันใช้ที่ซ่อนไม่ได้แพตช์ใช้ไม่ได้checkout
และreset --hard
ล้มเหลว อะไรในที่สุดได้รับการทำงานประหยัดซ่อนเป็นสาขาที่มีgit stash branch tempbranchname
แล้วทำผสานสาขาปกติและgit checkout master
git merge tempbranchname
จากhttp://git-scm.com/book/en/Git-Tools-Stashing :
หากคุณต้องการวิธีที่ง่ายกว่าในการทดสอบการเปลี่ยนแปลงที่ซ่อนไว้อีกครั้งคุณสามารถเรียกใช้ git stash branch ซึ่งจะสร้างสาขาใหม่ให้คุณตรวจสอบการคอมมิตที่คุณทำเมื่อคุณเก็บงานของคุณนำงานของคุณไปใช้ใหม่ที่นั่นจากนั้นจึงปล่อย ซ่อนหากใช้สำเร็จ
git stash show -p | git apply
แตกต่างกว่าgit stash apply
?