ลบคอมมิทคอมมิทที่ยังไม่ได้กด


722

ฉันทำแล้วgit commitแต่ยังไม่ได้ผลักไปยังที่เก็บ ดังนั้นเมื่อฉันทำgit statusฉันจะได้ '# สาขาของคุณอยู่ก่อนหน้า' master 'โดย 1 กระทำ

ดังนั้นถ้าฉันต้องการย้อนกลับการกระทำสูงสุดของฉันฉันจะทำ:

git reset --hard eb27bf26dd18c5a34e0e82b929e0d74cfcaab316

เมื่อฉันฉันจะgit logได้รับ:

กระทำ eb27bf26dd18c5a34e0e82b929e0d74cfcaab316
วันที่: อังคาร 29 กันยายน 11:21:41 2009 -0700


กระทำ db0c078d5286b837532ff5e276dcf91885df2296
วันที่: อ. 22 ก.ย. 10:31:37 น. -0700

9
คำถามนี้ดูเหมือนจะเป็นซ้ำอีกอย่างหนึ่งของคำถามของคุณเอง: stackoverflow.com/questions/1338728/how-to-delete-a-git-commit
ไบรอันแคมป์เบล


1
เป็นไปได้ที่ซ้ำกันของวิธีการเลิกคอมมิทล่าสุดใน Git?
Jan Zerebecki

3
อันตราย: reset --hardอาจส่งผลให้สูญเสียงานเนื่องจากการทำเช่นนั้นส่งผลให้เขียนทับไฟล์ท้องถิ่นของคุณ (งานใหม่ของคุณ) กับไฟล์จากเว็บ (เกิดขึ้นกับฉัน) คำถามและคำตอบเกี่ยวกับคอมไพล์ควรระบุอย่างชัดเจนว่าคำสั่งของพวกเขากำลังทำอะไรและมีความเสี่ยงอะไรบ้างสำหรับผู้อ่านที่ติดตาม
OrangeSherbet

คำตอบ:


673

อันที่จริงเมื่อคุณใช้git resetคุณควรดูที่การกระทำที่คุณกำลังรีเซ็ตไป ; ดังนั้นคุณอาจต้องการความdb0c078มุ่งมั่น

รุ่นที่ง่ายกว่าgit reset --hard HEAD^คือการรีเซ็ตการกระทำก่อนหน้าก่อนที่จะมุ่งหน้าไปในปัจจุบัน ด้วยวิธีนี้คุณไม่จำเป็นต้องคัดลอกรหัสยืนยัน

ระวังเมื่อคุณทำเช่นgit reset --hardนี้เพราะคุณอาจสูญเสียการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดใด ๆ ที่คุณมี คุณอาจต้องการตรวจสอบgit statusเพื่อให้แน่ใจว่าสำเนาการทำงานของคุณสะอาดหรือคุณต้องการยกเลิกการเปลี่ยนแปลงใด ๆ ที่มีอยู่

นอกจากนี้แทนที่จะเป็น HEAD คุณสามารถใช้origin/masterเป็นข้อมูลอ้างอิงตามที่ @bdonlan แนะนำในความคิดเห็น:git reset --hard origin/master


374
หรือgit reset --hard origin/masterเพื่อรีเซ็ตเป็นค่าเริ่มต้น
bdonlan

1
ตัวชี้ที่มีประโยชน์อื่นที่คุณสามารถรีเซ็ตเป็น ORIG_HEAD หรือการใช้งานทั่วไปโดยใช้ reflog HEAD @ {1} (ตำแหน่งสุดท้ายของ HEAD)
Jakub Narębski

12
อ่านก่อนที่คุณจะgit resetรหัสของคุณ ทำสิ่งที่คุณโปรดปรานในอนาคต: ความแตกต่างระหว่างreset, reset --softและ, reset --hard(เกิดอะไรขึ้นกับgit add"การทำงานของคุณ" ก่อนหน้านี้:) รูปภาพ: ลิงค์
user18099

3
โปรดทราบว่าการดำเนินการนี้จะลบสิ่งที่อยู่ในการส่งที่คุณต้องการลบออก (ดังนั้นgit statusจะไม่มีการเปลี่ยนแปลงและการคอมมิชชันจะถูกลบ / การเปลี่ยนแปลงสูญหาย)
BjørnBørresen

12
หมายเหตุ: ระวังเมื่อใช้git reset --hard HEAD^เนื่องจากคุณจะสูญเสียการเปลี่ยนแปลงในไฟล์ที่ถูกคอมมิท (การเปลี่ยนแปลงของคุณจะถูกลบ) คำถามนี้มีสองสาขา: หากต้องการยกเลิกการส่งมอบ แต่ยังคงมีการเปลี่ยนแปลงบนดิสก์อยู่git reset --soft HEAD~1
papigee

