ฉันจะเลิกทำการคอมมิทล่าสุดใน Git ได้อย่างไร?


21054

ฉันตั้งใจส่งไฟล์ที่ไม่ถูกต้องไปยังGitโดยไม่ได้ตั้งใจแต่ยังไม่ได้ส่งมอบคำสั่งไปยังเซิร์ฟเวอร์

ฉันจะเลิกทำการคอมมิทเหล่านั้นจากที่เก็บในเครื่องได้อย่างไร?


138
ก่อนที่คุณจะโพสต์คำตอบใหม่พิจารณาว่ามีคำตอบสำหรับคำถามนี้ 65+ ข้อ ตรวจสอบให้แน่ใจว่าคำตอบของคุณมีส่วนช่วยอะไรที่ไม่ใช่คำตอบที่มีอยู่
Sazzad Hissain Khan

89
คุณรู้ไหมว่าคอมไพล์ต้องการอะไร? git undo, แค่นั้นแหละ. จากนั้นคอมไพล์ชื่อเสียงมีไว้เพื่อจัดการกับความผิดพลาดที่เราทำเพียงมนุษย์ปุถุชนหายไป ใช้งานโดยการผลักดันสถานะปัจจุบันบนสแต็ก git ก่อนที่จะดำเนินการgitคำสั่งใด ๆ มันจะส่งผลกระทบต่อประสิทธิภาพดังนั้นจึงเป็นการดีที่สุดที่จะเพิ่มการตั้งค่าสถานะว่าจะเปิดใช้งานหรือไม่
Yimin Rong

11
@YiminRong สามารถทำได้ด้วยaliasฟีเจอร์ของ Git : git-scm.com/book/en/v2/Git-Basics-Git-Aliases
Edric

3
@RomainValeri - วิธีเดียวกับที่เลิกทำการทำงานได้ทุกที่
Yimin Rong

1
@YiminRong ไม่ได้ซื้อมัน ผู้คนจะยังคงคลำหาและยกเลิกสิ่งต่าง ๆ ที่จะไม่เลิกทำ แต่ที่สำคัญกว่าgit reflogนั้นอยู่ใกล้กับสิ่งที่คุณอธิบาย แต่ให้ผู้ใช้ควบคุมได้มากขึ้นว่าจะต้องทำอะไร (ยกเลิก) แต่โปรดอย่า "เลิกทำ" ไม่ทำงานเหมือนกันทุกที่และผู้คนคาดหวังสิ่งต่าง ๆ มากมายสำหรับคุณลักษณะที่จะบรรลุ เลิกทำสิ่งสุดท้ายหรือไม่? เลิกทำการกระทำล่าสุดหรือไม่ หากการกระทำล่าสุดเป็นการผลักให้เลิกทำอย่างแน่นอน (รีเซ็ตและผลักดัน) หรือ (ย้อนกลับและผลักดัน)?
RomainValeri

คำตอบ:


22855

เลิกทำคอมมิชชันและทำซ้ำ

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. นี่คือสิ่งที่คุณต้องการยกเลิก
  2. นี้ไม่ได้ทำอะไรกับต้นไม้ที่ทำงานของคุณ (สถานะของไฟล์ของคุณบนดิสก์) แต่เลิกทำการกระทำและใบที่เปลี่ยนแปลงที่คุณมุ่งมั่นที่ unstaged (ดังนั้นพวกเขาจะปรากฏเป็น "การเปลี่ยนแปลงไม่ได้จัดฉากสำหรับการกระทำ" ในgit statusเพื่อให้คุณจะต้อง เพิ่มพวกเขาอีกครั้งก่อนที่จะกระทำ) ถ้าคุณเพียงต้องการที่จะเพิ่มการเปลี่ยนแปลงมากขึ้นในการกระทำก่อนหน้านี้หรือเปลี่ยนการกระทำข้อความ1คุณสามารถใช้git reset --soft HEAD~แทนซึ่งเป็นเหมือนgit reset HEAD~2แต่ใบการเปลี่ยนแปลงที่คุณมีอยู่ฉาก
  3. ทำการแก้ไขไฟล์ทรีที่ใช้งานได้
  4. git add สิ่งที่คุณต้องการรวมไว้ในการกระทำใหม่ของคุณ
  5. ยอมรับการเปลี่ยนแปลงโดยใช้ข้อความการส่งข้อความเก่า resetคัดลอกหัวเก่าไปที่.git/ORIG_HEAD; commitด้วย-c ORIG_HEADจะเปิดโปรแกรมแก้ไขซึ่งในขั้นต้นจะมีข้อความบันทึกจากคำสั่งเก่าและอนุญาตให้คุณแก้ไขได้ หากคุณไม่ต้องการแก้ไขข้อความคุณสามารถใช้-Cตัวเลือก

อย่างไรก็ตามระวังว่าถ้าคุณเพิ่มการเปลี่ยนแปลงใหม่ในดัชนีการใช้commit --amendจะเพิ่มการกระทำก่อนหน้านี้ของคุณ

หากรหัสถูกส่งไปยังเซิร์ฟเวอร์ของคุณแล้วและคุณมีสิทธิ์ในการเขียนทับประวัติ (rebase) ดังนั้น:

git push origin master --force

