วิธีส่งการเปลี่ยนแปลงไปยังสาขาใหม่


151

ฉันเพิ่งเปลี่ยนแปลงสาขา ฉันจะยอมรับการเปลี่ยนแปลงไปยังสาขาอื่นได้อย่างไร

ฉันพยายามใช้:

git checkout "the commmit to the changed branch" -b "the other branch"

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

ฉันควรใช้คำสั่งต่อไปนี้แทนหรือไม่

git merge "the other branch"

เพียงแค่การกระทำหรือหลาย ๆ
Carl Norum

คำตอบ:


269

git checkout -b your-new-branch

git add <files>

git commit -m <message>

ก่อนชำระเงินสาขาใหม่ของคุณ จากนั้นเพิ่มไฟล์ทั้งหมดที่คุณต้องการคอมมิตเพื่อจัดเตรียม สุดท้ายยอมรับไฟล์ทั้งหมดที่คุณเพิ่งเพิ่ม คุณอาจต้องการทำในgit push origin your-new-branchภายหลังเพื่อให้การเปลี่ยนแปลงของคุณปรากฏบนรีโมท


1
เนื่องจากฉันได้รับสาขาใหม่จาก git checkout v3.0 (สาขาก่อนที่จะทำการเปลี่ยนแปลง) สาขาใหม่ฉันยังต้องใช้ "git add <files>" หรือไม่
user1988385

คุณสามารถทำgit statusเพื่อดูว่ามีการจัดฉากในขณะนี้และอะไรบ้าง
John Brodie

5
ทำไมทั้งสองgit addและgit commit -a?
Carl Norum

11
มันไม่ได้เป็นgit checkout -b your-new-branchแทนgit checkout your-new-branch?
Schrodinger's'Cat

1
ถ้าฉันติดตามไฟล์แล้วและต้องการเปลี่ยนเป็นสาขาใหม่ให้เพิ่มไฟล์เหล่านั้นในสาขาที่สร้างขึ้นใหม่
ass-king คำถาม

58

หากคุณยังไม่ได้ยืนยันการเปลี่ยนแปลง

หากการเปลี่ยนแปลงของคุณเข้ากันได้กับสาขาอื่น

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

เช่นเดียวกับคำตอบที่ยอมรับโดย John Brodie คุณสามารถชำระเงินที่สาขาใหม่และส่งงาน:

git checkout -b branch_name
git add <files>
git commit -m "message"

หากการเปลี่ยนแปลงของคุณไม่สอดคล้องกับสาขาอื่น

หากคุณได้รับข้อผิดพลาด:

error: Your local changes to the following files would be overwritten by checkout:
...
Please commit your changes or stash them before you switch branches

จากนั้นคุณสามารถซ่อนงานของคุณสร้างสาขาใหม่จากนั้นแสดงการเปลี่ยนแปลงที่เก็บของคุณและแก้ไขข้อขัดแย้ง:

git stash
git checkout -b branch_name
git stash pop

มันจะเป็นถ้าคุณได้ทำการเปลี่ยนแปลงเหล่านั้นหลังจากสร้างสาขาใหม่ จากนั้นคุณสามารถกระทำได้ตามปกติ:

git add <files>
git commit -m "message"

หากคุณมีการเปลี่ยนแปลง

หากคุณต้องการเก็บความมุ่งมั่นในสาขาเดิม

ดูคำตอบของ Carl Norum ด้วยการเก็บผลเชอร์รี่ซึ่งเป็นเครื่องมือที่เหมาะสมในกรณีนี้:

git checkout <target name>
git cherry-pick <original branch>

หากคุณไม่ต้องการที่จะรักษาความมุ่งมั่นในสาขาเดิม

ดูคำตอบโดย joeytwiddle กับความเป็นไปได้ที่ซ้ำกันนี้ ทำตามขั้นตอนข้างต้นตามความเหมาะสมจากนั้นย้อนกลับสาขาเดิม:

git branch -f <original branch> <earlier commit id>

หากคุณผลักดันการเปลี่ยนแปลงของคุณเป็นรีโมตที่แชร์เช่น GitHub คุณไม่ควรลองย้อนกลับนี้จนกว่าคุณจะรู้ว่าคุณกำลังทำอะไรอยู่


3
ทุกคนจะลองรหัสนี้ เนื่องจากคนส่วนใหญ่ที่ค้นหาคำตอบพวกเขามีการเปลี่ยนแปลงบางอย่างในรหัสที่มีอยู่ของคุณ
Sushin Pv

2
ทำไมคุณเพิ่มป๊อปสะสมและสะสม? เมื่อคุณชำระเงินสาขาใหม่การเปลี่ยนแปลงของคุณจะพร้อมใช้งานเพื่อเพิ่มและกระทำไม่จำเป็นต้องซ่อน
อุโมงค์

@Tristan คุณถูกต้องในกรณีที่การเปลี่ยนแปลงเข้ากันได้และไฟล์ไม่ได้เขียนทับ ไม่เช่นนั้นฉันจะได้รับerror: Your local changes to the following files would be overwritten by checkout: ... Please commit your changes or stash them before you switch branches.คุณต้องการเขียนคำตอบใหม่หรือแก้ไขคำตอบของฉัน? ถ้าไม่ฉันสามารถแก้ไขได้ด้วยตนเอง
miguelmorin

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

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

24

ถ้าฉันเข้าใจถูกต้องคุณได้ทำไปchanged_branchแล้วและคุณต้องการที่จะทำสำเนาสิ่งนั้นother_branch? ง่าย:

git checkout other_branch
git cherry-pick changed_branch

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