625

หากคุณยังไม่ได้ผลักดันการเปลี่ยนแปลงของคุณเป็นระยะไกล

git reset HEAD~1

ตรวจสอบว่าสำเนาการทำงานสะอาดgit statusหรือไม่

อื่นคุณได้ผลักดันการเปลี่ยนแปลงของคุณเป็นระยะไกล

git revert HEAD

คำสั่งนี้จะเปลี่ยน / ลบการคอมมิทล่าสุด / การเปลี่ยนแปลงและจากนั้นคุณสามารถผลักดัน


34
คำตอบสำหรับ "ลบคำสั่งคอมไพล์ล่าสุดที่ยังไม่ได้กด" (คำตอบที่ใกล้ที่สุด IMHO)
Pierre de LESPINAY

25
นอกจากนี้ยังช่วยให้การเปลี่ยนแปลงในท้องถิ่นกระทำในการกระทำครั้งสุดท้ายในขณะที่การรีเซ็ต git - ฮาร์ดไม่ได้
Stanimir Stoyanov

1
สำหรับฉันมันจะยกเลิกการผลักดันครั้งล่าสุดและไม่ได้รับการชำระผูกพัน
CodyChan

git revert HEAD สำหรับฉันเพิ่งลบไฟล์ทั้งหมดที่ฉันพร้อมจะผลัก ระวัง!
Jason Bruce

159
git reset --hard origin/master

เพื่อรีเซ็ตเป็นค่าเริ่มต้น

นี้ถูกโพสต์โดย @bdonlan ในการแสดงความคิดเห็น ฉันเพิ่มคำตอบนี้สำหรับผู้ที่ไม่ได้อ่านความคิดเห็น


4
คำถามนี้ถูกถามเกือบ 5 ปีที่แล้วและนี่เป็นหนึ่งในความคิดเห็น
Anubian Noob

1
แล้วถ้าสาขาท้องถิ่นในปัจจุบันแตกต่างจากmaster- ฉันควรใช้origin/mybranchแล้ว
Pavel Vlasov

9
ฉันมักจะไม่อ่านความคิดเห็นเมื่อฉันรีบหาคำตอบ ... ขอบคุณที่วางเป็นคำตอบ (คำตอบง่าย ๆ ที่ใช้ได้)
Leonardo Alves Machado

คำเตือน: โปรดทราบว่าการดำเนินการนี้จะลบการเปลี่ยนแปลงรหัสที่มีอยู่ทั้งหมดของคุณนอกเหนือจากการgit reset HEAD~ตั้งค่าการคอมมิตเป็น
เมเยอร์

69

คำถามนี้มีสองสาขา (การย้อนกลับการกระทำไม่ได้หมายความว่าฉันต้องการสูญเสียการเปลี่ยนแปลงในท้องถิ่นของฉันทั้งหมด):

1.หากต้องการย้อนกลับการกระทำล่าสุดและ ยกเลิกการเปลี่ยนแปลงในไฟล์ที่ทำไว้ให้ทำดังนี้

git reset --hard HEAD~1

2.หากต้องการคืนค่าการส่งล่าสุด แต่เก็บการเปลี่ยนแปลงในเครื่อง (บนดิสก์) ให้ทำดังนี้

git reset --soft HEAD~1

นี้ (คำสั่งในภายหลัง) git addจะนำคุณไปยังรัฐที่คุณจะได้รับหากคุณได้

หากคุณต้องการยกเลิกการติดตั้งไฟล์หลังจากนั้นให้ทำ

git reset

ตอนนี้คุณสามารถทำการเปลี่ยนแปลงเพิ่มเติมก่อนที่จะเพิ่มและจากนั้นกระทำอีกครั้ง


47

เพียงพิมพ์ในคอนโซล:

$ git reset HEAD~

คำสั่งนี้จะละทิ้งการกระทำในท้องถิ่นทั้งหมดก่อนหน้า HEAD ระยะไกล


7
คุณช่วยอธิบายสิ่งที่คำตอบของคุณเพิ่มไปจากคำตอบเดิมได้ไหม
nvoigt

ปัจจุบันนี้จะล้างกระทำก่อนที่จะมีการผลักดัน - ไม่คืนค่าการเปลี่ยนแปลงที่คุณได้ทำในประเทศ - เหมือนคำตอบอื่น ๆ - ซึ่งอาจจะเป็นช่วงเวลาที่ผมพับรุนแรง
แกรนท์

