ถ้าคุณผลักดันกระทำกับเซิร์ฟเวอร์และจากนั้นเขียนว่ากระทำในประเทศ (มีgit reset
, git rebase
, git filter-branch
, หรือการจัดการประวัติศาสตร์อื่น ๆ ) และผลักดันให้แล้วที่เขียนใหม่กระทำกลับขึ้นไปยังเซิร์ฟเวอร์ที่คุณจะพลาดคนอื่น ๆ ที่ได้ดึง นี่คือตัวอย่าง; กล่าวว่าคุณได้กระทำ A และผลักดันไปยังเซิร์ฟเวอร์
- * - * - A <- มาสเตอร์
- * - * - A <- ที่มา / ต้นแบบ
ตอนนี้คุณตัดสินใจที่จะเขียน A ใหม่ตามวิธีที่คุณกล่าวถึงการรีเซ็ตและการคอมมิตใหม่ โปรดทราบว่าสิ่งนี้จะทิ้งข้อผูกมัด A ซึ่งจะถูกเก็บรวบรวมในที่สุดเนื่องจากไม่สามารถเข้าถึงได้
- * - * - ก
\
ก '<- master
- * - * - A <- ที่มา / ต้นแบบ
ถ้ามีคนอื่นสมมติว่า Fred ดึงmaster
ออกจากเซิร์ฟเวอร์ในขณะที่คุณทำสิ่งนี้พวกเขาจะมีการอ้างอิงถึง A ซึ่งอาจเริ่มทำงานจาก:
- * - * - ก '<- โท
- * - * - A <- ที่มา / ต้นแบบ
- * - * - AB <- เฟรด / มาสเตอร์
ตอนนี้ถ้าคุณสามารถผลักดัน A ของคุณไปยังจุดเริ่มต้น / ต้นแบบซึ่งจะสร้างแบบไม่กรอไปข้างหน้าก็จะไม่มี A ในประวัติ ดังนั้นหากเฟร็ดพยายามดึงอีกครั้งเขาก็ต้องรวมเข้าด้วยกันและจะแนะนำการกระทำ A อีกครั้ง:
- * - * - ก '<- โท
- * - * - A <- ที่มา / ต้นแบบ
- * - * - AB- \
\ * <- เฟรด / มาสเตอร์
ก '- /
หากเฟร็ดสังเกตเห็นสิ่งนี้เขาก็สามารถสร้างฐานใหม่ได้ซึ่งจะป้องกันไม่ให้คอมมิต A ปรากฏขึ้นอีกครั้ง แต่เขาต้องสังเกตสิ่งนี้และอย่าลืมทำสิ่งนี้ และหากคุณมีมากกว่าหนึ่งคนที่ดึง A ลงมาพวกเขาทั้งหมดจะต้องตั้งฐานใหม่เพื่อหลีกเลี่ยงการรับ A พิเศษในทรี
ดังนั้นโดยทั่วไปจึงไม่ควรเปลี่ยนประวัติใน repo ที่คนอื่นดึงมา อย่างไรก็ตามหากคุณบังเอิญรู้ว่าไม่มีใครดึงจาก repo นั้น (ตัวอย่างเช่นเป็น repo ส่วนตัวของคุณเองหรือคุณมีนักพัฒนารายอื่นเพียงคนเดียวที่ทำงานในโครงการซึ่งคุณสามารถประสานงานด้วยได้อย่างง่ายดาย) คุณสามารถบังคับ อัปเดตโดยเรียกใช้:
git push -f
หรือ
git push origin +master
สิ่งเหล่านี้จะเพิกเฉยต่อการตรวจสอบการพุชที่ไม่ใช่การกรอไปข้างหน้าและอัปเดตสิ่งที่อยู่บนเซิร์ฟเวอร์เป็นการแก้ไข A ใหม่ของคุณโดยละทิ้งการแก้ไข A ดังนั้นในที่สุดก็จะถูกรวบรวมเป็นขยะ
เป็นไปได้ว่าการบังคับผลักถูกปิดใช้งานทั้งหมดด้วยreceive.denyNonFastForwards
ตัวเลือกการกำหนดค่า ตัวเลือกนี้เปิดใช้งานโดยค่าเริ่มต้นบนที่เก็บที่ใช้ร่วมกัน ในกรณีที่ว่าถ้าคุณจริงๆ, git push origin :master; git push origin master:master
ต้องการบังคับให้กดเลือกที่ดีที่สุดคือการลบสาขาและสร้างใหม่อีกครั้งได้ด้วย อย่างไรก็ตามdenyNonFastForwards
ตัวเลือกนี้เปิดใช้งานด้วยเหตุผลซึ่งได้อธิบายไว้ข้างต้น บนที่เก็บที่ใช้ร่วมกันนั่นหมายความว่าตอนนี้ทุกคนที่ใช้มันจำเป็นต้องตรวจสอบให้แน่ใจว่าพวกเขาสร้างฐานข้อมูลใหม่ในประวัติใหม่
ในพื้นที่เก็บข้อมูลที่ใช้ร่วมกันโดยทั่วไปแล้วจะดีกว่าเพียงแค่ผลักดันคอมมิตใหม่ที่ด้านบนเพื่อแก้ไขปัญหาที่คุณมี คุณสามารถใช้git revert
เพื่อสร้างคอมมิตที่จะยกเลิกการเปลี่ยนแปลงของคอมมิตก่อนหน้านี้