ฉันรู้ว่านั่นคือการเขียนประวัติศาสตร์ซึ่งไม่ดียาดาญาดา
แต่จะลบการผูกข้อมูลบางอย่างจากสาขาระยะไกลอย่างถาวรได้อย่างไร
ฉันรู้ว่านั่นคือการเขียนประวัติศาสตร์ซึ่งไม่ดียาดาญาดา
แต่จะลบการผูกข้อมูลบางอย่างจากสาขาระยะไกลอย่างถาวรได้อย่างไร
คำตอบ:
คุณgit reset --hardสาขาท้องถิ่นของคุณเพื่อลบการเปลี่ยนแปลงจากต้นไม้การทำงานและดัชนีและคุณgit push --forceสาขาท้องถิ่นของคุณแก้ไขไปยังระยะไกล ( โซลูชันอื่น ๆ ที่นี่เกี่ยวข้องกับการลบสาขาระยะไกลและผลักมันอีกครั้ง)
คำตอบ SOนี้แสดงให้เห็นถึงอันตรายของคำสั่งดังกล่าวโดยเฉพาะอย่างยิ่งถ้าคนขึ้นอยู่กับประวัติระยะไกลสำหรับ repos ท้องถิ่นของตนเอง
คุณต้องเตรียมพร้อมที่จะชี้ให้ผู้คนเห็นถึงการกู้คืนจากส่วนการรีเฟรช UPSTREAMของgit rebaseหน้าคน
ด้วย Git 2.23 (สิงหาคม 2019 เก้าปีต่อมา) git switchคุณจะใช้คำสั่งใหม่
นั่นคือ:
(แทนที่ด้วยจำนวนข้อผูกพันที่จะลบ)git switch -C mybranch origin/mybranch~nn
ที่จะคืนค่าดัชนีและต้นไม้ทำงานเหมือนgit reset --hardจะ
push --forceออกไป
git gcไม่ได้ทำงานบ่อยครั้งเพียงพอในด้านระยะไกล ตัวอย่างเช่นใน GitHub: twitter.com/githubhelp/status/387926738161774592?lang=es
เพิ่งทราบที่จะใช้last_working_commit_idเมื่อคืนค่าการกระทำที่ไม่ทำงาน
git reset --hard <last_working_commit_id>
ดังนั้นเราจะต้องไม่รีเซ็ตเป็นสิ่งcommit_idที่เราไม่ต้องการ
จากนั้นแน่นอนว่าเราจะต้องผลักดันไปยังสาขาระยะไกล:
git push --force
git reset --hardควรจะทำ
มีสามตัวเลือกที่แสดงในบทช่วยสอนนี้ ในกรณีที่ลิงค์แตกฉันจะออกจากขั้นตอนหลักที่นี่
1 ย้อนกลับการกระทำแบบเต็ม
git revert dd61ab23
2 ลบการคอมมิทล่าสุด
git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
หรือหากสาขามีให้บริการในท้องถิ่น
git reset HEAD^ --hard
git push <<remote>> -f
โดยที่ + dd61 ... คือการแฮชและการคอมไพล์ของคุณตีความ x ^ เป็นพาเรนต์ของ x และ + เป็นการบังคับที่ไม่ใช่การกดอย่างรวดเร็ว
3 ลบการกระทำออกจากรายการ
git rebase -i dd61ab23^
การดำเนินการนี้จะเปิดขึ้นและผู้แก้ไขจะแสดงรายการการกระทำทั้งหมด ลบอันที่คุณต้องการกำจัด เสร็จสิ้นการ rebase และผลักดันเพื่อซื้อคืน
git rebase --continue
git push <remote_repo> <remote_branch> -f
หากคุณต้องการลบตัวอย่างการคอมมิทล่าสุด3ให้รันคำสั่งต่อไปนี้เพื่อลบการเปลี่ยนแปลงจากระบบไฟล์ (แผนผังการทำงาน) และคอมมิทประวัติ (ดัชนี) ในสาขาท้องถิ่นของคุณ:
git reset --hard HEAD~3
จากนั้นรันคำสั่งต่อไปนี้ (บนเครื่องโลคอล) เพื่อบังคับให้รีโมตแบรนช์เขียนประวัติใหม่:
git push --force
ขอแสดงความยินดี! ทุกอย่างเสร็จเรียบร้อย!
หมายเหตุบางส่วน:
คุณสามารถดึงรหัสยืนยันที่ต้องการได้
git log
จากนั้นคุณสามารถแทนที่HEAD~Nด้วย<desired-commit-id>สิ่งนี้:
git reset --hard <desired-commit-id>
หากคุณต้องการที่จะให้มีการเปลี่ยนแปลงในระบบไฟล์และเพียงแค่ปรับเปลี่ยนดัชนี (กระทำประวัติศาสตร์) ใช้ธงเช่น--soft git reset --soft HEAD~3จากนั้นคุณมีโอกาสตรวจสอบการเปลี่ยนแปลงล่าสุดของคุณและเก็บหรือลบทั้งหมดหรือบางส่วน ในกรณีหลัง runnig แสดงไฟล์ที่เปลี่ยนแปลงตั้งแต่git status <desired-commit-id>หากคุณใช้--hardตัวเลือกgit statusจะแจ้งให้คุณทราบว่าสาขาในพื้นที่ของคุณเหมือนกับสาขาระยะไกล หากคุณไม่ได้ใช้--hardหรือโหมดเริ่มต้นจะใช้ที่อยู่--soft --mixedในโหมดนี้git help resetพูดว่า:
รีเซ็ตดัชนี แต่ไม่ใช่แผนผังการทำงาน (เช่นไฟล์ที่ถูกเปลี่ยนแปลงจะถูกสงวนไว้ แต่ไม่ได้ทำเครื่องหมายเพื่อยอมรับ) และรายงานสิ่งที่ยังไม่ได้รับการอัพเดต
นี่อาจจะสายเกินไป แต่สิ่งที่ช่วยฉันคือตัวเลือก 'นิวเคลียร์' ที่ฟังดูเจ๋ง โดยทั่วไปการใช้คำสั่งfilter-branchคุณสามารถลบไฟล์หรือเปลี่ยนแปลงบางอย่างในไฟล์จำนวนมากตลอดประวัติศาสตร์ git ของคุณ
ลดความซับซ้อนจากคำตอบของ pctroll คล้ายกับโพสต์บล็อกนี้
# look up the commit id in git log or on github, e.g. 42480f3, then do
git checkout master
git checkout your_branch
git revert 42480f3
# a text editor will open, close it with ctrl+x (editor dependent)
git push origin your_branch
# or replace origin with your remote
บางครั้งวิธีที่ง่ายที่สุดในการแก้ไขปัญหานี้คือการสร้างสาขาใหม่จากสถานที่ที่คุณรู้ว่ารหัสนั้นดี จากนั้นคุณสามารถปล่อยให้ประวัติศาสตร์ของสาขาที่หลงทางอยู่เพียงลำพังในกรณีที่คุณจำเป็นต้องเลือกใช้เชอร์รี่อื่น ๆ ในภายหลัง นอกจากนี้ยังช่วยให้แน่ใจว่าคุณจะไม่สูญเสียประวัติการกระทำใด ๆ
จากสาขาที่ออกเดินทางในท้องถิ่นของคุณ:
git log
คัดลอกแฮชการกระทำที่คุณต้องการให้สาขาอยู่และออกจากบันทึก git
git checkout theHashYouJustCopied
git checkout -b your_new_awesome_branch
ตอนนี้คุณมีสาขาใหม่ในแบบที่คุณต้องการ
หากคุณต้องการรักษาความมุ่งมั่นที่เฉพาะเจาะจงจากสาขาที่ผิดพลาดที่ไม่ได้อยู่ในสาขาใหม่ของคุณคุณสามารถเลือกรับเฉพาะการกระทำที่คุณต้องการ:
git checkout the_errant_branch
git log
คัดลอกแฮชการกระทำของคอมมิตที่คุณต้องการดึงเข้าสู่สาขาที่ดีและออกจากบันทึกการคอมไพล์
git checkout your_new_awesome_branch
git cherry-pick theHashYouJustCopied
ตบหลังตัวเอง
git reset --soft commit_id
git stash save "message"
git reset --hard commit_id
git stash apply stash stash@{0}
git push --force