ย้อนกลับไปยังคอมมิตสุดท้าย


120

ฉันเพิ่งทำ

git commit -m "blah"

จากนั้นฉันเพิ่มไฟล์บางไฟล์ฉันจะย้อนกลับและลบสิ่งที่อยู่ในไฟล์ปัจจุบันของฉันที่ยังไม่ได้เพิ่ม / คอมมิตได้อย่างไร


15
ไม่นี่ไม่ใช่สิ่งที่ OP ขอ - เป็นที่ชัดเจนว่าเขาต้องการย้อนกลับไปที่การกระทำสุดท้ายไม่ใช่ยกเลิกการกระทำครั้งสุดท้าย เขาไม่ได้บอกว่าเขาเพิ่มไฟล์บางไฟล์จากนั้นก็คอมมิต เห็นได้ชัดว่าเขาต้องการการกระทำครั้งสุดท้าย
Paul

1
มันยากเกินไปที่จะหาคำตอบสำหรับคำถามที่พบบ่อยนี้
แซม

คำตอบ:


211

Caveat Emptor - คำสั่งทำลายล้างข้างหน้า

การบรรเทาทุกข์ - git reflog สามารถช่วยคุณได้หากคุณต้องการ


1) UNDOการเปลี่ยนแปลงไฟล์ในท้องถิ่นและKEEPกระทำครั้งสุดท้ายของคุณ

git reset --hard

2) ยกเลิกการเปลี่ยนแปลงไฟล์ในเครื่องและลบคอมมิตล่าสุดของคุณ

git reset --hard HEAD^

3) KEEPการเปลี่ยนแปลงไฟล์ในท้องถิ่นและลบกระทำครั้งสุดท้ายของคุณ

git reset --soft HEAD^

20
คำสั่งนี้จะลบคอมมิตก่อนหน้าของคุณดังนั้นใช้ด้วยความระมัดระวัง! git reset
ฮาร์ด

9
WTF เป็นคำตอบที่ถูกต้องด้วยคะแนนโหวต 36 คะแนน ฉันเพิ่งสูญเสียงานนี้ไปหนึ่งวัน ... เพราะฉันอ่านคำตอบไม่ใช่ความคิดเห็น นี่ไม่ใช่คำตอบที่ถูกต้องสำหรับคำถาม!
Chris Nevill

1
โอเคไม่หาย! คุณสามารถทำ git reflog ซึ่งจะช่วยให้คุณเห็นการกระทำที่คุณทำก่อนการรีเซ็ต จากนั้นคุณสามารถชำระเงินที่กระทำได้
Chris Nevill

3
สำหรับสิ่งที่คุ้มค่าฉันได้ตีความคำถามของ OP ว่า "ฉันจะย้อนกลับคอมมิตและลบไฟล์ปัจจุบันได้อย่างไร" แต่มันก็ยังคงคลุมเครืออยู่ ฉันจะเข้าใจต่างออกไปถ้า OP พูดง่ายๆว่า "ฉันจะลบไฟล์ปัจจุบันที่ยังไม่ได้เพิ่มหรือ
คอมมิตได้อย่างไร

2
Git คือสิ่งที่ตรงกันข้ามกับคำสั่งของ Alan Kays สิ่งที่ง่ายควรเป็นเรื่องง่ายสิ่งที่ซับซ้อนควรเป็นไปได้ ... โดยเฉพาะส่วนแรก ยังคงขอบคุณสำหรับคำตอบของคุณ มันช่วย
0xC0000022L

46

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

git reset --hard

หากคุณต้องการลบคอมมิตล่าสุดของคุณด้วย (คืออันที่มีข้อความ "blah") ให้ใช้:

git reset --hard HEAD^

ในการลบไฟล์ที่ไม่ได้ติดตาม (ดังนั้นไฟล์ใหม่ที่ยังไม่ได้เพิ่มลงในดัชนี) และโฟลเดอร์ให้ใช้:

git clean --force -d

git reset --hard HEAD ^ ลบคอมมิตล่าสุดของฉันอย่างถาวรหรือไม่ เหมือนฉันกลับไปไม่ได้?
user137717

ดูเหมือนว่า "git clean --force -d" จะลบโฟลเดอร์. gitignored ด้วย
Alexey Timokhin

15

git reset --hard จะบังคับให้ไดเร็กทอรีการทำงานกลับไปที่คอมมิตสุดท้ายและลบไฟล์ใหม่ / ที่เปลี่ยนแปลง


2
ทำเช่นนั้น แต่ไฟล์ยังอยู่ที่นั่น (ไฟล์ที่ไม่ได้ติดตามยังคงอยู่ที่นั่น)
Blankman

ในกรณีนี้คุณสามารถทำ "git stash" ได้
jacktrade

3
โหวตเพิ่มขึ้นเนื่องจากนี่เป็นคำตอบเดียวที่ชัดเจนและไม่น่าสงสัยสำหรับคำถามที่ชัดเจนและไม่คลุมเครือของ OP
พอล

4

คุณสามารถย้อนกลับการคอมมิตโดยใช้git revert HEAD^สำหรับการเปลี่ยนกลับเป็นคอมมิตถัดไป คุณยังสามารถระบุการคอมมิตเพื่อเปลี่ยนกลับโดยใช้ id แทน HEAD ^


สิ่งนี้ไม่ได้ "ย้อนกลับ" ในความหมายที่คุณพูด สิ่งนี้สร้างการกระทำย้อนกลับ
Stefan Kendall

4

หากคุณต้องการยกเลิกการคอมมิตสุดท้ายให้ใช้สิ่งนี้:

git reset HEAD~

ทำงานอย่างมีเสน่ห์สำหรับฉัน


2
นี่คือคำตอบที่แน่นอนสำหรับคำถาม
Deniz Kocaboğa

นี่ควรเป็นคำตอบที่ได้รับการอนุมัติ
amiabl

3

วิธีที่เข้าใจผิดได้ง่ายๆในการยกเลิกการเปลี่ยนแปลงไฟล์ภายในเครื่องเนื่องจากการคอมมิตสุดท้ายคือการวางไว้ในสาขาใหม่:

git branch changes
git checkout changes
git add .
git commit

ซึ่งจะทำให้การเปลี่ยนแปลงในสาขาใหม่ กลับไปที่สาขาเดิมเพื่อค้นหากลับไปที่คอมมิตสุดท้าย:

git checkout master

สาขาใหม่เป็นสถานที่ที่ดีในการฝึกฝนวิธีต่างๆในการเปลี่ยนกลับโดยไม่เสี่ยงที่จะทำให้สาขาเดิมเสียหาย

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