การเปลี่ยนแปลงที่เก็บสะสม git นำไปใช้กับสาขาใหม่ได้หรือไม่


349

ฉันกำลังทำงานในสาขาหลักทำการเปลี่ยนแปลงบางอย่างแล้ว stashed พวกเขา ตอนนี้เจ้านายของฉันอยู่ที่ HEAD

แต่ตอนนี้ฉันต้องการเรียกการเปลี่ยนแปลงเหล่านี้ แต่กลับไปยังสาขาใหม่ที่แยกสาขาจากเวอร์ชัน HEAD ของสาขาหลัก

ฉันจะทำสิ่งนี้ได้อย่างไร


3
ฉันคิดว่าคุณกำลังมองหาสิ่งนี้? stackoverflow.com/questions/556923/…
zx1986

คำตอบ:


506

ขั้นตอนมาตรฐานไม่ทำงานหรือไม่

  • ทำการเปลี่ยนแปลง
  • git stash save
  • git branch xxx HEAD
  • git checkout xxx
  • git stash pop

สั้น:

  • ทำการเปลี่ยนแปลง
  • git stash
  • git checkout -b xxx
  • git stash pop

8
@sfletche หากคุณต้องการตั้งชื่อที่ซ่อนคุณต้องทำการบันทึก git stash ให้บันทึก <name> มิฉะนั้นอย่างที่คุณพูดมันก็เหมือนกับ git stash
SgtPooki

5
หลังจากใช้วิธีนี้ดูเหมือนว่าถ้าคุณกลับไปที่สาขาก่อนหน้าการเปลี่ยนแปลงที่เก็บไว้ได้กลับคืน เป็นไปได้หรือไม่ที่จะมีการเปลี่ยนแปลงที่เกิดขึ้นกับสาขาใหม่เท่านั้น?
โทมัส Higginbotham

เพียงส่งการเปลี่ยนแปลงของคุณไปยังสาขาใหม่
ChrisR

2
@ThomasHigginbotham ไม่มีไดเรกทอรีทำงานเป็นเรื่องปกติระหว่างสาขาและถูกคัดลอกจากที่หนึ่งไปยังอีกที่เมื่อคุณผ่านจากสาขาหนึ่งไปยังอีก สำหรับ "การบรรลุผล" สิ่งที่คุณต้องการฉันมักจะทำการหยุดพักที่แตกต่างกันเพิ่มคำอธิบายที่เป็นประโยชน์กับgit stash save "description"คำสั่งที่กล่าวถึงก่อนหน้านี้; แล้วฉันgit clearสาขา (สำหรับ trashing ไดเรกทอรีทำงานจริง) และจากนั้นgit stash apply stash@{my_desired_stash}ในสาขาที่ต้องการ (หลังจากเปลี่ยนไปที่ด้วยgit checkout <branch>ชัด) ฉันรู้ว่ามันไม่ได้เป็นวิธีการแก้ปัญหาจริง แต่ที่ดีที่สุดคือคุณสามารถทำกับคอมไพล์
Kamafeather

ฉันยังสรุปเรื่องนี้ด้วยgit stash dropเมื่อฉันตกลง
oddmeter

221

เนื่องจากคุณได้ทำการเปลี่ยนแปลงแล้วสิ่งที่คุณต้องมีคือสายการบินเดียว:

  • git stash branch <branchname> [<stash>]

จากเอกสาร ( https://www.kernel.org/pub/software/scm/git/docs/git-stash.html ):

สร้างและตรวจสอบสาขาใหม่ที่ชื่อ < branchname > เริ่มต้นจากการคอมมิชชันที่ < stash > ถูกสร้างขึ้นในตอนแรกใช้การเปลี่ยนแปลงที่บันทึกไว้ใน < stash > กับแผนผังการทำงานและดัชนีใหม่ หากประสบความสำเร็จและ < stash > เป็นการอ้างอิงของ form stash @ {< revision >} มันจะดรอป < stash > เมื่อไม่ได้รับ < stash > ให้ใช้ตัวล่าสุด

สิ่งนี้มีประโยชน์หากสาขาที่คุณใช้บันทึก git stash มีการเปลี่ยนแปลงมากพอที่การเก็บ git นั้นล้มเหลวเนื่องจากความขัดแย้ง เนื่องจากที่เก็บถูกนำไปใช้บนการคอมมิทที่เป็น HEAD ในขณะที่ git stash ถูกรันมันจะกู้คืนสถานะ stashed ดั้งเดิมโดยไม่มีข้อขัดแย้ง


3
สำหรับการหยุดครั้งเดียวนี่คือวิธีที่จะไป ไม่ต้องการการอ้างอิงชื่อที่เก็บเนื่องจาก Git จะใช้ที่เก็บล่าสุดสลับไปที่สาขาใหม่และใช้ที่เก็บในคำสั่ง 1
sinisterOrange

@RodneyGolpe ดูเหมือนว่าจะใช้ stash นี้กับ 'master' ด้วย? สิ่งที่ฉันต้องการทำคือจาก 'master', git stash, แล้วฉันจะคาดหวังว่า 'git stash branch [branchname] เพื่อใช้ stash กับสาขาใหม่โดยไม่ต้องแก้ไขอะไร?
David Doria

2
@DavidDoria คุณต้องยอมรับการเปลี่ยนแปลงสาขาใหม่ของคุณก่อนที่จะกลับไปเป็นอาจารย์
ร็อดนีย์ Golpe

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

1

หากคุณมีการเปลี่ยนแปลงบางอย่างในเวิร์กสเปซของคุณและคุณต้องการซ่อนไว้ในสาขาใหม่ให้ใช้คำสั่งนี้:

git stash branch branchName

มันจะทำให้:

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