git switch branch โดยไม่ละทิ้งการเปลี่ยนแปลงในตัวเครื่อง


181

เอาล่ะสมมติว่าวันหนึ่งเราเกิดการปรับเปลี่ยนมากมายและเมื่อเราไปส่งพวกเขาเราสังเกตว่าเรากำลังทำงานผิดสาขา

วิธีการที่เราสามารถบังคับให้คอมไพล์สวิทช์สาขาโดยไม่ทิ้งการเปลี่ยนแปลงในท้องถิ่น

ฉันอาจจะไปเกี่ยวกับเรื่องนี้ในทางที่ไร้เดียงสาในขณะที่ฉันรอการตอบกลับ แต่ฉันอยากจะรู้ว่ามีขั้นตอนที่ถูกต้องเพราะฉันโกหกถ้าฉันบอกว่าสิ่งนี้ไม่เคยเกิดขึ้นกับฉันมาก่อน ...

  • สำรองข้อมูลเปลี่ยน repo
  • git reset --hard
  • git checkout right-branch
  • กู้คืนการเปลี่ยนแปลง
  • git commit -m "changes"

คำตอบ:


342

มีหลายวิธีขึ้นอยู่กับว่าคุณอยู่ไกลแค่ไหนและสาขาไหนที่คุณต้องการ

ลองผิดพลาดคลาสสิค:

$ git checkout master
... pause for coffee, etc ...
... return, edit a bunch of stuff, then: oops, wanted to be on develop

ดังนั้นตอนนี้คุณต้องการการเปลี่ยนแปลงเหล่านี้ซึ่งคุณยังไม่ได้มุ่งมั่นที่ยังไม่ได้ที่จะอยู่กับmasterdevelop

  1. หากคุณไม่ได้มีdevelopๆ วิธีการที่ไม่เป็นสาระ:

    $ git checkout -b develop
    

    สิ่งนี้จะสร้างdevelopสาขาใหม่เริ่มต้นจากทุกที่ที่คุณอยู่ในขณะนี้ ตอนนี้คุณสามารถกระทำและสิ่งใหม่ ๆ developอยู่บนทั้งหมด

  2. คุณจะมี developดูว่า Git จะให้คุณสลับโดยไม่ทำอะไรเลยหรือไม่:

    $ git checkout develop
    

    สิ่งนี้จะประสบความสำเร็จหรือบ่น ถ้าสำเร็จก็เยี่ยมมาก! เพียงแค่กระทำ หากไม่ใช่ ( error: Your local changes to the following files would be overwritten ...) คุณยังมีตัวเลือกมากมาย

    อาจเป็นวิธีที่ง่ายที่สุดgit stash(เช่นเดียวกับคำตอบอื่น ๆ ทั้งหมดที่เอาชนะฉันได้เมื่อคลิกpost) เรียกใช้git stash saveหรือgit stash push, 1หรือเพียงแค่ธรรมดาgit stashซึ่งเป็นสั้นสำหรับsave/ push:

    $ git stash
    

    สิ่งนี้คอมมิทโค้ดของคุณ (ใช่มันทำให้คอมมิทบางส่วน) โดยใช้วิธีที่ไม่ใช่สาขา -y การคอมมิชชันที่ทำให้ไม่ใช่ "เปิด" สาขาใด ๆ แต่ตอนนี้ถูกเก็บไว้อย่างปลอดภัยในที่เก็บดังนั้นตอนนี้คุณสามารถสลับสาขาแล้ว "นำไปใช้" ที่เก็บ:

    $ git checkout develop
    Switched to branch 'develop'
    $ git stash apply
    

    หากทุกอย่างเป็นไปด้วยดีและคุณชอบผลลัพธ์คุณก็ควรจะgit stash dropซ่อนมันไว้ สิ่งนี้จะลบการอ้างอิงไปยังคอมมิทที่ไม่ใช่สาขา -y (พวกเขายังอยู่ในพื้นที่เก็บข้อมูลและบางครั้งสามารถเรียกคืนได้ในกรณีฉุกเฉิน แต่สำหรับจุดประสงค์ส่วนใหญ่คุณควรพิจารณาว่าพวกเขาไปที่จุดนั้น)

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