คุณสามารถดูคำตอบนี้:

ฉันจะย้าย HEAD กลับไปยังตำแหน่งก่อนหน้าได้อย่างไร (หัวเดี่ยว) & เลิกทำ

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


1หมายเหตุอย่างไรก็ตามคุณไม่จำเป็นต้องรีเซ็ตเป็นการคอมมิชชันก่อนหน้าถ้าคุณเพิ่งทำผิดพลาดในข้อความคอมมิท ตัวเลือกที่ง่ายกว่าคือgit reset(เพื่อยกเลิกการเปลี่ยนแปลงใด ๆ ที่คุณทำไว้ตั้งแต่นั้นมา) จากนั้นgit commit --amendซึ่งจะเปิดตัวแก้ไขข้อความคอมมิทเริ่มต้นของคุณที่เติมไว้ล่วงหน้าด้วยข้อความคอมมิทล่าสุด

2 เป็นเช่นเดียวกับHEAD~ HEAD~1ดูที่หัวคืออะไรในคอมไพล์? . มีประโยชน์ถ้าคุณต้องการเลิกคอมมิทหลายคอมมิท


472
และถ้าความมุ่งมั่นนั้นเกิดขึ้นกับสาขาที่ไม่ถูกต้องคุณก็สามารถgit checkout theRightBranchเปลี่ยนแปลงได้ทุกขั้นตอน อย่างที่ฉันต้องทำ
Frank Shearar

490
หากคุณกำลังทำงานใน DOS แทนคุณจะต้องใช้git reset --soft HEAD^ git reset --soft HEAD~1^ เป็นอักขระต่อเนื่องใน DOS ดังนั้นจึงไม่สามารถทำงานได้อย่างถูกต้อง นอกจากนี้เป็นค่าเริ่มต้นเพื่อให้คุณสามารถละเว้นได้ถ้าคุณชอบและเพียงแค่พูด--soft git reset HEAD~1
Ryan Lundy

119
ผู้ใช้ zsh อาจได้รับ: zsh: no matches found: HEAD^- คุณต้องหลบหนี ^ iegit reset --soft HEAD\^
tnajdek

7
คำตอบนั้นไม่ถูกต้องหากพูดโดยไม่ได้ตั้งใจgit commit -aออกเมื่อ-aควรปล่อยออก ในกรณีนี้จะเป็นการดีกว่าไม่ต้องละทิ้ง--soft(ซึ่งจะส่งผลให้--mixedเป็นค่าเริ่มต้น) จากนั้นคุณสามารถเรียกคืนการเปลี่ยนแปลงที่คุณต้องการกระทำได้
dmansfield

6
@IcyBrk git add เป็นคำสั่ง git add [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p] [--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]] [--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--chmod=(+|-)x] [--] [<pathspec>…​]
Ashraf.Shk786

10731

การเลิกกระทำนั้นน่ากลัวนิดหน่อยถ้าคุณไม่รู้ว่ามันทำงานอย่างไร แต่จริงๆแล้วมันเป็นเรื่องง่ายอย่างน่าอัศจรรย์ถ้าคุณเข้าใจ

สมมติว่าคุณมีสิ่งนี้โดยที่ C คือ HEAD ของคุณและ (F) คือสถานะของไฟล์ของคุณ

   (F)
A-B-C
    ↑
  master

คุณต้องการที่จะNuke กระทำ C และไม่เคยเห็นมันอีกครั้งและสูญเสียการเปลี่ยนแปลงทั้งหมดในการแก้ไขไฟล์ในท้องถิ่น คุณทำสิ่งนี้:

git reset --hard HEAD~1

ผลลัพธ์คือ:

 (F)
A-B
  ↑
master

ตอนนี้ B คือ HEAD เนื่องจากคุณใช้--hardไฟล์ของคุณจะถูกรีเซ็ตเป็นสถานะเมื่อคอมมิชชัน B

อ้า แต่คิดว่าคอมมิชไม่ใช่ภัยพิบัติ แต่เพียงเล็กน้อย คุณต้องการยกเลิกการคอมมิชชัน แต่ทำการเปลี่ยนแปลงเพื่อแก้ไขเล็กน้อยก่อนที่จะทำการคอมมิชชันที่ดีขึ้น เริ่มต้นอีกครั้งจากที่นี่ด้วย C ในฐานะหัวหน้าของคุณ:

   (F)
A-B-C
    ↑
  master

คุณสามารถทำได้โดยออกจาก--hard:

git reset HEAD~1

ในกรณีนี้ผลลัพธ์คือ:

   (F)
A-B-C
  ↑
master

ในทั้งสองกรณี HEAD เป็นเพียงตัวชี้ไปยังการคอมมิทล่าสุด เมื่อคุณทำคุณจะgit reset HEAD~1บอก Git ให้ย้ายตัวชี้ HEAD กลับหนึ่งคำสั่ง แต่ (เว้นแต่คุณจะใช้--hard) คุณปล่อยไฟล์ไว้เหมือนเดิม ดังนั้นตอนนี้git statusแสดงให้เห็นถึงการเปลี่ยนแปลงที่คุณได้ตรวจสอบใน C. คุณไม่ได้สูญเสียอะไร!

