ฉันจะยกเลิก 'คอมไพล์คอมมิชชัน' ได้อย่างไรในพื้นที่และบนรีโมตหลังจาก "git push"


242

ผมได้ดำเนินการตามมาด้วยgit commit git pushฉันจะเปลี่ยนการเปลี่ยนแปลงนั้นทั้งที่เก็บข้อมูลภายในและระยะไกลได้อย่างไร

$ git log
commit 364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8
Author: Michael Silver <Michael Silver@gmail.com>
Date:   Tue Jun 11 12:24:23 2011 -0700

คำตอบ:


400
git reset --hard HEAD~1
git push -f <remote> <branch>

(ตัวอย่างผลักดัน: git push -f origin bugfix/bug123)

นี่จะเป็นการยกเลิกการคอมมิทล่าสุดและผลักดันประวัติที่อัปเดตไปยังรีโมต คุณต้องผ่าน-fเพราะคุณกำลังแทนที่ประวัติต้นน้ำในระยะไกล


24
git reset --hard <the-sha-you-want-to-return-to>อีกวิธีหนึ่งคือการใช้งาน
Alexander Groß

2
การอ้างอิงนี้เรียกว่า HEAD (ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่)
dunni

26
นอกจากนี้ควรระวัง - AFAIK คุณไม่ควรทำเช่นนี้หากคนอื่นดึงจาก repo
Amadan

1
@BipinVayalu มันมีผลกับสาขาที่คุณเปิดอยู่ แม่นยำยิ่งขึ้น HEAD HEAD ส่วนใหญ่มักจะ "แนบ" กับสาขา (ชี้ไปที่ชื่อสาขาแทนที่จะชี้ไปที่การส่งโดยตรง) ดังนั้นโดยทั่วไปแล้วจะส่งผลกระทบต่อคะแนน HEAD ของสาขา ใช้git log --decorate --onelineเพื่อค้นหาตำแหน่งที่หัวของคุณชี้ไป
Alexander Groß

4
git reset HEAD~1หากคุณไม่ต้องการให้การเปลี่ยนแปลงของคุณหายไป (การเปลี่ยนแปลงแบบไม่จัดเตรียม) เปลี่ยนกระทำและผลักดันอีกครั้งgit push -f [origin] [branch]
softvar

161

โดยทั่วไปให้คอมมิชชัน "inverse" โดยใช้:

git revert 364705c

จากนั้นส่งไปยังรีโมทตามปกติ:

git push

สิ่งนี้จะไม่ลบการคอมมิชชัน: มันจะทำการคอมมิทเพิ่มเติมที่จะยกเลิกการกระทำใด ๆ ที่คอมมิชชันแรกทำ สิ่งอื่น ๆ ไม่ปลอดภัยโดยเฉพาะอย่างยิ่งเมื่อการเปลี่ยนแปลงได้รับการเผยแพร่แล้ว


9
นี่เป็นคำตอบที่ปลอดภัยกว่า (น่าจะดีกว่า) กว่าคำตอบของ Alexander Groß (คำตอบที่เลือก)
Graeck

6
@ Graeck โซลูชั่นทุกตัวมีความหมายและข้อดีของมัน
Alexander Groß

5
นี่ควรเป็นคำตอบที่ได้รับการยอมรับมันเป็นแนวปฏิบัติที่ดีที่สุดที่จะไม่เขียนทับประวัติแม้ว่าจะร่วมมือกับทีม git resetได้รับการยอมรับเฉพาะในกรณีที่คุณยังไม่ได้ผลักดันการเปลี่ยนแปลงไปยังเซิร์ฟเวอร์
Josue Alexander Ibarra

17
@JosueIbarra ฉันไม่เห็นด้วยกับทุกกรณี สำหรับกรณีส่วนใหญ่ใช่คุณไม่ควรเขียนทับประวัติ อย่างไรก็ตามฉันเชื่อว่ามีหลายกรณีที่คุณควรทำอย่างถูกกฎหมาย ตัวอย่างเช่นคุณตั้งใจส่งไฟล์ความลับของคุณโดยไม่ตั้งใจ ที่ไม่ควรขึ้นใน repo คอมไพล์ ดังนั้นคุณสามารถลบออกได้อย่างรวดเร็วโดยใช้คำตอบที่ยอมรับได้ที่นี่
bfcoder

11
@bfcoder หากคุณผลัก "ความลับ" ไปที่ repo ระยะไกลมันจะไม่เป็นความลับอีกต่อไป และการแก้ไขที่เหมาะสมคือการสร้างความลับใหม่ไม่พยายามซ่อนความผิดของคุณ
erbsman

