ฉันจะคัดลอกเนื้อหาของสาขาไปยังสาขาท้องถิ่นใหม่ได้อย่างไร


270

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


10
4 ปีต่อมากับ Git 2.15 (ไตรมาสที่ 4 ปี 2017) git branch -c A Bคุณจะมี ดูคำตอบของฉันด้านล่าง
VonC

คำตอบ:


445
git checkout old_branch
git branch new_branch

สิ่งนี้จะให้สาขาใหม่ "new_branch" ที่มีสถานะเดียวกับ "old_branch"

คำสั่งนี้สามารถรวมกับสิ่งต่อไปนี้:

git checkout -b new_branch old_branch

134
หรือสั้นกว่านั้นgit checkout -b new_branch(เมื่อคุณเปิดอยู่old_branch)
Koraktor

4
นี่เป็นเพียงการสร้างสาขาใหม่ แต่ไม่สามารถคัดลอกเนื้อหาจากสาขาหนึ่งไปยังสาขาอื่นได้ เมื่อฉันลองคำสั่งนี้มันจะแสดง "สาขาชื่อ **** มีอยู่แล้ว"
anoop

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

1
git checkout old_branch และกว่า git branch new_branch .... การใช้คำสั่งด้านบนในการผลิตดีกว่าคำสั่งด้านล่างจะสร้างสาขาใหม่และนำคุณไปสู่สาขาใหม่ (เปลี่ยนสาขาเป็นสาขาใหม่) .... git checkout -b new_branch old_branch
Kiran

หากต้องการเขียนทับสาขาดูstackoverflow.com/questions/26961371/…
MCCCS

55
git branch copyOfMyBranch MyBranch

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


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

52

ด้วย Git 2.15 (Q4 2017) " git branch" เรียนรู้ " -c/-C" เพื่อสร้างสาขาใหม่โดยการคัดลอกสาขาที่มีอยู่

ดูกระทำ c8b2cec (18 มิถุนายน 2017) โดยÆvar Arnfjord Bjarmason (avar )
ดูกระทำ 52d59cc , กระทำ 5463caa (18 มิถุนายน 2017) โดยSahil Dua (sahildua2305 )
(ผสานโดยJunio ​​C Hamano - gitster- in 3b48045 , 03 Oct 2017)

branch: เพิ่มตัวเลือก--copy( -c) เพื่อไปกับ--move( -m)

เพิ่มความสามารถใน--copyสาขาและการอ้างอิงและการกำหนดค่าซึ่งใช้เครื่องจักรพื้นฐานเดียวกันกับตัวเลือก--move( -m) ยกเว้นการคัดลอกและการกำหนดค่าจะถูกคัดลอกแทนที่จะถูกย้าย

นี้จะเป็นประโยชน์สำหรับเช่นการคัดลอกสาขาหัวข้อเป็นรุ่นใหม่เช่นworkการwork-2หลังจากส่งworkหัวข้อในรายการขณะที่การรักษาข้อมูลทั้งหมดติดตามและการกำหนดค่าอื่น ๆ ที่จะไปด้วยสาขาและแตกต่างจาก--moveการรักษาอื่น ๆ สาขาแล้วส่งไปรอบ ๆ การอ้างอิง

หมายเหตุ: เมื่อคัดลอกสาขาคุณจะยังคงอยู่ในสาขาปัจจุบันของคุณ
ดังที่ Junio ​​C Hamano อธิบาย:

เมื่อสร้างสาขาใหม่BโดยการคัดลอกสาขาAที่เกิดขึ้นเป็นสาขาปัจจุบันมันก็จะอัพเดตHEADไปที่สาขาใหม่
มันอาจถูกสร้างขึ้นด้วยวิธีนี้เพราะ " git branch -c A B" piggybacked การนำไปใช้กับ " git branch -m A B"

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

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

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