สำหรับการสัมผัสที่เบาที่สุดคุณสามารถยกเลิกการคอมมิทได้ แต่ทิ้งไฟล์และดัชนีไว้ :

git reset --soft HEAD~1

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

อีกอย่างหนึ่ง: สมมติว่าคุณทำลายการกระทำดังในตัวอย่างแรกแต่แล้วคุณก็ค้นพบว่าคุณต้องการมันใช่ไหม? โชคดีใช่มั้ย

ไม่ยังคงมีวิธีที่จะได้รับคืน พิมพ์git reflogและคุณจะเห็นรายการ (บางส่วน) ที่ใช้shas (นั่นคือแฮช) ที่คุณย้ายไปมาค้นหาสิ่งที่คุณทำลายและทำสิ่งนี้:

git checkout -b someNewBranchName shaYouDestroyed

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


15
ระวัง! สิ่งนี้อาจไม่ทำสิ่งที่คุณคาดหวังหากการกระทำที่ผิดพลาดของคุณเป็นการผสาน (กรอไปข้างหน้า)! หากหัวของคุณอยู่ในการรวมการกระทำ (เช่นการรวมสาขาของฟีเจอร์เข้ากับมาสเตอร์) git reset --hard~1จะชี้ให้แบรนช์หลักไปยังการคอมมิชชันล่าสุดภายในสาขาฟีเจอร์ ในกรณีนี้ควรใช้รหัสการมอบหมายเฉพาะแทนคำสั่งสัมพัทธ์
Chris Kerekes

90
การขาดจุดสำคัญ: หากการกระทำดังกล่าวก่อนหน้านี้ 'ผลัก' ไปยังระยะไกลการดำเนินการ 'เลิกทำ' ไม่ว่าจะง่ายเพียงใดจะทำให้เกิดความเจ็บปวดและความทุกข์ทรมานอย่างใหญ่หลวงต่อผู้ใช้ที่เหลือ เมื่อพวกเขาทำ 'git pull' ในอนาคต ดังนั้นถ้าคอมมิชชันถูก 'ผลักดัน' แล้วให้ทำเช่นนี้แทน: git revert <bad-commit-sha1-id> git push กำเนิด:
FractalSpace

12
@ fractalSpace มันจะไม่ทำให้เกิด "ความเจ็บปวดและความทุกข์ทรมานมหาศาล" ฉันใช้แรงเล็กน้อยในการใช้ Git กับทีม สิ่งที่ต้องทำคือการสื่อสาร
Ryan Lundy

14
@Kyralessa ในที่ทำงานของฉันเลอะเวิร์กโฟลว์ของทีมทั้งหมดแล้วบอกพวกเขาถึงวิธีแก้ไข sh * t ไม่ได้เรียกว่า 'การสื่อสาร' การเขียนประวัติศาสตร์ git ซ้ำเป็นการดำเนินการทำลายล้างซึ่งส่งผลให้การทำลายส่วนต่างๆของ repo ยืนยันการใช้งานในขณะที่ทางเลือกที่ชัดเจนและปลอดภัยมีอยู่เพียงแค่ขาดความรับผิดชอบ
FractalSpace

14
ฉันต้องการที่จะกระทำความมุ่งมั่นและไม่เคยเห็นมันอีกครั้ง ฉันใช้ตัวอย่างของคุณด้วย--hardแต่สิ่งที่ฉันไม่ได้ตระหนักถึงก็คือการเปลี่ยนแปลงที่ไม่ทำงานของฉันทั้งหมดในแผนผังการทำงานของฉันก็จะได้รับการอบด้วย! ฉันจะส่งไฟล์เหล่านี้โดยเป็นส่วนหนึ่งของการคอมมิทในภายหลัง ตอนนี้ดูเหมือนว่าเป็นไปไม่ได้ที่จะเรียกคืนไฟล์เหล่านี้ - ฉันได้ลองวิธีแก้ปัญหาที่คุณโพสต์ไปreflogแล้วแต่สิ่งนี้ไม่ได้กู้คืนการเปลี่ยนแปลงที่ไม่เคยมีมาก่อน
Adam Burley

2129

มีสองวิธีในการ "เลิกทำ" การกระทำล่าสุดของคุณขึ้นอยู่กับว่าคุณได้กำหนดให้เป็นสาธารณะ (ผลักไปที่พื้นที่เก็บข้อมูลระยะไกลของคุณ) หรือไม่:

วิธียกเลิกการคอมมิชชันในท้องถิ่น

สมมติว่าฉันมุ่งมั่นที่ท้องถิ่น แต่ตอนนี้ฉันต้องการลบการกระทำที่

git log
    commit 101: bad commit    # Latest commit. This would be called 'HEAD'.
    commit 100: good commit   # Second to last commit. This is the one we want.

ในการคืนค่าทุกอย่างกลับไปเป็นเหมือนเดิมก่อนที่จะส่งมอบครั้งสุดท้ายเราจำเป็นต้องresetกระทำก่อนหน้านี้HEAD:

git reset --soft HEAD^     # Use --soft if you want to keep your changes
git reset --hard HEAD^     # Use --hard if you don't care about keeping the changes you made

ตอนนี้git logจะแสดงว่าการกระทำสุดท้ายของเราถูกลบแล้ว

วิธียกเลิกการกระทำสาธารณะ

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

