ฉันจะรีเซ็ต 'ต้นแบบ' เป็น 'ต้นกำเนิด / ต้นแบบ' ได้อย่างไร


215

ฉันสามารถทำสิ่งต่อไปนี้ในวิธีที่ง่ายกว่าได้ไหม?

git checkout origin/master
git branch -D master
git branch master
git checkout master

บางครั้งสิ่งนี้สามารถทำได้โดยไม่ต้องแตะที่ต้นไม้ทำงาน: stackoverflow.com/a/12343727/586086
Andrew Mao

6
โปรดอัปเดตคำตอบที่คุณยอมรับ: @ KindDragon คำตอบนั้นถูกต้องและสั้นกว่า
Robert Siemer

คำตอบ:


310

ตามคำตอบของKindDragonคุณสามารถสร้างใหม่ได้โดยตรงที่:masterorigin/master

git checkout -B master origin/master

git checkoutหน้าคน กล่าวถึง:

หาก-Bได้รับ<new_branch>จะถูกสร้างขึ้นหากไม่มีอยู่จริง มิฉะนั้นจะถูกตั้งค่าใหม่ นี่คือการทำธุรกรรมที่เทียบเท่า

$ git branch -f <branch> [<start point>]
$ git checkout <branch>

แนะนำเดิม:

สิ่งที่ต้องการ:

$ git checkout master

# remember where the master was referencing to
$ git branch previous_master

# Reset master back to origin/master
$ git reset --hard origin/master

ด้วยขั้นตอนที่ 2 เป็นตัวเลือก


1
คุณสามารถทำได้ด้วยหนึ่งบรรทัด
Robert Siemer

93

Git รองรับคำสั่งนี้:

git checkout -B master origin/master

ตรวจสอบorigin/masterสาขาแล้วรีเซ็ตmasterสาขาที่นั่น


4
คำตอบที่แท้จริงเท่านั้น
Robert Siemer

3
บันทึกการกดแป้นสี่ครั้ง - คุณไม่จำเป็นต้องใส่เครื่องหมายคำพูด เพียงแค่: ชำระเงินคอมไพล์ -B ต้นกำเนิด / ต้นแบบต้นแบบ
zumalifeguard

สมมุติว่าฉันทำ 2 สิ่งสิ่งแรกคือการรวมสาขาและสิ่งที่สองเป็นเรื่องปกติ จะเกิดอะไรขึ้นกับการรวมกันหากฉันกลับไปที่จุดเริ่มต้น / หลัก
utdev

1
คุณไม่ต้องgit fetch origin masterก่อนเพื่อให้แน่ใจว่าorigin/masterได้รับการอัปเดตหรือไม่
pedrozath

ใช่แน่นอนด้วยวิธีแก้ปัญหาทั้งหมดที่คุณควรทำgit fetchก่อน
KindDragon

29

ฉันคิดว่าคำตอบของ VonC มีความซับซ้อนเมื่อเทียบกับตัวเลือกนี้:

git update-ref refs/heads/master origin/master
git reset --hard master

git จะบันทึกทุกค่าของ ref โดยอัตโนมัติ (ผ่าน reflog) ดังนั้นหลังจากที่คุณเรียกใช้คำสั่งนั้นแล้วmaster@{1}หมายถึงค่าก่อนหน้าของต้นแบบ

คำตอบของ VonC นั้นถูกต้อง แต่มันเป็นการสิ้นเปลืองเวลาในการชำระค่าเก่าของมาสเตอร์ในระบบไฟล์

หากคุณสนใจเกี่ยวกับวัตถุกำพร้าใน repo คุณสามารถเรียกใช้ git gc


1
ฟังดูเป็นทางเลือกที่น่าสนใจ +1
VonC

ฉันยังได้รับAlready on 'master'
yourfriendzak

@yourfriendzak ฉันลืมเกี่ยวกับการที่คุณอาจมีต้นแบบเช็คเอาต์ก่อนที่จะมีการปรับปรุงต้นแบบ ฉันได้อัปเดตคำตอบให้เป็นคำตอบที่ควรใช้ได้แม้ในกรณีนั้นเช่นกัน
Alexander Bird

วิธีนี้ใช้ได้แม้ว่าคุณจะไม่ได้อยู่ในตำแหน่งต้นแบบ (เช่นสถานะ HEAD ที่แยกออกซึ่งชี้ไปที่ต้นกำเนิด / ต้นแบบของจริง) จากนั้นคุณสามารถชำระเงินหลักโดยไม่ต้องพลิกไฟล์เก่าผ่าน repo ที่ดี!
Andrew Mao

20

หากคุณมีอยู่แล้วmasterคุณสามารถทำสิ่งต่อไปนี้:

git reset --hard origin/master

มันจะชี้masterสาขาท้องถิ่นไปยังรีโมทorigin/masterและทิ้งการดัดแปลงใด ๆ ใน dir ที่ทำงาน


และจะลบไฟล์! หากคุณได้สร้าง / แก้ไขไฟล์และเรียกใช้ "git add" ในคำสั่งนี้จะลบออก ถูกเตือน
Cheeso

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