41

ก่อนอื่นผ่อนคลาย

"ไม่มีอะไรอยู่ภายใต้การควบคุมของเราการควบคุมของเราเป็นเพียงภาพลวงตา", "ความผิดพลาดคือมนุษย์"

remote-masterฉันได้รับที่คุณได้ผลักดันให้รหัสของคุณโดยไม่ได้ตั้งใจ มันจะไม่เป็นไร

1.ในตอนแรกรับSHA-1ค่าของการส่งข้อมูลที่คุณพยายามส่งคืนเช่นส่งไปยังสาขาหลัก รันสิ่งนี้:

git log

คุณจะเห็นกลุ่มของ 'f650a9e398ad9ca606b25513bd4af9fe ... ' เช่นเดียวกับสตริงพร้อมกับแต่ละคอมมิท คัดลอกตัวเลขที่มาจากการกระทำที่คุณต้องการที่จะกลับมา

2.ตอนนี้พิมพ์คำสั่งด้านล่าง:

git reset --hard your_that_copied_string_but_without_quote_mark

คุณควรเห็นข้อความเช่น "HEAD is now at" คุณชัดเจน สิ่งที่เพิ่งทำไปคือการสะท้อนถึงการเปลี่ยนแปลงในพื้นที่

3.ตอนนี้พิมพ์คำสั่งด้านล่าง:

git push -f

คุณควรเห็นเช่น

"คำเตือน: push.default ไม่ได้ตั้งค่าโดยปริยายมีการเปลี่ยนแปลงใน ..... ... ทั้งหมด 0 (เดลต้า 0), นำมาใช้ใหม่ 0 (เดลต้า 0) ... ... your_branch_name -> ต้นแบบ (การอัปเดตที่บังคับ) ."

ตอนนี้คุณทุกคนชัดเจน ตรวจสอบต้นแบบด้วย "git log" อีกครั้ง fixed_destination_commit ของคุณควรอยู่ด้านบนของรายการ

ยินดีต้อนรับคุณ (ล่วงหน้า;)

UPDATE:

ตอนนี้การเปลี่ยนแปลงที่คุณทำก่อนที่จะเริ่มต้นทั้งหมดเหล่านี้หายไป หากคุณต้องการนำงานหนักเหล่านั้นกลับมาอีกครั้งเป็นไปได้ ขอบคุณgit reflogและคำสั่งgit cherry-pick

เพื่อที่ฉันจะแนะนำให้โปรดติดตามบล็อกนี้หรือโพสต์นี้


มันเป็นตัวชี้วัดที่ดีที่จะระบุระยะไกลและสาขาเกินไปเมื่อทำ "-f ผลักดันคอมไพล์" แต่ "ดันคอมไพล์ -f" จะทำงานอยู่แล้วส่วนใหญ่ของเวลา
ร็อบสัน

8

git reset HEAD~1หากคุณไม่ต้องการให้การเปลี่ยนแปลงของคุณหายไป (การเปลี่ยนแปลงแบบไม่จัดเตรียม) เปลี่ยนกระทำและผลักดันอีกครั้งgit push -f [origin] [branch]


3

คุณสามารถทำการปฏิเสธแบบโต้ตอบ:

git rebase -i <commit>

สิ่งนี้จะแสดงตัวแก้ไขเริ่มต้นของคุณ เพียงลบบรรทัดที่มีคอมมิตที่คุณต้องการลบเพื่อลบคอมมิทนั้น

แน่นอนคุณจะต้องเข้าถึงที่เก็บข้อมูลระยะไกลเพื่อใช้การเปลี่ยนแปลงนี้ที่นั่นด้วย

ดูคำถามนี้: Git: ลบการกระทำที่เลือกไว้จากที่เก็บ


3

ลองใช้

git reset --hard <commit id> 

โปรดทราบ: นี่คือรหัสการกระทำจะเป็นรหัสการกระทำที่คุณต้องการไป แต่ไม่ใช่รหัสที่คุณต้องการรีเซ็ต นี่เป็นจุดเดียวที่ฉันยังติดอยู่

จากนั้นกด

git push -f <remote> <branch>

2

อีกวิธีหนึ่งคือ:

git push origin +364705c23011b0fc6a7ca2d80c86cef4a7c4db7ac8^:master

บังคับให้สาขาหลักของที่เก็บรีโมตต้นทางไปที่พาเรนต์ของการส่งครั้งล่าสุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.