git revert HEAD

ตอนนี้การเปลี่ยนแปลงของคุณจะถูกเปลี่ยนกลับและพร้อมให้คุณยอมรับ:

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

สำหรับข้อมูลเพิ่มเติมโปรดดูที่Git พื้นฐาน - ยกเลิกสิ่งที่


101
ฉันพบคำตอบนี้ชัดเจนที่สุด git revert HEAD^ไม่ใช่ก่อนหน้านี้ไม่ใช่ก่อนหน้านี้ ฉัน: git revert HEADแล้วกดอีกครั้งและมันก็ใช้งานได้ :)
nacho4d

ถ้า Git ขอให้คุณ "เพิ่มเติม?" เมื่อคุณลองคำสั่งเหล่านี้ให้ใช้ไวยากรณ์สำรองในคำตอบนี้: stackoverflow.com/a/14204318/823470
tar

1745

เพิ่ม / ลบไฟล์เพื่อให้ได้ตามที่คุณต้องการ:

git rm classdir
git add sourcedir

จากนั้นแก้ไขความมุ่งมั่น:

git commit --amend

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

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


2
FYI: สิ่งนี้จะลบไฟล์ทั้งหมดของฉันและฉันสูญเสียการเปลี่ยนแปลง
egorlitvinenko

UPD: อย่างไรก็ตามฉันคืนค่าโดยใช้ reflog แต่การรับไม่ได้ผลสำหรับการส่งครั้งแรก
egorlitvinenko

1
ใช้git rm --cachedเพื่อเก็บไฟล์ในระบบไฟล์และลบออกจากดัชนี git เท่านั้น!
xuiqzy

1015
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

หรือ

git reset --hard HEAD~1

คำเตือน: คำสั่งดังกล่าวจะลบการแก้ไข.javaไฟล์ (และไฟล์อื่น ๆ ) ที่คุณต้องการกระทำอย่างถาวร

การhard resetถึงHEAD-1จะตั้งค่าสำเนาการทำงานของคุณให้อยู่ในสถานะของการกระทำก่อนที่จะกระทำผิด


19
git commit -a -m ""หรือgit commit -am ""ตามธรรมชาติ! :]
trejder

การใช้ทางลัดอีกวิธีหนึ่งของการสะสม ถ้าคุณต้องการ unstage ทุกอย่าง (เลิกทำการเพิ่ม) เพียงแค่git stashนั้นgit stash pop
seanriordan08

778

หากต้องการเปลี่ยนการส่งครั้งล่าสุด

แทนที่ไฟล์ในดัชนี:

git rm --cached *.class
git add *.java

จากนั้นถ้าเป็นสาขาส่วนตัวให้แก้ไขการกระทำ:

git commit --amend

หรือถ้าเป็นสาขาที่แชร์ให้ทำการคอมมิทใหม่:

git commit -m 'Replace .class files with .java files'


( หากต้องการเปลี่ยนการกระทำก่อนหน้านี้ให้ใช้การรีบูตแบบโต้ตอบที่ยอดเยี่ยม)


ProTip ™: เพิ่ม*.classไปยังgitignoreเพื่อหยุดเหตุการณ์นี้อีกครั้ง


เพื่อย้อนกลับการกระทำ

แก้ไขเพิ่มเติมกระทำเป็นทางออกที่ดีหากคุณจำเป็นต้องเปลี่ยนกระทำที่ผ่านมา resetแต่แก้ปัญหาทั่วไปมากขึ้นคือ

คุณสามารถรีเซ็ต Git เป็นกระทำใด ๆ ด้วย:

git reset @~N

ที่ไหนNคือจำนวนของการกระทำก่อนHEADและ@~รีเซ็ตการกระทำก่อนหน้านี้

ดังนั้นแทนที่จะแก้ไขข้อผูกมัดคุณสามารถใช้:

git reset @~
git add *.java
git commit -m "Add .java files"

ตรวจสอบgit help resetเฉพาะส่วนใน--soft --mixedและ--hardเพื่อความเข้าใจที่ดีขึ้นในสิ่งนี้

Reflog

หากคุณทำผิดพลาดคุณสามารถใช้ reflog เพื่อค้นหาคำสั่งที่ลดลงได้เสมอ:

$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started



2
สำหรับผู้ที่อ่านในอนาคต - โปรดทราบว่าgit revertเป็นคำสั่งแยกต่างหาก - ซึ่งโดยทั่วไปแล้ว 'รีเซ็ต' commimt เดียว
BKSpurgeon

681

git revert <commit-id>ใช้

เพื่อให้ได้กระทำ ID git logเพียงแค่การใช้งาน


15
หมายความว่าอะไรเชอร์รี่เลือกความมุ่งมั่น? ในกรณีของฉันฉันอยู่ผิดสาขาเมื่อฉันแก้ไขไฟล์ ฉันมุ่งมั่นแล้วรู้ว่าฉันอยู่ผิดสาขา การใช้ "git reset - soft HEAD ~ 1" ทำให้ฉันกลับไปก่อนคอมมิชชัน แต่ตอนนี้ถ้าฉันเช็คเอาต์สาขาที่ถูกต้องฉันจะยกเลิกการเปลี่ยนแปลงไฟล์ในสาขาที่ไม่ถูกต้องได้อย่างไร ไฟล์) ในสาขาที่ถูกต้อง?
นักดาราศาสตร์บันทึก

