จะยกเลิก 'git reset' ได้อย่างไร


1312

เป็นวิธีที่ง่ายที่สุดในการเลิกทำ

git reset HEAD~

คำสั่ง? ปัจจุบันวิธีเดียวที่ฉันคิดได้คือทำ "git clone http: // ... " จาก repo ระยะไกล


2
หากใครที่กำลังมองหาวิธีการที่จะยกเลิกการฮาร์ดรีเซ็ตเช็คอินยกเลิกคอมไพล์รีเซ็ตหัว --hard ~ 1 การแก้ปัญหาคล้ายกันมาก


2
มันไม่ใช่คำถามที่เกี่ยวข้องกับซ้ำซ้อน--hard! ความเสี่ยงของการรันคำสั่งนี้โดยไม่ตั้งใจนั้นสูงกว่ามาก ตัวอย่างเช่นคุณต้องการที่จะ unstage git reset foo-fileไฟล์เดียวกับ คุณเขียนเฉพาะส่วนแรกของชื่อไฟล์แท็บการเข้าชมสำหรับการเติมข้อความอัตโนมัติจริง ๆ แล้วจะเสร็จสมบูรณ์เป็นชื่อสาขาคุณไม่สังเกตเห็นและเรียกใช้คำสั่งgit reset foo-branchแทน Voilà
Yushin Washio

คำตอบ:


2388

คำตอบสั้น ๆ :

git reset 'HEAD@{1}'

คำตอบยาว:

Git เก็บบันทึกการอัปเดตการอ้างอิงทั้งหมด (เช่นเช็คเอาต์รีเซ็ตกระทำส่งผสาน) คุณสามารถดูได้โดยพิมพ์:

git reflog

ที่ไหนสักแห่งในรายการนี้คือความมุ่งมั่นที่คุณสูญเสีย สมมติว่าคุณเพิ่งพิมพ์git reset HEAD~และต้องการยกเลิก reflog ของฉันดูเหมือนว่านี้:

$ git reflog
3f6db14 HEAD@{0}: HEAD~: updating HEAD
d27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c
[...]

บรรทัดแรกบอกว่าHEAD0 ตำแหน่งที่ผ่านมา (ในคำอื่น ๆ ตำแหน่งปัจจุบัน) คือ 3f6db14; HEAD~มันได้โดยการตั้งค่าไป บรรทัดที่สองบอกว่าHEAD1 ตำแหน่งที่ผ่านมา (ในคำอื่น ๆ สถานะก่อนการรีเซ็ต) คือ d27924e มันได้มาจากการตรวจสอบการกระทำเฉพาะ (แม้ว่ามันจะไม่สำคัญในตอนนี้) ดังนั้นหากต้องการยกเลิกการรีเซ็ตให้เรียกใช้git reset HEAD@{1}(หรือgit reset d27924e)

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

หมายเหตุสุดท้ายสุดท้าย: การดูที่reflogสาขาเฉพาะที่คุณต้องการยกเลิกการรีเซ็ตให้พูดเจ้านายเป็นเรื่องง่ายกว่าHEAD:

$ git reflog show master
c24138b master@{0}: merge origin/master: Fast-forward
90a2bf9 master@{1}: merge origin/master: Fast-forward
[...]

HEAD reflogนี้ควรมีน้อยเสียงในกว่าทั่วไป


25
เป็นทางเลือกที่ภาพมากขึ้นและดีกว่าที่จะเพื่อจุดประสงค์นี้ผมชอบที่จะใช้reflog git log --graph --decorate --oneline $(git rev-list -g --all)มันแสดงให้เห็นถึงต้นไม้แห่งความมุ่งมั่นทั้งหมดรวมถึงกิ่งที่ไม่มีชื่อห้อย
texasflood

1
ให้บอกว่าฉันมีไดเรกทอรีที่มีไฟล์อยู่ในนั้น ในไดเรกทอรีนี้ผมทำงานแล้วขวาหลังจากที่git init git reset --hardไม่มีการอ้างอิงหรือแม้แต่บันทึกใด ๆ ที่จะเริ่มต้นด้วย ไฟล์เหล่านี้สวยมากตอนนี้หรือไม่?
AlanSE

@ AlanSE น่าเสียดายที่ไฟล์เหล่านั้นเป็นขนมปังปิ้งเท่าที่ฉันรู้ หากคุณไม่เคยทำgit add(เช่นไม่เคยจัดทำไฟล์เวอร์ชันนั้นไว้) git checkoutหรือgit reset --hardจะลบเฉพาะสำเนา (ไดเรกทอรีทำงาน) ที่ไม่มีการสำรองข้อมูล ฉันหวังว่ามันจะไม่
Mark Lodato

