เมื่อมีการเปลี่ยนแปลงที่กระทำโดยใช้commit
แล้วเปลี่ยนกลับมาใช้revert
วิธีที่ดีที่สุดในการยกเลิกการเปลี่ยนกลับเป็นอย่างไร
เป็นการดีที่ควรทำสิ่งนี้ด้วยความมุ่งมั่นใหม่เพื่อไม่ให้เขียนประวัติศาสตร์อีกครั้ง
เมื่อมีการเปลี่ยนแปลงที่กระทำโดยใช้commit
แล้วเปลี่ยนกลับมาใช้revert
วิธีที่ดีที่สุดในการยกเลิกการเปลี่ยนกลับเป็นอย่างไร
เป็นการดีที่ควรทำสิ่งนี้ด้วยความมุ่งมั่นใหม่เพื่อไม่ให้เขียนประวัติศาสตร์อีกครั้ง
คำตอบ:
หากคุณยังไม่ได้ผลักดันให้มีการเปลี่ยนแปลง git reset --hard HEAD^
มิฉะนั้นการคืนค่าการแปลงกลับจะสมบูรณ์แบบ
อีกวิธีหนึ่งคือการแล้วgit checkout HEAD^^ -- .
git add -A && git commit
git cherry-pick
หรืออีกวิธีหนึ่งgit revert
เป็นวิธีที่ตรงไปตรงมาที่สุดในการเปลี่ยนคืน
Otherwise, reverting the revert is perfectly fine.
แล้วก็อธิบายสิ่งที่git checkout HEAD^^ -- .
กำลังทำอยู่ด้วย
git add -A
... เว้นแต่คุณจะต้องการเพิ่มทุกไฟล์ลงในการควบคุมเวอร์ชันซึ่งน่าจะไม่ใช่สิ่งที่คุณต้องการ
git cherry-pick <original commit sha>
จะทำสำเนาของการส่งต้นฉบับโดยการใช้การส่งมอบซ้ำ
การคืนค่าการเปลี่ยนกลับจะทำสิ่งเดียวกันโดยมีข้อความส่งเมสสิเยอร์:
git revert <commit sha of the revert>
วิธีใดวิธีหนึ่งเหล่านี้จะช่วยให้คุณgit push
ไม่ต้องเขียนทับประวัติเพราะมันจะสร้างความมุ่งมั่นใหม่หลังจากเปลี่ยนกลับ
เมื่อพิมพ์คำสั่ง sha คุณจะต้องใช้อักขระ 5 หรือ 6 ตัวแรกเท่านั้น:
git cherry-pick 6bfabc
การย้อนกลับกระทำเหมือนกับการคอมมิทอื่น ๆ ในคอมไพล์ ความหมายคุณสามารถเปลี่ยนกลับได้เช่นเดียวกับใน:
git revert 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746
เห็นได้ชัดว่าเหมาะสมเมื่อการเปลี่ยนแปลงถูกผลักและโดยเฉพาะอย่างยิ่งเมื่อคุณไม่สามารถบังคับให้กดสาขาปลายทาง (ซึ่งเป็นความคิดที่ดีสำหรับสาขาหลักของคุณ) หากการเปลี่ยนแปลงนั้นไม่ได้ถูกผลักดันให้เลือกใช้เชอร์รี่เลือกเปลี่ยนกลับหรือเพียงแค่ลบการคืนค่าที่กระทำตามโพสต์อื่น ๆ
ในทีมของเราเรามีกฎที่จะใช้การย้อนกลับใน Revert การกระทำที่มุ่งมั่นในสาขาหลักเพื่อรักษาความสะอาดของประวัติเป็นหลัก
7963f4b2a9d Revert "Revert "OD-9033 parallel reporting configuration"
"This reverts commit a0e5e86d3b66cf206ae98a9c989f649eeba7965f.
...
a0e5e86d3b6 Revert "OD-9055 paralel reporting configuration"
This reverts commit 648d7d808bc1bca6dbf72d93bf3da7c65a9bd746.
...
Merge pull request parallel_reporting_dbs to master* commit
'648d7d808bc1bca6dbf72d93bf3da7c65a9bd746'
ด้วยวิธีนี้คุณสามารถติดตามประวัติศาสตร์และค้นหาเรื่องราวทั้งหมดและแม้แต่ผู้ที่ไม่มีความรู้เกี่ยวกับมรดกก็สามารถทำงานได้ด้วยตนเอง ในขณะที่ถ้าคุณเชอร์รี่รับหรือrebaseสิ่งที่ข้อมูลที่มีค่านี้จะหายไป (เว้นแต่คุณจะรวมไว้ในความคิดเห็น)
เห็นได้ชัดว่าหากกระทำความผิดย้อนกลับและย้อนกลับมากกว่าหนึ่งครั้งที่ค่อนข้างยุ่ง
การคืนค่าการเปลี่ยนกลับจะทำเคล็ดลับ
ตัวอย่างเช่น,
หากการabcdef
กระทำของคุณเป็นและghijkl
การกระทำที่คุณมีเมื่อคุณย้อนกลับการกระทำabcdef
นั้นให้เรียกใช้:
git revert ghijkl
สิ่งนี้จะเปลี่ยนกลับ
มันดูโง่สำหรับฉัน แต่ฉันเคยอยู่ในสถานการณ์เดียวกันและฉันกลับไปใช้เพื่อคืนค่าคอมมิชชัน ฉันเปลี่ยนตัวเลขเป็นจำนวนมากดังนั้นฉันจึงต้องเปลี่ยนกลับสำหรับ 'เปลี่ยนกลับ' ทุกครั้ง
ตอนนี้ประวัติการกระทำของฉันดูแปลก ๆ
มันเป็นโครงการสัตว์เลี้ยงดังนั้นมันก็โอเค แต่สำหรับโครงการในชีวิตจริงฉันจะให้ความพึงพอใจที่จะไปกระทำครั้งสุดท้ายก่อนที่จะหวนคืนค่ารหัสที่กลับคืนทั้งหมดด้วยกันในการคอมมิทครั้งเดียวและความคิดเห็นที่สมเหตุสมผลกว่า
นี่เป็นวิธีที่ฉันทำ:
ถ้าสาขาmy_branchname
รวมอยู่ในการผสานที่เปลี่ยนกลับ และฉันต้องการยกเลิกmy_branchname
:
ครั้งแรกที่ผมทำจากgit checkout -b my_new_branchname
จากนั้นฉันก็ทำที่ที่แฮชการกระทำถูกต้องก่อนที่จะคอมมิชชันแรก(ดู)
จากนั้นฉันจะสร้างคอมมิทใหม่
จากนั้นฉันก็ดันสาขาใหม่ขึ้นมา
จากนั้นฉันก็ดึงคำขอสำหรับสาขาใหม่my_branchname
git reset --soft $COMMIT_HASH
$COMMIT_HASH
my_branchname
git log
git commit -m "Add back reverted changes"
git push origin new_branchname
หรือคุณสามารถgit checkout -b <new-branch>
และgit cherry-pick <commit>
ก่อนที่จะและgit rebase
จะลดลงrevert
กระทำ ส่งคำขอการดึงเหมือนก่อน
ถ้าคุณไม่ชอบความคิดของ "ย้อนกลับย้อนกลับเป็น" (โดยเฉพาะเมื่อที่หมายถึงการสูญเสียข้อมูลประวัติกระทำอีกหลายคน) คุณก็สามารถมุ่งหน้าไปยังเอกสารคอมไพล์เกี่ยวกับ"การย้อนกลับผสานความผิดพลาด"
รับสถานการณ์เริ่มต้นดังต่อไปนี้
P---o---o---M---x---x---W---x
\ /
A---B---C----------------D---E <-- fixed-up topic branch
(W คือการย้อนกลับครั้งแรกของคุณในการผสาน M; D และ E เป็นการแก้ไขสาขาย่อยที่เริ่มต้นของคุณ / กระทำ)
ตอนนี้คุณสามารถเล่นซ้ำกระทำ A ถึง E เพื่อไม่ให้พวกเขา "เป็น" เพื่อผสานรวมกลับ:
$ git checkout E
$ git rebase --no-ff P
สำเนาใหม่ของสาขาของคุณสามารถรวมกันได้master
อีกครั้ง:
A'---B'---C'------------D'---E' <-- recreated topic branch
/
P---o---o---M---x---x---W---x
\ /
A---B---C----------------D---E
หากต้องการเรียกคืนการเปลี่ยนแปลงที่ไม่มีการจัดฉากและเป็นระยะซึ่งย้อนกลับหลังจากคอมมิชชัน:
git reset HEAD@{1}
ในการกู้คืนการลบที่ไม่ได้รับการจัดการทั้งหมด:
git ls-files -d | xargs git checkout --