เขียนทับสาขาในพื้นที่ของฉันด้วยสาขาระยะไกล


153

ฉันมี fubar อยากสาขาท้องถิ่นของฉันและต้องการที่จะเริ่มต้นใหม่ รุ่นบนเซิร์ฟเวอร์ถูกต้อง

ฉันไม่ต้องการที่จะเริ่มต้นใหม่ฉันต้องการใช้ประวัติศาสตร์ท้องถิ่นของฉันเพื่อแก้ไขความผิดพลาดครั้งใหญ่ของฉัน (ฉันสามารถถ้าฉันต้อง)

git fetch branchnameและgit pull branchnameไม่ทำงาน ข้อความที่ฉันได้รับคือ " ทันสมัย " แต่รุ่นในพื้นที่ของฉันไม่ตรงกับของเซิร์ฟเวอร์

git pull origin/branchnameทำให้ฉันมีข้อผิดพลาด" ไม่พบ "


คำตอบ:


248

ก่อนอื่นให้สร้างสาขาใหม่ในตำแหน่งปัจจุบัน (ในกรณีที่คุณต้องการประวัติ 'เมา' เก่า):

git branch fubar-pin

อัปเดตรายการสาขารีโมตของคุณและซิงค์การคอมมิทใหม่:

git fetch --all

จากนั้นรีเซ็ตสาขาของคุณเป็นจุดที่จุดกำเนิด / สาขาชี้ไปที่:

git reset --hard origin/branch

ระวังสิ่งนี้จะลบการเปลี่ยนแปลงใด ๆ จากแผนผังการทำงานของคุณ!


2
+1 แต่คุณอาจต้องการเพิ่มการเตือนให้ทำgit fetch originก่อนรีเซ็ต
ทำเครื่องหมาย Longair

ฉันทำสิ่งนี้ด้วยการเปลี่ยนแปลงเพียงเล็กน้อยและมันใช้งานไม่ได้: เรียก git - ทั้งหมด, รีเซ็ต git - ฮาร์ด SHA1OFANOLDCOMMIT, (สิ่งอื่น ๆ ), รีเซ็ต git - แหล่งกำเนิด / สาขา ผลลัพธ์ที่ได้คือฉันยังอยู่ในความมุ่งมั่นเก่า ดังนั้นวิธีการนี้อาจใช้งานได้ในบางกรณี แต่ฉันคิดว่ามันใช้งานไม่ได้ในทุกกรณี
Greggles

@greggles: มีข้อผิดพลาดใด ๆ หลังจากคำสั่งสุดท้าย HEAD ต้องชี้ไปที่จุดเริ่มต้น / สาขา
knittl

1
@Gavin: origin/branchไม่มีนี้จะอยู่ภายใต้สถานการณ์ที่ไม่ส่งผลกระทบต่อสาขาอื่นที่ไม่ใช่ ไม่เคย
knittl

1
@greggles ฉันรู้ว่ามันสายมากแต่สำหรับคนอื่น ๆ ที่สงสัยว่าทำไมมันถึงเกิดขึ้นได้วิธีนี้จะใช้ได้เฉพาะถ้าคุณมีสาขาที่เช็คเอาท์ มันไม่ได้ผลสำหรับคุณเพราะคุณอยู่ในสถานะ HEAD เดี่ยว (HEAD ชี้ไปที่การกระทำไม่ใช่สาขา) และคำสั่งเหล่านี้ใช้ได้เฉพาะเมื่อ HEAD ชี้ไปที่สาขา เมื่อคุณทำgit resetในขณะที่ HEAD ชี้ไปที่สาขาสาขานั้นจะตามมา
Michael Dorst

60

สิ่งที่ฉันทำเมื่อฉันทำสาขาในท้องที่ของฉันคือฉันเพิ่งเปลี่ยนชื่อสาขาที่แตกหักของฉันและตรวจสอบ / สาขาสาขาต้นน้ำอีกครั้ง:

git branch -m branch branch-old
git fetch remote
git checkout -b branch remote/branch

ถ้าคุณแน่ใจว่าคุณไม่ต้องการอะไรจากสาขาเก่าของคุณให้ลบมัน:

git branch -D branch-old

แต่โดยปกติฉันจะออกจากสาขาเก่า ๆ ในพื้นที่ในกรณีที่ฉันมีบางอย่างในนั้น


4
ดูเหมือนว่าคำตอบที่ดีที่สุด ช่วยสร้างสำเนาสำรองในกรณีและดูเหมือนว่าน่าจะส่งผลให้สาขาในพื้นที่เป็นสำเนาระยะไกลที่แน่นอน
Greggles

คำตอบที่ดีมีประโยชน์กับฉัน One Q: เอกสารอย่างเป็นทางการของ git-checkout ดูเหมือนจะบอกว่าคำสั่งที่ 3 ของคุณควรเป็น: git checkout -b <branch> --track <remote>/<branch>คุณทำงานได้ดีเท่าเทียมกัน--trackหรือไม่?
Starman

1
ฉันคิดว่า config var branch.autoSetupMerge(ซึ่งฉันคิดว่าค่าเริ่มต้นเป็นจริง) ทำให้เกิดความหมาย--trackโดยนัย และใช่ในการตั้งค่าคอมไพล์ทั้งหมดของฉันฉันไม่จำเป็นต้อง--trackทำอย่างชัดเจนเมื่อทำcheckout -bแต่ YMMV
Casey Marshall

5

สาขาในพื้นที่ของคุณอาจมีการดัดแปลงที่คุณต้องการยกเลิก ในการทำเช่นนี้คุณจะต้องใช้git resetเพื่อรีเซ็ตส่วนหัวของสาขาเป็นจุดสุดท้ายที่คุณแยกออกจากสาขาของ repo ต้นน้ำ ใช้git branch -vเพื่อค้นหารหัส sha1 git reset SHA1IDของสาขาต้นน้ำและตั้งสาขาที่ท่านใช้มัน จากนั้นคุณควรจะทำgit checkoutเพื่อยกเลิกการเปลี่ยนแปลงที่เหลืออยู่ในไดเรกทอรีของคุณ

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


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

2
git reset --hard

นี่คือการย้อนกลับการเปลี่ยนแปลงในท้องถิ่นทั้งหมดของคุณกลับไปที่หัวต้นฉบับ

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