ฉันใช้ประโยชน์จากgit revert commit-idงานอย่างมีเสน่ห์ แน่นอนคุณจะต้องผลักดันการเปลี่ยนแปลงของคุณ
Casey Robinson

8
ฉันเชื่อว่าจะเป็นgit cherry-pick <<erroneous-commit-sha>>@astronomerdave จากนายเกือบ -2 ปีสายไปงานปาร์ตี้
Tom Howard

@Kris: แทนที่จะใช้ rebase ใช้เชอร์รี่เลือก เพราะมันคือการเก็บเชอร์รี่ขั้นสูง
Eugen Konkov

ฉันจะใช้ย้อนกลับเฉพาะในกรณีที่ฉันได้ผลักดันการกระทำของฉันแล้ว มิฉะนั้นการรีเซ็ตเป็นตัวเลือกที่ดีกว่า อย่าลืมว่าการย้อนกลับสร้างความมุ่งมั่นใหม่และโดยปกติจะไม่ใช่เป้าหมาย
Hola Soy Edu Feliz Navidad

532

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

git reset --hard HEAD^1

(คำสั่งนี้จะเพิกเฉยต่อการกระทำทั้งหมดและการเปลี่ยนแปลงของคุณจะหายไปจากแผนผังการทำงานในพื้นที่ของคุณ) หากคุณต้องการยกเลิกการกระทำของคุณ แต่คุณต้องการให้การเปลี่ยนแปลงของคุณในพื้นที่การแสดงละคร (ก่อนที่จะกระทำเหมือนหลังจากgit add) ทำคำสั่งดังต่อไปนี้

git reset --soft HEAD^1

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

git reset HEAD

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

มากกว่า


13
@SMR ในตัวอย่างของคุณทุกคนชี้ไปที่ HEAD ปัจจุบันเท่านั้น HEAD ^ = HEAD ^ 1 เช่นเดียวกับ HEAD ^ 1 = HEAD ~ 1 เมื่อคุณใช้ HEAD ~ 2 จะมีความแตกต่างระหว่างสัญลักษณ์ ~ และ ^ หากคุณใช้ ~ 2 หมายถึง“ ผู้ปกครองคนแรกของผู้ปกครองคนแรก” หรือ“ ปู่ย่าตายาย”
Madhan Ayyasamy

501

หากคุณติดตั้งGit Extrasแล้วคุณสามารถเรียกใช้git undoเพื่อเลิกการคอมมิทล่าสุด git undo 3จะยกเลิกการกระทำสามครั้งล่าสุด


470

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

prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To git@bitbucket.org:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>

25
ประวัติการเขียนซ้ำในที่เก็บที่ใช้ร่วมกันโดยทั่วไปเป็นความคิดที่ดีมาก ฉันคิดว่าคุณรู้ว่าคุณกำลังทำอะไรฉันแค่หวังว่าผู้อ่านในอนาคตก็ทำได้เช่นกัน
แบรดโคช์

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

6
"เช่นเดียวกับในโลกแห่งความเป็นจริงถ้าคุณต้องการที่จะเขียนประวัติศาสตร์คุณต้องมีแผนการ: ทุกคนจะต้องมี 'ใน' ในการสมรู้ร่วมคิด (อย่างน้อยทุกคนที่รู้เกี่ยวกับประวัติศาสตร์คือทุกคนที่เคยดึงออกมาจากสาขา) ." ที่มา: stackoverflow.com/a/2046748/334451
Mikko Rantalainen

440

ฉันชอบที่จะใช้git rebase -iสำหรับงานนี้เพราะมีรายการที่ดีปรากฏขึ้นที่ฉันสามารถเลือกมุ่งมั่นที่จะกำจัด มันอาจจะไม่เป็นโดยตรงเป็นคำตอบอื่น ๆ บางอย่างที่นี่ แต่ก็รู้สึกขวา

เลือกจำนวนที่คุณต้องการแสดงรายการจากนั้นเรียกใช้เช่นนี้ (เพื่อสมัครเป็นสามคนสุดท้าย)

git rebase -i HEAD~3

รายการตัวอย่าง

pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

จากนั้น Git จะลบการกระทำสำหรับบรรทัดที่คุณลบออก


422

วิธีแก้ไขการคอมมิชชันก่อนหน้านี้

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

วิธียกเลิกการคอมมิชชันก่อนหน้านี้

เพียงรีเซ็ตสาขาของคุณเป็นตำแหน่งก่อนหน้า (ตัวอย่างเช่นการใช้gitkหรือgit rebase) จากนั้นนำการเปลี่ยนแปลงของคุณไปใช้ใหม่จากสำเนาที่บันทึกไว้ หลังจากการรวบรวมขยะในพื้นที่เก็บข้อมูลในพื้นที่ของคุณมันจะเป็นเหมือนการกระทำที่ไม่พึงประสงค์ไม่เคยเกิดขึ้น git reset HEAD~1ที่จะทำทั้งหมดที่อยู่ในคำสั่งเดียวใช้

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

วิธียกเลิกการกระทำสาธารณะ

