Git - ทำงานในสาขาที่ไม่ถูกต้อง - วิธีคัดลอกการเปลี่ยนแปลงไปยังสาขาหัวข้อที่มีอยู่


333

ฉันทำงานเกี่ยวกับโครงการ แต่โชคไม่ดีที่ฉันลืมเปลี่ยนไปใช้สาขาของฉัน

ฉันจะคัดลอกงาน (3 ไฟล์) ที่ฉันทำที่นี่จากต้นแบบไปยังสาขาของฉัน (เรียกว่าเช่นbranch123 ) โดยไม่ต้องcomittingไปยัง master ได้อย่างไร

คำตอบ:


540

เสียงเหมือนที่คุณต้องการคือ:

git stash
git checkout branch123
git stash apply

จากนั้นคุณควรกลับมาที่สาขาของคุณเองโดยไม่ต้องสัมผัสกับสาขาหลัก


6
โอเคฉันวิ่งไปที่นั้น แต่เมื่อฉันเปลี่ยนกลับไปเป็นหลัก (เช็คเอาต์หลักของ git) และเรียกใช้สถานะ git ไฟล์เดิมยังคง "แก้ไข" อยู่ - คาดว่าจะเป็นเช่นนั้นหรือไม่
อเล็กซ์

5
คุณอาจไม่จำเป็นต้องซ่อนตัวจริงหากความแตกต่างระหว่างสาขาปัจจุบันของคุณ (หลัก) และสาขาหัวข้อ (branch123) ไม่ได้อยู่ในไฟล์ใด ๆ ที่คุณแก้ไขในเครื่อง Git จะช่วยให้คุณตรวจสอบสาขาของหัวข้อในกรณีนั้น
Cascabel

3
@Alex: ใช่นั่นเป็นไปตามที่คาดไว้ สิ่งนี้ไม่เกี่ยวข้องกับการผูกมัด stashบันทึกการแก้ไขในพื้นที่จากนั้นstash applyนำกลับมาใช้ใหม่
Cascabel

6
ฉันจะ "กำจัด" พวกเขาออกจากสาขาหลักได้อย่างไรเพื่อให้สะอาด
อเล็กซ์

7
git reset --hard HEADและคุณจะกลับไปสู่การผูกพันสุดท้ายที่คุณทำกับสาขาหลัก
gnab

46

คำตอบที่ได้รับการยอมรับนั้นละเอียดที่สุด แต่มีกรณีพิเศษที่คุณสามารถทำให้ง่ายขึ้นได้ หากไฟล์ที่คุณแก้ไขในไดเร็กทอรีการทำงานเหมือนกันทั้งคู่masterและbranch123คุณสามารถทำได้

git checkout branch123

ไม่จำเป็นต้องซ่อนอะไรเนื่องจากพฤติกรรมเริ่มต้นของcheckoutคือไม่เขียนทับไฟล์ที่ถูกแก้ไขในไดเรกทอรีทำงานของคุณดังนั้นคุณจะไม่สูญเสียอะไรเลย (สิ่งนี้ถูกกล่าวถึงในความคิดเห็นก่อนโดย Cascabel)

ตามที่คนอื่น ๆ พูดถึงในความคิดเห็นหากbranch123ยังไม่มีคุณสามารถทำได้

git checkout -b branch123

ขึ้นอยู่กับสิ่งที่ฉันพบที่นี่


3
หรือถ้าคุณต้องการสร้างสาขาใหม่git checkout -b newbranch
ฟิลมิทเชล

2
มันใช้งานได้ดีกว่าสำหรับฉันและซ่อนได้ง่ายกว่ามาก ขอบคุณ!
Matthias

31
ไม่มันใช้งานไม่ได้ Git จะแสดงข้อความนี้: "กระทำการเปลี่ยนแปลงของคุณหรือซ่อนไว้ก่อนที่คุณจะสามารถสลับสาขาได้"
dsharew

1
@DegenSharew: ใช่คุณมีสิทธิในบางกรณีคือถ้าไฟล์ที่คุณได้แก้ไขในไดเรกทอรีการทำงานจะไม่เหมือนกันในและmaster branch123ดูคำตอบที่แก้ไขของฉัน
Russel Dirks

1
มันใช้งานได้ดีสำหรับฉัน ฉันยังไม่มีสาขาทำดังนั้นฉันจึงทำสิ่งนี้: git checkout -b newbranchname การเปลี่ยนแปลงของฉันปรากฏในสาขานั้นด้วยตนเอง
dex3703


0

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

สถานการณ์นี้ทำงานอย่างน้อยกับปลั๊กอิน VS 2015 Git แต่ส่วนใหญ่จะทำงานกับเครื่องมือ git ใด ๆ

  1. ชำระเงินและทำการเปลี่ยนแปลงไฟล์ในต้นแบบ (อัพ!, ผิดสาขา)
  2. สร้างสาขาใหม่ "temp" (หรือชื่อใด ๆ ที่ไม่ได้ใช้ที่คุณเลือก) จากต้นแบบ ไฟล์ที่เช็กเอาต์จะถูกเช็กเอาต์ใน temp ไม่ใช่เจ้านาย
  3. เช็คอินการเปลี่ยนแปลงใน temp (ไม่มีการแตะต้องต้นแบบ)
  4. ตอนนี้ทุกอย่างได้รับการเช็คอินและเป็นไปได้ที่จะตรวจสอบสาขาที่มีอยู่ ตรวจสอบสาขาที่ต้องการ (สาขาที่ฉันต้องการจะทำการเปลี่ยนแปลงเริ่มต้นด้วย) 3.5 Git Rebase
  5. รวม temp เข้ากับสาขาที่ต้องการ ตอนนี้การเปลี่ยนแปลงอยู่ในสาขาที่ถูกต้อง
  6. ลบสาขาชั่วคราวตามที่ไม่จำเป็นอีกต่อไป

แก้ไข: ฉันพบว่าคุณจะต้องทำการ rebase (git rebase --onto) ของสาขา temp ก่อนที่จะทำการผสาน มิฉะนั้นการเปลี่ยนแปลงในต้นแบบจะรวมอยู่ในการผสาน ขั้นตอนพิเศษ 3.5 ข้างต้น ดูเพิ่มเติมเกี่ยวกับการรีบูตที่นี่: https://git-scm.com/book/en/v2/Git-Branching-Rebasing


คุณช่วยอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับโซลูชันที่คุณให้ได้ไหม
abarisone

ขอบคุณสำหรับความคิดเห็นของคุณ วิธีการแก้ปัญหาค่อนข้างง่าย แต่และเป็นไปตามหลักการเดียวกันกับวิธีการแก้ปัญหา "stash" ยกเว้นว่าจะใช้สาขาชั่วคราวแทนการสะสม สะดวกกว่าอย่างน้อยสำหรับผู้ใช้ Visual Studio เนื่องจาก Stash ไม่รองรับปลั๊กอิน GIT
Pasi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.