ขยายสิ่งที่ฉันเขียนในความคิดเห็น
กฎทั่วไปคือคุณไม่ควรเขียน (เปลี่ยน) ประวัติที่คุณเผยแพร่เพราะบางคนอาจใช้งานของพวกเขา หากคุณเขียนใหม่ (เปลี่ยน) ประวัติคุณจะสร้างปัญหากับการรวมการเปลี่ยนแปลงของพวกเขาและการปรับปรุงสำหรับพวกเขา
ดังนั้นวิธีแก้ไขคือสร้างคอมมิชชันใหม่ที่แปลงการเปลี่ยนแปลงที่คุณต้องการกำจัด คุณสามารถทำได้โดยใช้คำสั่งgit revert
คุณมีสถานการณ์ต่อไปนี้:
A <- B <- C <- D <- master <- HEAD
(ลูกศรที่นี่หมายถึงทิศทางของตัวชี้: การอ้างอิง "พาเรนต์" ในกรณีของการกระทำการส่งสูงสุดในกรณีของหัวหน้าสาขา (การอ้างอิงสาขา) และชื่อของสาขาในกรณีของการอ้างอิง HEAD)
สิ่งที่คุณต้องสร้างมีดังต่อไปนี้:
A <- B <- C <- D <- [(BCD) ^ - 1] <- master <- HEAD
ที่ "[(BCD) ^ - 1]" หมายถึงการกระทำที่ย้อนกลับการเปลี่ยนแปลงในการกระทำ B, C, D. คณิตศาสตร์บอกเราว่า (BCD) ^ - 1 = D ^ -1 C ^ -1 B ^ -1 ดังนั้น คุณสามารถรับสถานการณ์ที่ต้องการโดยใช้คำสั่งต่อไปนี้:
$ git revert --no-commit D
$ git revert --no-commit C
$ git revert --no-commit B
$ git commit -m "the commit message"
ทางออกอื่นคือการชำระเงิน เนื้อหาของการกระทำ A และกระทำรัฐนี้:
$ git checkout -f A -- .
$ git commit -a
จากนั้นคุณจะมีสถานการณ์ต่อไปนี้:
A <- B <- C <- D <- A '<- master <- HEAD
กระทำ A 'มีเนื้อหาเช่นเดียวกับกระทำ A แต่กระทำแตกต่างกัน (กระทำข้อความผู้ปกครองวันกระทำ)
การแก้ปัญหาโดย Jeff Ferland แก้ไขโดย Charles Baileyสร้างจากแนวคิดเดียวกัน แต่ใช้การรีเซ็ต git :
$ git reset --hard A
$ git reset --soft @{1} # (or ORIG_HEAD), which is D
$ git commit
git push -f HEAD~4:master
(สมมติว่าสาขาระยะไกลเป็นหลัก) ใช่คุณสามารถผลักดันการกระทำเช่นนั้นได้