ดำเนินการเลือกเชอร์รี่ย้อนกลับ ( git-revert ) เพื่อเลิกทำการเปลี่ยนแปลง

หากคุณยังไม่ได้ทำการเปลี่ยนแปลงอื่น ๆ ในสาขาของคุณคุณสามารถทำได้ ...

git revert --no-edit HEAD

จากนั้นพุชสาขาที่คุณอัพเดตไปยังที่เก็บที่แชร์

ประวัติความเป็นมากระทำจะแสดงทั้งกระทำแยกต่างหาก


ขั้นสูง: การแก้ไขสาขาส่วนตัวในที่เก็บสาธารณะ

สิ่งนี้อาจเป็นอันตรายได้ - ตรวจสอบให้แน่ใจว่าคุณมีสำเนาของสาขาในท้องถิ่น

หมายเหตุเพิ่มเติม: คุณไม่ต้องการทำสิ่งนี้หากมีคนอื่นทำงานในสาขา

git push --delete (branch_name) ## remove public version of branch

ทำความสะอาดสาขาของคุณในพื้นที่จากนั้นชำระคืน ...

git push origin (branch_name)

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


8
gitk --all $(git reflog | cut -c1-7)&อาจเป็นประโยชน์สำหรับการค้นหาการแก้ไขก่อนหน้านี้หากคุณต้องการยกเลิกการกระทำ '- แก้ไข'
สูงศักดิ์

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

ฉันคิดว่า 'ส่วนตัว' / 'สาธารณะ' จะถูกต้องมากกว่า 'ท้องถิ่น' / 'ระยะไกล'
nobar

การแก้ไขสาขาส่วนตัวในที่เก็บระยะไกลสามารถทำได้ง่ายๆgit push origin (branch_name) --force
โนเบิร์ต

335

หากคุณต้องการยกเลิกการถาวรอย่างถาวรและคุณได้โคลนที่เก็บบางส่วน

รหัสการกระทำสามารถเห็นได้โดย

git log 

จากนั้นคุณสามารถทำได้ -

git reset --hard <commit_id>

git push origin <branch_name> -f

ถ้าคุณไม่ใช้ "<commit_id>" แล้วใช้ "git reset - ฮาร์ด"? โดยทั่วไปฉันแค่ต้องการกำจัดการอัปเดตล่าสุดที่ฉันยังไม่ได้ทำและกลับไปใช้การยอมรับล่าสุดที่ฉันทำและฉันมักจะใช้ "git reset - ฮาร์ด"
Jaime Montoya

3
@JaimeMontoya หากต้องการยกเลิกการเปลี่ยนแปลงล่าสุดคุณสามารถใช้git reset --hardแต่ถ้าคุณต้องลบ "n" ที่กระทำอย่างหนักคุณต้องระบุ SHA
poorva

334

หากคุณยอมรับขยะ แต่ไม่ได้ผลัก

git reset --soft HEAD~1

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

หากคุณต้องการกำจัดการเปลี่ยนแปลงใด ๆ ในไฟล์ที่ถูกติดตามในแผนผังการทำงานตั้งแต่การคอมมิทก่อนการใช้งานหัว - " ฮาร์ด " แทน

หรือ

หากคุณผลักไปแล้วและมีคนดึงซึ่งโดยปกติแล้วเป็นกรณีของฉันคุณไม่สามารถใช้การรีเซ็ต gitได้ อย่างไรก็ตามคุณสามารถย้อนกลับคอมไพล์ได้

git revert HEAD

สิ่งนี้จะสร้างการส่งมอบใหม่ที่ย้อนกลับทุกสิ่งที่แนะนำโดยการกระทำโดยไม่ตั้งใจ


ฉันอยู่ในกรณีที่ 2 แต่เมื่อฉันทำ "git revert HEAD" จะมีข้อความระบุว่า "ข้อผิดพลาด: Commit [ID] คือการรวม แต่ไม่มีตัวเลือก -m ร้ายแรง: การเปลี่ยนกลับล้มเหลว" ข้อเสนอแนะใด ๆ
metaforge

2
น่าจะพูดถึงว่าแทนที่จะHEAD~1ใช้แฮชจริงตามที่แสดงgit log --statหรือโดยgit reflog- มีประโยชน์เมื่อคุณต้องการ 'เลิกทำ' มากกว่าหนึ่งคอมมิชชัน
ccpizza

284

บนSourceTree (GUI สำหรับ GitHub) คุณสามารถคลิกขวาที่คอมมิตและทำการ 'Reverse Commit' นี่ควรเลิกทำการเปลี่ยนแปลงของคุณ

บนเครื่อง:

หรือคุณอาจใช้:

git revert

หรือ:

git reset --soft HEAD^ # Use --soft if you want to keep your changes.
git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.

263

คำสั่งเดียว:

git reset --soft 'HEAD^' 

มันใช้งานได้ดีในการยกเลิกการกระทำสุดท้ายของท้องถิ่น!


11
ฉันจำเป็นต้องเขียนการตั้งค่า git - soft "HEAD ^" ด้วยเครื่องหมายคำพูดคู่เพราะฉันเขียนจากพรอมต์คำสั่งของ Windows
Ena

253

เพียงรีเซ็ตมันทำตามคำสั่งด้านล่างโดยใช้git:

