วิธียกเลิกคอมมิทท้องถิ่น


744

ปัญหาของฉันคือฉันได้เปลี่ยนไฟล์เช่น: README เพิ่มบรรทัดใหม่ ' นี่สำหรับบรรทัดทดสอบของฉัน ' และบันทึกไฟล์จากนั้นฉันออกคำสั่งต่อไปนี้

 git status

 # On branch master
 # Changed but not updated:
 #   (use "git add <file>..." to update what will be committed)
 #   (use "git checkout -- <file>..." to discard changes in working directory)
 #
 #  modified:   README
 #
 no changes added to commit (use "git add" and/or "git commit -a")


 git add README

 git commit -a -m 'To add new line to readme'

ฉันไม่ได้กดรหัสเพื่อ gitHub ตอนนี้ฉันต้องการที่จะยกเลิกการกระทำนี้

สำหรับสิ่งนี้ฉันใช้

   git reset --hard HEAD~1

แต่ฉันได้สูญเสียบรรทัดที่เพิ่มใหม่ ' นี่สำหรับสายการทดสอบของฉัน ' จากไฟล์ README สิ่งนี้ไม่ควรเกิดขึ้น ฉันต้องการเนื้อหาที่จะอยู่ที่นั่น มีวิธีในการเก็บรักษาเนื้อหาและยกเลิกข้อผูกพันในท้องถิ่นของฉันหรือไม่


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

1
หมายเหตุ: อาจจะมีมูลค่าการกล่าวขวัญว่าgit-commitสามารถยกเลิกถ้าคุณปล่อยให้ว่างเปล่าข้อความดังนั้นหากคุณไม่ได้จริงเสร็จสิ้นการกระทำที่อาจจะเป็นประโยชน์
GKFX

คำตอบ:


1421

เพียงใช้git resetโดยไม่--hardตั้งค่าสถานะ:

git reset HEAD~1

PS: บนระบบยูนิกซ์ตามที่คุณสามารถใช้ซึ่งเท่ากับHEAD^ HEAD~1บน Windows HEAD^จะไม่ทำงานเพราะ^ส่งสัญญาณความต่อเนื่องของบรรทัด More?ดังนั้นพร้อมรับคำสั่งของคุณเพียงแค่จะขอให้คุณ


13
โดยวิธีการนี้เรียกว่าในคู่มือ--mixed
Josh Lee

10
รุ่นใหม่ของ Git แม้แต่ให้เป็นชวเลขเป็น@^ HEAD^
Koraktor

ฉันไม่รู้ว่าสิ่งนี้ทำอะไร แต่มีไฟล์จำนวนมากปรากฏอยู่ในรายการการเปลี่ยนแปลงของฉันไฟล์ที่ฉันไม่ได้สัมผัส
FRR

@feresr หากคุณไม่ได้สัมผัสไฟล์เหล่านั้นในการส่งครั้งล่าสุดหรือในแผนผังการทำงานซึ่งเกิดจากความไม่สอดคล้องกันอื่น ๆ ในแผนผังการทำงานของคุณเช่นคุณอยู่บน Windows และการสิ้นสุดไฟล์ไม่ตรงกัน
Koraktor

1
เป็นไปได้ไหมที่จะรีเซ็ตการกระทำทั้งหมดด้วยมือเดียว?
Webwoman

185

ใช้--softแทนการ--hardตั้งค่าสถานะ:

git reset --soft HEAD^

18
คุณอธิบายความแตกต่างระหว่าง 2 ธงได้ไหม
John Giotta

1
หากคุณเปิด Package Manager Console และเรียกใช้ "git reset - soft HEAD ^" สิ่งนี้จะเป็นสิ่งที่คุณต้องการ (และสิ่งที่ฉันต้องการ)
David Cornelson