หลายคนใช้ซึ่งเป็นสั้นมือgit stash pop git stash apply && git stash dropไม่เป็นไร แต่ก็หมายความว่าหากแอปพลิเคชันส่งผลให้เกิดความยุ่งเหยิงและคุณตัดสินใจว่าคุณไม่ต้องการดำเนินการตามเส้นทางนี้คุณจะไม่สามารถซ่อนตัวได้อย่างง่ายดาย นั่นเป็นเหตุผลที่ฉันแนะนำแยกต่างหากapplyตรวจสอบผลลัพธ์dropเฉพาะเมื่อ / เมื่อพอใจ (แน่นอนว่าเป็นการแนะนำจุดอื่นที่คุณสามารถใช้เวลาพักดื่มกาแฟอีกครั้งและลืมสิ่งที่คุณกำลังทำกลับมาทำในสิ่งที่ผิดดังนั้นมันจึงไม่ใช่วิธีการรักษาที่สมบูรณ์แบบ)


1 The savein git stash saveคือกริยาเก่าสำหรับสร้าง stash ใหม่ Git เวอร์ชั่น 2.13 แนะนำคำกริยาใหม่เพื่อให้สิ่งต่าง ๆ สอดคล้องpopและเพื่อเพิ่มตัวเลือกเพิ่มเติมในคำสั่งการสร้าง Git เวอร์ชั่น 2.16 เลิกใช้กริยาเก่าอย่างเป็นทางการ (แม้ว่ามันจะยังคงใช้งานได้ใน Git 2.23 ซึ่งเป็นรุ่นล่าสุดในขณะที่ฉันกำลังแก้ไข)


3
ถ้าฉันต้องการเปลี่ยนเป็นสาขาอื่นโดยไม่ต้องยอมรับกับสาขาปัจจุบัน (เช่นการเปลี่ยนแปลงยังไม่เสร็จสิ้น) และเปลี่ยนกลับมาใช้งานในภายหลัง
stt106

@ stt106: คุณยังต้องยอมรับ แต่คุณสามารถทำได้เช่นเดียวกับในคำตอบนี้และคำตอบอื่น ๆgit stashเพื่อให้git stashคุณได้รับคอมมิชชันสองรายการต่อการซ่อนที่ไม่ธรรมดา ยกเว้นกรณีพิเศษระยะสั้นมาก แต่โดยทั่วไปฉันชอบทำตามปกติมากกว่า คุณสามารถgit reset --softหรือgit reset --mixedภายหลังหรือใช้git commit --amendเพื่อแยกมันออกเมื่อคุณกลับไปทำงานในสาขานั้น (ในปัจจุบัน Git, คุณยังสามารถใช้git worktree addซึ่งอาจจะเป็นทางออกที่ดีกว่าแม้.)
torek

"สิ่งนี้จะประสบความสำเร็จหรือบ่น" อะไรคือสาเหตุของความสำเร็จหรือข้อผิดพลาดเมื่อทำการชำระเงิน
nanocv


การเปลี่ยนแปลงในท้องถิ่นทั้งหมดของฉันจะหายไปเมื่อฉันสลับกับขั้นตอนข้างต้นฉันอยู่ใน <a> สาขาและทำการเปลี่ยนแปลงของฉันและฉันต้องการย้ายไปที่ <b> สาขาและผลักดันการเปลี่ยนแปลงทั้งหมดของฉันในนั้น เมื่อฉันกำลังคอมไพล์สะสมและย้ายไปที่สาขาอื่น ๆ มันดึงไฟล์ทั้งหมดของ <b> สาขาและการเปลี่ยนแปลงในท้องถิ่นของฉันกำลังจะสูญหาย
Mukul Munjal

38

ใช้ที่เก็บคอมไพล์

git stash

มันผลักดันการเปลี่ยนแปลงในสแต็ก เมื่อคุณต้องการดึงพวกเขากลับมาใช้

 git stash apply

คุณสามารถดึงสิ่งของออกได้ หากต้องการระเบิดที่เก็บอย่างสมบูรณ์:

 git stash clear

7
คำสั่งสุดท้ายควรจะเป็นgit stash drop; git stash clearจะลบล้างสแต็กสแตชทั้งหมดรวมถึงการ stashes ที่ไม่เกี่ยวข้องกับชุดคำสั่งนี้
Leland

15
  • git stash เพื่อบันทึกการเปลี่ยนแปลงที่ไม่ได้รับการยอมรับของคุณ
  • git stash list เพื่อแสดงรายการข้อผิดพลาดที่ไม่ได้บันทึกไว้ของคุณ
  • git stash apply stash@{x} โดยที่ x สามารถเป็น 0,1,2 .. โดยไม่มีการซ่อนเร้นที่คุณทำ

4

คุณสามารถ:

  • ใช้git stashเพื่อหยุดการเปลี่ยนแปลงของคุณหรือ

  • สร้างสาขาอื่นและส่งการเปลี่ยนแปลงของคุณที่นั่นจากนั้นรวมสาขานั้นในไดเรกทอรีการทำงานของคุณ

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