git reset --soft HEAD~1

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

ฉันสร้างขั้นตอนในภาพด้านล่างโดยละเอียดเพื่อคุณมากขึ้นรวมถึงขั้นตอนทั้งหมดที่อาจเกิดขึ้นในสถานการณ์จริงและยืนยันรหัส:

จะยกเลิกการผูกมัดสุดท้ายใน Git ได้อย่างไร?


239

วิธีการเลิก Git ครั้งสุดท้ายกระทำอย่างไร

ในการกู้คืนทุกอย่างกลับไปเป็นเหมือนเดิมก่อนการคอมมิชชันล่าสุดเราจำเป็นต้องรีเซ็ตเป็นคอมมิชชันก่อน HEAD

  1. หากคุณไม่ต้องการเก็บการเปลี่ยนแปลงที่ทำไว้:

    git reset --hard HEAD^
    
  2. หากคุณต้องการเก็บการเปลี่ยนแปลงของคุณ:

    git reset --soft HEAD^
    

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


193

"รีเซ็ตต้นไม้ทำงานเป็นคำสั่งสุดท้าย"

git reset --hard HEAD^ 

"ล้างไฟล์ที่ไม่รู้จักจากแผนผังการทำงาน"

git clean    

ดู - การอ้างอิงด่วน Git

หมายเหตุ:คำสั่งนี้จะลบการกระทำก่อนหน้าของคุณดังนั้นใช้ด้วยความระมัดระวัง! git reset --hardปลอดภัยกว่า


190

ใช้ reflog เพื่อค้นหาสถานะที่ถูกต้อง

git reflog

reflog ก่อน REFLOG ก่อนรีเซ็ต

เลือก reflog ที่ถูกต้อง (f3cb6e2 ในกรณีของฉัน) และพิมพ์

git reset --hard f3cb6e2

หลังจากนั้น repo HEAD จะถูกรีเซ็ตเป็น HEADid รีเซ็ตเอฟเฟกต์ LOG หลังจากรีเซ็ต

ในที่สุด reflog ดูเหมือนว่าภาพด้านล่าง

reflog หลังจาก REFLOG FINAL


164

วิ่งครั้งแรก:

git reflog

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

จากนั้นทำ:

git reset --hard ActionIdFromRefLog

155

เลิกกระทำล่าสุด:

git reset --soft HEAD^ หรือ git reset --soft HEAD~

สิ่งนี้จะยกเลิกการกระทำครั้งสุดท้าย

นี่--softหมายถึงรีเซ็ตเป็นการจัดเตรียม

HEAD~หรือHEAD^หมายถึงการย้ายไปกระทำก่อนที่ HEAD


แทนที่การส่งมอบครั้งล่าสุดเป็นการกระทำใหม่:

git commit --amend -m "message"

มันจะแทนที่คอมมิทล่าสุดด้วยคอมมิทใหม่


153

อีกทางหนึ่ง:

ชำระเงินที่สาขาที่คุณต้องการเปลี่ยนกลับจากนั้นรีเซ็ตสำเนาการทำงานในเครื่องของคุณกลับไปเป็นการยืนยันว่าคุณต้องการเป็นสาขาล่าสุดบนเซิร์ฟเวอร์ระยะไกล ในการทำเช่นนี้ใน SourceTree I คลิกขวาที่และเลือก "รีเซ็ต BRANCHNAME เป็นการกระทำนี้"

จากนั้นไปที่ไดเร็กทอรีโลคัลของที่เก็บของคุณและรันคำสั่งนี้:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

การดำเนินการนี้จะลบการกระทำทั้งหมดหลังจากที่ดำเนินการอยู่ในที่เก็บในเครื่องของคุณ แต่เฉพาะสำหรับสาขานั้นเท่านั้น



139

ในกรณีของฉันฉันตั้งใจส่งไฟล์บางไฟล์ฉันไม่ต้องการ ดังนั้นฉันจึงทำสิ่งต่อไปนี้และได้ผล:

git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD

ตรวจสอบผลลัพธ์ด้วย gitk หรือ git log --stat



126

มีหลายวิธีที่จะทำ:

คำสั่ง Git เพื่อยกเลิกการคอมมิทล่าสุด / คอมมิท

คำเตือน:อย่าใช้ - ยากถ้าคุณไม่ทราบว่าคุณกำลังทำอะไรอยู่ - ฮาร์ดอันตรายเกินไปและอาจลบไฟล์ของคุณ

คำสั่งพื้นฐานเพื่อยกเลิกการคอมมิชชันใน Git คือ:

$ git reset --hard <COMMIT -ID>

หรือ

$ git reset --hard HEAD~<n>

COMMIT-ID : ID สำหรับการส่งมอบ

N: คือจำนวนของการกระทำสุดท้ายที่คุณต้องการเปลี่ยนกลับ

คุณสามารถรับรหัสยืนยันได้ตามที่แสดงด้านล่าง:

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to mulitply two numbers

โดยที่d81d3f1และbe20eb8 ยอมรับรหัส

ตอนนี้เรามาดูบางกรณี:

สมมติว่าคุณต้องการคืนค่าการส่งข้อมูลล่าสุด 'd81d3f1' นี่คือสองตัวเลือก:

$ git reset --hard d81d3f1

