หากต้องการย้ายตัวชี้แบรนช์ของสาขาที่เช็คเอาต์คุณสามารถใช้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>และทิ้งสาขาเก่า