หากต้องการย้ายตัวชี้แบรนช์ของสาขาที่เช็คเอาต์คุณสามารถใช้git reset --hard
คำสั่งได้ แต่จะย้ายตัวชี้แบรนช์ของสาขาที่ไม่ได้ชำระเงินไปยังจุดอื่นได้อย่างไร
หากต้องการย้ายตัวชี้แบรนช์ของสาขาที่เช็คเอาต์คุณสามารถใช้git reset --hard
คำสั่งได้ แต่จะย้ายตัวชี้แบรนช์ของสาขาที่ไม่ได้ชำระเงินไปยังจุดอื่นได้อย่างไร
คำตอบ:
คุณสามารถทำได้เพื่ออ้างอิงโดยพลการ นี่คือวิธีย้ายตัวชี้สาขา:
git update-ref -m "reset: Reset <branch> to <new commit>" refs/heads/<branch> <commit>
รูปแบบทั่วไป:
git update-ref -m "reset: Reset <branch> to <new commit>" <ref> <commit>
คุณสามารถเลือก nits เกี่ยวกับข้อความ reflog หากคุณต้องการ - ฉันเชื่อว่าข้อความbranch -f
นั้นแตกต่างจากข้อความreset --hard
หนึ่งและนี่ไม่ใช่สิ่งใดสิ่งหนึ่ง
git branch -f
นี้ วิธีนี้ดูเหมือนจะเป็น: (A) ใช้ยากขึ้น (B) จดจำได้ยากขึ้นและ (C) อันตรายมากขึ้น
git branch -f <branch-name> <new-tip-commit>
git update-ref -m "reset: Reset <branch> to <new commit>" <branch> <commit>
โดยพลการ (คุณสามารถเลือก nits เกี่ยวกับข้อความ reflog หากคุณต้องการ - ฉันเชื่อว่าข้อความbranch -f
นั้นแตกต่างจากข้อความreset --hard
หนึ่งและนี่ไม่ใช่อย่างใดอย่างหนึ่ง)
git help branch
แจ้งว่า "-f, - บังคับให้รีเซ็ต <branchname> เป็น <startpoint> หากมี <branchname> อยู่แล้วโดยที่ไม่มี -f git branch ปฏิเสธที่จะเปลี่ยนสาขาที่มีอยู่"
git branch -f master <hash>
และกำลังบอกฉันว่าfatal: Cannot force update the current branch.
ฉันต้องทำอะไรตอนนี้ตรวจสอบสาขาสุ่มอื่นก่อนที่ฉันจะอนุญาตให้ใช้คำสั่งนี้
HEAD
ชี้ไปที่)
นอกจากนี้คุณยังสามารถส่งgit reset --hard
การอ้างอิงการมอบหมาย
ตัวอย่างเช่น:
git checkout branch-name
git reset --hard new-tip-commit
ฉันพบว่าฉันทำอะไรแบบกึ่งบ่อย:
สมมติว่าประวัตินี้
$ git log --decorate --oneline --graph
* 3daed46 (HEAD, master) New thing I shouldn't have committed to master
* a0d9687 This is the commit that I actually want to be master
# Backup my latest commit to a wip branch
$ git branch wip_doing_stuff
# Ditch that commit on this branch
$ git reset --hard HEAD^
# Now my changes are in a new branch
$ git log --decorate --oneline --graph
* 3daed46 (wip_doing_stuff) New thing I shouldn't have committed to master
* a0d9687 (HEAD, master) This is the commit that I actually want to be master
git update-ref
ตามที่กล่าวไว้
git reset --hard ...
ไม่จำเป็นต้องทำซ้ำที่นี่! :-(
เพียงเพื่อเพิ่มการอภิปรายหากคุณต้องการย้ายmyBranch
สาขาไปสู่การคอมมิชชันปัจจุบันของคุณให้ข้ามอาร์กิวเมนต์ที่สองหลังจากนั้น-f
ตัวอย่าง:
git branch -f myBranch
ฉันมักจะทำสิ่งนี้เมื่อฉันrebase
อยู่ในสถานะ Detached HEAD :)
ในgitk --all
:
ระวังที่สร้างใหม่อีกครั้งแทนการปรับเปลี่ยนสาขาที่มีอยู่ข้อมูลการติดตามสาขาจะสูญเสีย (โดยทั่วไปจะไม่เป็นปัญหาสำหรับกรณีการใช้งานง่ายที่มีรีโมตเพียงอันเดียวและสาขาโลคัลของคุณมีชื่อเดียวกันกับสาขาที่เกี่ยวข้องในรีโมตดูความคิดเห็นสำหรับรายละเอียดเพิ่มเติมขอบคุณ @ mbdevpl สำหรับชี้ข้อเสียนี้)
มันจะเจ๋งถ้าgitk
มีคุณสมบัติที่กล่องโต้ตอบมี 3 ตัวเลือก: เขียนทับแก้ไขที่มีอยู่หรือยกเลิก
แม้ว่าโดยปกติคุณจะเป็นคนขี้ยาบรรทัดคำสั่งเหมือนตัวเองgit gui
และgitk
ค่อนข้างได้รับการออกแบบมาอย่างดีสำหรับชุดย่อยของการใช้งานคอมไพล์ที่พวกเขาอนุญาต ฉันขอแนะนำให้ใช้พวกเขาในสิ่งที่พวกเขาทำได้ดี (เช่นการคัดเลือกนักล่าเข้า / ออกดัชนีใน git gui และเพียงแค่ยอมรับ (ctrl-s เพื่อเพิ่มการลงชื่อออก: line, ctrl-enter เพื่อคอมมิท .)
gitk
เหมาะอย่างยิ่งสำหรับการติดตามสาขาไม่กี่แห่งในขณะที่คุณแยกแยะการเปลี่ยนแปลงของคุณในซีรีย์ Patch ที่น่าสนใจเพื่อส่งอัปสตรีมหรืออะไรก็ได้ที่คุณต้องการติดตามสิ่งที่คุณกำลังอยู่ในช่วงกลางด้วยสาขาที่หลากหลาย
ฉันไม่ได้เปิดไฟล์กราฟิกเบราว์เซอร์ แต่ฉันรัก gitk / git gui
git status
เอาต์พุตยังได้รับผลกระทบด้วย นอกจากนี้ในบางกรณีgit fetch
และgit push
จะไม่ทำงานโดยไม่ระบุระยะไกลอย่างชัดเจนหากคุณไม่ได้ตั้งสาขาการติดตาม ฉันไม่รู้เกี่ยวกับทุกกรณี แต่สำหรับฉันกฎทั่วไปคือเพื่อความสะดวกและรวดเร็วในการทำงานมันจะดีกว่าถ้ามีการติดตามสาขาตามลำดับ
วิธีการแก้ปัญหาที่แนะนำgit branch -f branch-pointer-to-move new-pointer
ในTortoiseGit :
สุจริตฉันประหลาดใจที่ไม่มีใครคิดเกี่ยวกับgit push
คำสั่ง:
git push -f . <destination>:<branch>
จุด (.) หมายถึงพื้นที่เก็บข้อมูลท้องถิ่นและคุณอาจต้องตัวเลือก -f เพราะปลายทางอาจจะ"หลังคู่ห่างไกล"
แม้ว่าคำสั่งนี้จะใช้ในการบันทึกการเปลี่ยนแปลงของคุณในเซิร์ฟเวอร์ของคุณผลลัพธ์ที่ได้จะเหมือนกับการย้ายสาขาระยะไกล ( <branch>
) ไปยังการกระทำเดียวกันกับสาขาท้องถิ่น ( <destination>
)
-f
หลีกเลี่ยงการอุดตันในพื้นที่ ตัวอย่างเช่นgit fetch origin && git push . origin/develop:develop
เป็นรุ่นที่ไม่ต้องชำระเงินซึ่งไม่จำเป็นต้องมีgit checkout develop && git pull --ff-only
เปิดไฟล์.git/refs/heads/<your_branch_name>
และเปลี่ยนแฮชที่เก็บไว้ในตำแหน่งที่คุณต้องการย้ายส่วนหัวของสาขาของคุณ เพียงแก้ไขและบันทึกไฟล์ด้วยโปรแกรมแก้ไขข้อความใด ๆ เพียงตรวจสอบให้แน่ใจว่าสาขาที่จะแก้ไขไม่ใช่สาขาปัจจุบันที่ใช้งานอยู่
คำเตือน:อาจไม่ใช่วิธีที่แนะนำให้ใช้ แต่อาจทำให้งานเสร็จ
ในกรณีที่การคอมมิชชันที่คุณต้องการให้ชี้ไปข้างหน้าของสาขาปัจจุบัน (ซึ่งควรเป็นกรณียกเว้นว่าคุณต้องการยกเลิกการคอมมิชชันล่าสุดของสาขาปัจจุบัน) คุณสามารถทำได้:
git merge <commit>
git push . <commit>:<branch>
ตามที่แนะนำไว้แล้ว
git branch <branch-name> <SHA-1-of-the-commit>
และทิ้งสาขาเก่า