54
@JohnGiotta - git reset --soft HEAD^จะลบการกระทำครั้งสุดท้ายในท้องถิ่น (ไม่ได้รับการชำระ) แต่จะทำให้การเปลี่ยนแปลงที่คุณทำอยู่นั้นมีอยู่
เดอร์

@fider Saviour! ไม่แน่ใจว่าคำตอบที่ได้รับการยอมรับยังคงใช้งานได้หรือไม่ แต่นี่ควรเป็นคำตอบที่ถูกต้องที่ OP ต้องการ
Babu

git reset --soft HEAD~บน windows
Jack0fshad0ws

34

ถ้าคุณอยู่ในช่วงกลางของการกระทำ (เช่นในการแก้ไขของคุณแล้ว) #คุณสามารถยกเลิกได้โดยการลบทุกบรรทัดข้างต้นแรก ที่จะยกเลิกการกระทำ

ดังนั้นคุณสามารถลบบรรทัดทั้งหมดเพื่อให้ข้อความคอมมิชชันว่างเปล่าจากนั้นบันทึกไฟล์:

ควรมีลักษณะเช่นนี้

Aborting commit due to empty commit message.แล้วคุณจะได้รับข้อความว่า

แก้ไข :

คุณสามารถลบบรรทัดทั้งหมดและผลลัพธ์จะเหมือนกันทุกประการ

หากต้องการลบบรรทัดทั้งหมดในกลุ่ม (หากนั่นคือตัวแก้ไขเริ่มต้นของคุณ) เมื่อคุณอยู่ในตัวแก้ไขให้พิมพ์ggเพื่อไปที่บรรทัดแรกจากนั้นdGลบบรรทัดทั้งหมด สุดท้ายเขียนและออกจากไฟล์ด้วยwqและการกระทำของคุณจะถูกยกเลิก


3
นี่คือว่าสิ่งที่ฉันกำลังมองหา! คำตอบนี้ต้อง upvotes มากขึ้น :)
jdunk

หากคุณพยายามยกเลิก arebase -i mybranchname
inostia

18

สิ่งแรกที่คุณควรทำคือตรวจสอบว่าคุณต้องการเก็บการเปลี่ยนแปลงในเครื่องก่อนที่จะลบข้อความการส่งข้อความหรือไม่

ใช้git logเพื่อแสดงข้อความการส่งปัจจุบันจากนั้นค้นหาการกระทำcommit_id ก่อนหน้าที่คุณต้องการลบไม่ใช่การส่งข้อความที่คุณต้องการลบ

หากคุณต้องการเก็บไฟล์ที่มีการเปลี่ยนแปลงไว้ภายในเครื่องและเพียงแค่ลบข้อความส่งมอบ:

git reset --soft commit_id

หากคุณต้องการลบไฟล์ที่มีการเปลี่ยนแปลงในเครื่องและข้อความยืนยัน

git reset --hard commit_id

นั่นคือความแตกต่างของความนุ่มและแข็ง


1
ฉันคิดว่ามันตรงกันข้าม
Ruff9

9

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

--soft: เฉพาะการคอมมิทจะถูกลบในขณะที่ดัชนีและไดเร็กตอรี่การทำงานจะไม่เปลี่ยนแปลง

--mixed: นี่จะเป็นการรีเซ็ตดัชนีให้ตรงกับส่วนหัวในขณะที่ไดเรกทอรีการทำงานจะไม่ถูกแตะต้อง การเปลี่ยนแปลงทั้งหมดจะยังคงอยู่ในไดเรกทอรีทำงานและปรากฏว่ามีการแก้ไข

--hard: มันรีเซ็ตทุกอย่าง (คอมมิท, ดัชนี, ไดเร็คทอรี่ทำงาน) เพื่อให้ตรงกับ HEAD

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


1

ใช้คำสั่งด้านล่าง:

$ git reset HEAD~1

หลังจากนี้คุณยังสามารถดูไฟล์ที่กลับมาเหมือนด้านล่างการตอบสนอง

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