ใช้ความแตกต่างระหว่าง git stash pop และ git stash


1024

ฉันใช้git stash popมาระยะหนึ่งแล้ว ฉันเพิ่งค้นพบเกี่ยวกับgit stash applyคำสั่ง git stash popเมื่อฉันพยายามมันออกก็ลำบากในการทำงานเช่นเดียวกับ

ความแตกต่างระหว่างgit stash popและgit stash applyคืออะไร?

คำตอบ:


1627

git stash pop โยนที่ซ่อน (สูงสุดโดยค่าเริ่มต้น) หลังจากนำไปใช้ในขณะที่git stash apply ทิ้งไว้ในรายการที่ซ่อนไว้เพื่อนำมาใช้ซ้ำในภายหลัง (หรือคุณสามารถเป็นไปgit stash dropได้)

นี้เกิดขึ้นเว้นแต่มีความขัดแย้งหลังซึ่งในกรณีนี้มันจะไม่ลบซ่อนออกมันจะทำตัวเหมือนgit stash popgit stash apply

อีกวิธีหนึ่งที่จะดูที่มันเป็นgit stash popgit stash apply && git stash drop


117
ตามที่ @ briankip คำตอบบันทึกไว้ด้านล่างหากมีความขัดแย้งเมื่อมีการสะสมที่ป๊อปป๊อปจะไม่ลบที่เก็บ (และจะทำตัวเหมือนนำไปใช้)
Kashif

ดูเหมือนว่าแม้ว่าการเปลี่ยนแปลงแบบไม่มีสาขาในสาขาของคุณจะเหมือนกับgit stash popผลลัพธ์ของคุณจะยังคงได้รับข้อผิดพลาดความขัดแย้ง
DimP

79

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

ตัวอย่างเช่นสมมติว่าการเปลี่ยนแปลงที่คุณเก็บไว้ขัดแย้งกับการเปลี่ยนแปลงอื่น ๆ ที่คุณทำตั้งแต่คุณสร้างที่เก็บ ทั้งป๊อปและการนำไปใช้จะเป็นประโยชน์ในการรวมโหมดการแก้ไขข้อขัดแย้งเข้าด้วยกันซึ่งจะช่วยให้คุณแก้ไขข้อขัดแย้งดังกล่าวได้เป็นอย่างดี ... และจะไม่กำจัดที่ซ่อนแม้ว่าคุณอาจคาดหวังว่าป๊อปก็เช่นกัน เนื่องจากผู้คนจำนวนมากคาดหวังว่าการหยุดชะงักจะเป็นเพียงสแต็กง่ายๆนี่มักจะทำให้พวกเขาโผล่ที่เก็บซ่อนตัวเดียวกันโดยบังเอิญเพราะพวกเขาคิดว่ามันหายไป

ลิงก์: http://codingkilledthecat.wordpress.com/2012/04/27/git-stash-pop-considered-harmful/


6
ความเป็นจริงของการซ่อนเร้นเมื่อป๊อปล้มเหลวจริงๆแล้วไม่ใช่ข้อเสียแม้ว่ามันอาจดูเหมือนเป็นอย่างนั้นในตอนแรก
Amalgovinus

65

git stash popใช้องค์ประกอบที่ซ่อนอยู่ด้านบนและลบออกจากสแต็ก git stash applyทำเช่นเดียวกัน แต่ทิ้งไว้ในสแต็กสะสม


42

การเห็นว่ามันทำงานจริงอาจช่วยให้คุณเข้าใจความแตกต่างได้ดีขึ้น

สมมติว่าเรากำลังทำงานในmasterสาขาและมีไฟล์hello.txtที่มีสตริง "Hello"

ลองแก้ไขไฟล์และเพิ่มสตริง "world" ลงไป ตอนนี้คุณต้องการย้ายไปที่สาขาอื่นเพื่อแก้ไขข้อบกพร่องเล็ก ๆ น้อย ๆ ที่คุณเพิ่งค้นพบดังนั้นคุณจำเป็นต้องstashเปลี่ยนแปลง:

git stash

คุณย้ายไปที่สาขาอื่นแก้ไขข้อผิดพลาดและตอนนี้คุณก็พร้อมที่จะทำงานmasterสาขาของคุณต่อไปดังนั้นคุณจึงpopทำการเปลี่ยนแปลง:

git stash pop

ตอนนี้ถ้าคุณลองทบทวนเนื้อหาที่ซ่อนคุณจะได้รับ:

$ git stash show -p
No stash found.

อย่างไรก็ตามหากคุณใช้git stash applyแทนคุณจะได้เนื้อหาที่เก็บไว้ แต่คุณจะต้อง:

$ git stash show -p
diff --git a/hello.txt b/hello.txt
index e965047..802992c 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1 +1 @@
-Hello
+Hello world

ดังนั้นpopเป็นเหมือนป๊อปสแต็คของ - มันจริงเอาองค์ประกอบหนึ่งครั้งก็โผล่ในขณะที่applyมีมากขึ้นเช่นแอบมอง


5

ในgit การสะสมเป็นพื้นที่จัดเก็บไฟล์ที่เปลี่ยนแปลงในปัจจุบันสามารถเคลื่อนย้ายได้

stashพื้นที่มีประโยชน์เมื่อคุณต้องการดึงการเปลี่ยนแปลงบางอย่างจากที่gitเก็บและตรวจพบการเปลี่ยนแปลงบางอย่างในไฟล์ร่วมบางอย่างที่มีอยู่ในgitrepo

git stash apply //apply the changes without removing stored files from stash area.

git stash pop  // apply the changes as well as remove stored files from stash area.

หมายเหตุ: - git applyใช้การเปลี่ยนแปลงจากพื้นที่เก็บข้อมูลในขณะที่git popใช้เท่านั้นรวมถึงนำการเปลี่ยนแปลงออกจากstashพื้นที่


1

Git Stash Pop vs applyWorking

หากคุณต้องการใช้การเปลี่ยนแปลงที่เก็บไว้ด้านบนกับการเปลี่ยนแปลงที่ไม่มีการจัดฉากในปัจจุบันและลบที่เก็บนั้นเช่นกันคุณควรดำเนินการgit stash popต่อ

# apply the top stashed changes and delete it from git stash area.
git stash pop  

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

หมายเหตุ: คุณสามารถเชื่อมโยงกรณีนี้กับStackคลาสpop()และpeek()เมธอดโดยที่ pop เปลี่ยนด้านบนโดยการลดลง (top = top-1) แต่peek()สามารถรับองค์ประกอบบนสุดได้เท่านั้น

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