2
git reset HEAD~12อ๊ะ ... git reset HEAD@{12}nooo .. 'git reflog' เพื่อช่วยเหลือ! โอ้มันเป็นเพียงgit reset HEAD@{1}
เดนนิส

หลังจากอ่านgit-scm.com/blog/2011/07/11/reset.htmlบทความ git-reset ที่ยอดเยี่ยมฉันก็ประหลาดใจน้อยลง
Andriy Drozdyuk

192

คำถามเก่าและคำตอบที่โพสต์ทำได้ดีมาก ฉันจะพูดสอดกับตัวเลือกอื่นแม้ว่า

git reset ORIG_HEAD

ORIG_HEADอ้างอิงการกระทำที่HEADอ้างถึงก่อนหน้านี้


1
สิ่งนี้ดูดีมาก - คุณจะสามารถอธิบายรายละเอียดได้หรือไม่ "ORIG" ที่นี่ย่อมาจาก "original" หรือ "Origin" หรือไม่? …ใช่มันถูกรีเซ็ตเป็นตำแหน่งที่ HEAD เคยเป็นก่อนที่จะเริ่มเล่นกับลิงหรือไม่ หรือหัวกำเนิดอยู่ที่ใด? จะเกิดอะไรขึ้นถ้าคุณย้ายหัวหลายต่อหลายครั้งก่อนgit reset ORIG_HEAD? ขอบคุณ
Benjohn

ORIG ย่อมาจาก ORIG_HEAD หมายถึง HEAD ดั้งเดิมก่อนการรีเซ็ต
Sam Gallagher

"การดำเนินการบางอย่างเช่นการผสานและการรีเซ็ตบันทึก HEAD รุ่นก่อนหน้าใน ORIG_HEAD ก่อนที่จะปรับเป็นค่าใหม่คุณสามารถใช้ ORIG_HEAD เพื่อกู้คืนหรือเปลี่ยนกลับสู่สถานะก่อนหน้าหรือทำการเปรียบเทียบ" ข้อความที่ตัดตอนมาจากหนังสือ: "การควบคุมเวอร์ชันด้วย Git"
Amirreza

56

สถานการณ์ของฉันแตกต่างกันเล็กน้อยฉันทำgit reset HEAD~สามครั้ง

เพื่อยกเลิกมันฉันต้องทำ

git reset HEAD@{3}

ดังนั้นคุณควรจะทำ

git reset HEAD@{N}

แต่ถ้าคุณทำการรีเซ็ต git เสร็จแล้วโดยใช้

git reset HEAD~3

คุณจะต้องทำ

git reset HEAD@{1}

ในฐานะที่เป็น {N} หมายถึงจำนวนของการดำเนินงานใน Reflog ตามที่มาร์คชี้ให้เห็นในความคิดเห็น


2
ตัวเลือกที่ได้รับการยอมรับไม่ได้ให้ตัวอย่างของการก้าวไปข้างหน้า NI อยู่ในสถานการณ์เมื่อหนึ่งชั่วโมงก่อนที่ฉันต้องการส่งต่อมากกว่า 1 พยายามด้วยหลาย ๆ ตัวและใช้งานได้ ต้องการเพิ่มที่นี่ จะเป็นประโยชน์สำหรับผู้ที่กำลังมองหาการยกเลิกการรีเซ็ตด้วยการรีเซ็ต git HEAD ~ 3
zainengineer

3
แต่ถ้ามีใครทำ git reset HEAD ~ 3 เขาสามารถดูวิธีการยกเลิกได้อย่างรวดเร็วจำเป็นต้องใช้ git reset HEAD @ {3} โดยไม่ต้องเข้า reflog git HEAD ~ 3 ฯลฯ เป็นสถานการณ์ทั่วไป
zainengineer

1
ฉันคิดว่าทุกคนที่เห็น {1} / {2} จะรู้ว่าหมายเลขนั้นอาจเป็นหมายเลขการแก้ไขใด ๆ ที่reflogคำสั่งให้คุณ ยอมรับว่าประเด็นของคุณเกี่ยวกับตัวเลขเหมือนกันสำหรับทั้งสองทิศทาง ~ 3 / @ {3} แต่ไม่จำเป็นต้องเป็นคำตอบใหม่จริงๆ
Clint

30

1. ใช้git reflogเพื่อรับการอ้างอิงทั้งหมด

2git reset <id_of_commit_to_which_you_want_restore>

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