หรือ

$ git reset --hard HEAD~1

สมมติว่าคุณต้องการเปลี่ยนการกระทำ 'be20eb8':

$ git reset --hard be20eb8

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

$ git reset --help

5
git reset --hard HEAD~1เป็นอันตรายเกินไป ! สิ่งนี้จะไม่เพียง 'ยกเลิกการคอมมิชชันล่าสุด' แต่จะเปลี่ยน repo กลับไปเป็นคอมมิชชันก่อนหน้าอย่างสมบูรณ์ ดังนั้นคุณจะสูญเสียการเปลี่ยนแปลงทั้งหมดในการกระทำครั้งสุดท้าย!
Arnis Juraga

คุณถูกต้องเพื่อยกเลิกสิ่งนี้คุณสามารถใช้git push -f <remote> HEAD@{1}:<branch>
Benny

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

125

สำหรับการกระทำในท้องถิ่น

git reset --soft HEAD~1

หรือถ้าคุณจำไม่ได้ว่าใช้งานอะไรคุณอาจใช้

git rm --cached <file>

สำหรับความมุ่งมั่นผลักดัน

git filter-branchวิธีการที่เหมาะสมในการลบไฟล์จากประวัติศาสตร์ที่เก็บใช้ นั่นคือ,

git filter-branch --index-filter 'git rm --cached <file>' HEAD

แต่ฉันขอแนะนำให้คุณใช้คำสั่งนี้ด้วยความระมัดระวัง อ่านเพิ่มเติมได้ที่คอมไพล์กรองสาขา (1) หน้าคู่มือการใช้งาน


125

มีสองสถานการณ์หลัก

คุณยังไม่ได้ผลักดันการกระทำ

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

git rm <pathToFile>

คุณสามารถลบไดเรกทอรีทั้งหมดด้วย-rหรือรวมกับคำสั่งBashอื่น ๆ

git rm -r <pathToDirectory>
git rm $(find -name '*.class')

หลังจากลบไฟล์คุณสามารถคอมมิตด้วย - แก้ไขตัวเลือก

git commit --amend -C HEAD # the -C option is to use the same commit message

การดำเนินการนี้จะเขียนคอมมิชชันล่าสุดของคุณในการลบไฟล์พิเศษดังนั้นไฟล์เหล่านี้จะไม่ถูกส่งไปที่การส่งและจะถูกลบออกจากที่เก็บ. git ในพื้นที่ของคุณโดย GC

คุณผลักภาระผูกพันแล้ว

คุณสามารถใช้วิธีแก้ปัญหาแบบเดียวกันกับสถานการณ์อื่น ๆ จากนั้นทำgit pushด้วย-fตัวเลือก แต่ไม่แนะนำเนื่องจากจะเขียนทับประวัติระยะไกลด้วยการเปลี่ยนแปลงที่แตกต่างกัน

แต่คุณต้องทำโดยไม่กระทำ--amend(จำเรื่องนี้เกี่ยวกับ -amend`: ตัวเลือกนั้นจะเขียนประวัติของการส่งครั้งล่าสุด)


125

หากต้องการรีเซ็ตเป็นรุ่นก่อนหน้าให้ลบการเปลี่ยนแปลงที่ยังไม่ได้รับการจัดการอย่างถาวรทั้งหมด:

git reset --hard HEAD~1

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

6
หากคุณบังเอิญทำเช่นนี้โดยไม่ตั้งใจจะไม่สูญหายทั้งหมด ดูstackoverflow.com/questions/10099258/... , stackoverflow.com/questions/15479501/...และstackoverflow.com/questions/7374069/undo-git-reset-hard/7376959
cr7pt0gr4ph7

13
การใช้งาน--softเพื่อให้การเปลี่ยนแปลงของคุณเป็นuncommitted changes, --hardการ nuke กระทำอย่างสมบูรณ์และกลับมาย้อนกลับโดยหนึ่ง โปรดจำไว้ว่าต้องดำเนินการดังกล่าวเฉพาะกับการเปลี่ยนแปลงที่ยังไม่ได้ดำเนินการ
Yunus Nedim Mehel

@Zaz: คุณพูดถูก บางทีฉันควรจะชี้แจงว่า สามารถกู้คืนไฟล์ / การเปลี่ยนแปลงที่ถูกเพิ่มลงในดัชนี (/ staged) หรือมีการยืนยันแล้วเท่านั้น Uncommitted เปลี่ยนแปลง unstaged จะgit reset --hardเป็นคุณกล่าวว่าโยนออกไปอย่างสมบูรณ์โดย
cr7pt0gr4ph7

1
ในฐานะ sidenote: ทุกครั้งที่ไฟล์ถูก staged gitเก็บเนื้อหาไว้ในฐานข้อมูลวัตถุ เนื้อหาที่เก็บไว้จะถูกลบออกเมื่อดำเนินการรวบรวมขยะ ดังนั้นจึงเป็นไปได้ที่จะกู้คืนเวอร์ชันล่าสุดของไฟล์ที่ไม่ได้ถูกจัดฉากเมื่อgit reset --hardถูกเรียกใช้งาน (ดูโพสต์ลิงก์ด้านบนสำหรับข้อมูลเพิ่มเติม)
cr7pt0gr4ph7
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.