42

ฉันเชื่อว่าหนึ่งในนั้นจะเหมาะกับความต้องการของคุณ

1 - เลิกทำการคอมมิทและเก็บไฟล์ทั้งหมดไว้: git reset --soft HEAD~;

2 - เลิกทำคอมมิชชันและ unstage ไฟล์ทั้งหมด: git reset HEAD~;

3 - เลิกทำการคอมมิทและลบการเปลี่ยนแปลงทั้งหมด: git reset --hard HEAD~;

ฉันพบคำตอบที่นี่


คำตอบนี้จะต้องได้รับการยอมรับ: D
Aaron John Sabu

30

ลบการคอมมิทล่าสุดก่อนกด

git reset --soft HEAD~1

1หมายถึงการกระทำครั้งสุดท้ายหากคุณต้องการลบการใช้งานครั้งสุดท้ายสองครั้ง2และอื่น ๆ *


3
สวัสดี Karina การกล่าวถึง--softเป็นคำตอบที่ดียิ่งสำหรับคำตอบที่เป็นไปได้ แต่คุณสามารถพูดถึงสาเหตุได้หรือไม่ การอธิบายวิธีแก้ปัญหาของคุณมีประโยชน์เสมอ ลองภาษาอังกฤษด้วยกัน ขอบคุณ
Vlastimil Ovčáčík

1
--soft- ตรวจสอบให้แน่ใจว่าคุณไม่สูญเสียการเปลี่ยนแปลงในไฟล์ที่คุณได้พยายามยกเลิก
papigee

19

ฉันเคยประสบกับสถานการณ์เดียวกันที่ฉันทำด้านล่างนี้ง่ายกว่ามาก โดยผ่านcommit-Idคุณสามารถเข้าถึงการกระทำที่คุณต้องการไป:

git reset --hard {commit-id}

ตามที่คุณต้องการลบการส่งครั้งล่าสุดดังนั้นคุณต้องผ่านcommit-Idตำแหน่งที่คุณต้องการย้ายตัวชี้:

git reset --hard db0c078d5286b837532ff5e276dcf91885df2296

เพียงคำเตือนสำหรับมือใหม่อย่างตัวฉัน - สำรองไฟล์ใด ๆ ที่คุณต้องการเก็บการเปลี่ยนแปลงเนื่องจากมันจะถูกเปลี่ยนกลับเป็นเวอร์ชันก่อนหน้า สถานการณ์ของฉันคือฉันตั้งใจใส่ฐานข้อมูลทิ้งในไดเรกทอรี repo ของฉันแล้วมุ่งมั่น - เห็นได้ชัดว่าฉันไม่ต้องการส่งไฟล์เหล่านั้นไปยัง repo แต่ DID ต้องการเก็บการเปลี่ยนแปลงที่ฉันทำกับไฟล์อื่น ดังนั้นฉันจึงต้องคัดลอกและวางการเปลี่ยนแปลงที่จำเป็นจากการสำรองข้อมูลที่ฉันทำก่อนทำการรีเซ็ต git
user1063287

10

นี่คือสิ่งที่ฉันทำ:

ก่อนชำระเงินสาขาของคุณ (สำหรับmasterสาขากรณีของฉัน):

git checkout master

จากนั้นรีเซ็ตเป็น HEAD ระยะไกล ^ ( จะเป็นการลบการเปลี่ยนแปลงในเครื่องทั้งหมดของคุณ ) บังคับให้ทำความสะอาดแล้วดึง:

git reset HEAD^ --hard && git clean -df && git pull

1
มันเป็นตัวเลือกนิวเคลียร์มาก ฉันอยากจะแนะนำให้ซอฟต์รีเซ็ตเป็นคอมมิท จำกัด
c0der512

3

วิธีหนึ่งคือลบสาขาในพื้นที่และชำระเงินที่สาขาจากเซิร์ฟเวอร์หากสาขาในพื้นที่ของคุณอยู่ไกลจากระยะไกลด้วยการกระทำหลายรายการและคุณจำเป็นต้องยกเลิกการเปิดสาขาทั้งหมด


คำตอบที่ยอดเยี่ยม - มันช่วยให้คลิกได้ง่าย ๆ ใน sourcetree :)
Kamil Kiełczewski

1

ฉันเพิ่งมีปัญหาเดียวกันและลงเอยด้วยการทำ:

git rebase -i HEAD~N

(N คือจำนวนคอมมิทคอมที่จะแสดงให้คุณเห็น)

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

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