git เลิกทำการเปลี่ยนแปลงที่ไม่ได้รับการยอมรับหรือไม่ได้บันทึก


834

ฉันพยายามยกเลิกการเปลี่ยนแปลงทั้งหมดตั้งแต่ที่ทำครั้งสุดท้าย ฉันพยายามgit reset --hardและgit reset --hard HEADหลังจากดูโพสต์นี้ ฉันตอบกลับด้วย head ตอนนี้อยู่ที่ 18c3773 ... แต่เมื่อฉันดูที่แหล่งภายในเครื่องของฉันไฟล์ทั้งหมดจะยังคงอยู่ที่นั่น ฉันพลาดอะไรไป


1
นี่เป็นแหล่งข้อมูลที่ยอดเยี่ยมจาก Github: วิธีการยกเลิก (เกือบ) ทุกอย่างด้วย Git
jasonleonhard

เข้าใจง่ายและอ่านง่าย: git-scm.com/book/en/v2/Git-Basics-Undoing-Things
MyTitle

คำตอบ:


1620
  • วิธีนี้จะเป็นการยกเลิกการจัดเก็บไฟล์ทั้งหมดที่คุณอาจจัดทำด้วยgit add:

    git reset
    
  • การดำเนินการนี้จะคืนค่าการเปลี่ยนแปลงที่ไม่ได้รับการบอกกล่าวในพื้นที่ทั้งหมด (ควรดำเนินการใน repo root):

    git checkout .
    

    นอกจากนี้คุณยังสามารถยกเลิกการเปลี่ยนแปลงที่ไม่ได้รับอนุญาตเป็นไฟล์หรือไดเรกทอรีเฉพาะ:

    git checkout [some_dir|file.txt]
    

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

    git reset --hard HEAD
    
  • การดำเนินการนี้จะลบไฟล์ที่ไม่ได้ติดตามในเครื่องทั้งหมดดังนั้นเฉพาะไฟล์ที่ติดตามคอมไพล์เท่านั้น :

    git clean -fdx
    

    คำเตือน: -x จะลบไฟล์ที่ถูกละเว้นทั้งหมดรวมถึงไฟล์ที่ระบุโดย.gitignore! คุณอาจต้องการใช้-nเพื่อดูตัวอย่างไฟล์ที่จะลบ


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

git reset
git checkout .
git clean -fdx

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


@uribe ที่ถูกต้อง ฉันต้องเริ่มโครงการของฉันหลายครั้งเพราะเป็นการลบการอ้างอิงทั้งหมดที่ดาวน์โหลดและโฟลเดอร์. aide ของฉัน ต้องการทางออกที่ดีกว่า
EresDev

2
@EresDev คุณไม่จำเป็นต้องดำเนินการgit cleanมันจะยกเลิกการเปลี่ยนแปลงที่ไม่ได้รับการยกเว้น แต่จะเก็บไฟล์ที่ไม่ได้ติดตามหรือเพิ่มทั้งหมด แต่มันอาจส่งผลกระทบต่อผลการสร้างเพราะบางไฟล์ที่ไม่ได้ติดตามอาจรบกวน เช่นจะเกิดอะไรขึ้นถ้าไดเรกทอรี. aide ของคุณเสียหาย
mvp

git resetบอกฉันว่าฉันมีการเปลี่ยนแปลงที่ฉันต้องบันทึก
Daniel Springer

1
การทำงานgit clean -fdxของฉันถูกลบnode_modulesและ.envดี
fires3as0n

1
@ fires3as0n คุณคาดหวังอะไรอีก สิ่งนี้จะเกิดขึ้น มีคำเตือนในคำตอบด้วย
Rishav

148

หากคุณต้องการที่จะ " เลิกทำ " การเปลี่ยนแปลงที่ไม่มีข้อผูกมัดทั้งหมดให้เรียกใช้:

git stash
git stash drop

หากคุณมีไฟล์ที่ไม่ได้ติดตาม (ตรวจสอบโดยเรียกใช้ git status ) ไฟล์เหล่านี้อาจถูกลบโดยการทำงาน:

git clean -fdx

git stashสร้างสะสมใหม่ซึ่งจะกลายเป็นที่ซ่อน @ {0} หากคุณต้องการตรวจสอบก่อนคุณสามารถเรียกใช้git stash listเพื่อดูรายการของการหยุดทำงานของคุณ มันจะมีลักษณะดังนี้:

stash@{0}: WIP on rails-4: 66c8407 remove forem residuals
stash@{1}: WIP on master: 2b8f269 Map qualifications
stash@{2}: WIP on master: 27a7e54 Use non-dynamic finders
stash@{3}: WIP on blogit: c9bd270 some changes

ที่เก็บแต่ละครั้งจะถูกตั้งชื่อตามการส่งข้อความก่อนหน้านี้


2
ทางออกที่ดีแน่นอน แต่คุณต้องเปลี่ยนการใช้งานgit add .มาก่อนgit stashเพราะมันแสดงให้ฉันเห็นการเปลี่ยนแปลงที่ไม่git stash
ธรรมดา

21

นอกจากนี้ยังมีgit stash- ซึ่ง "หยุด" การเปลี่ยนแปลงในท้องถิ่นของคุณและสามารถนำมาใช้ใหม่ในภายหลังหรือลดลงหากไม่ต้องการอีกต่อไป

เพิ่มเติมข้อมูลเกี่ยวกับ stashing


12

ฉันใช้ทรีซอร์ส .... คุณสามารถย้อนกลับการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดทั้งหมดได้ด้วย 2 ขั้นตอนง่าย ๆ :

1) เพียงแค่ต้องรีเซ็ตสถานะไฟล์พื้นที่ทำงาน

ป้อนคำอธิบายรูปภาพที่นี่ 2) เลือกไฟล์ unstage ทั้งหมด (คำสั่ง + a) คลิกขวาและเลือกลบ

ป้อนคำอธิบายรูปภาพที่นี่

มันง่ายมาก: D


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

10

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

git add . (adding everything)
git stash 
git stash drop

หนึ่งในสายการบิน: git add . && git stash && git stash drop


นี่คือสิ่งที่ดีที่สุด
Madrugada

7

สำหรับผู้ที่มาถึงที่นี่การค้นหาว่าพวกเขาสามารถยกเลิกgit clean -f -dได้โดยสร้างไฟล์ในeclipseถูกลบไปแล้ว

คุณสามารถทำเช่นเดียวกันจาก UI โดยใช้ "คืนค่าจากประวัติท้องถิ่น" สำหรับการอ้างอิง: กู้คืนจากประวัติท้องถิ่น


3
ฉันไม่ได้ลงคะแนน แต่คำตอบของคุณน้อยกว่าความตั้งใจของคุณ มันจะช่วยถ้าคุณต้องใส่คำแรกในคำตอบ
Mark Schultheiss

5

รัฐเปลี่ยนจากหนึ่งกระทำเพื่อกระทำใหม่

0. last commit,i.e. HEAD commit
1. Working tree changes, file/directory deletion,adding,modification.
2. The changes are staged in index
3. Staged changes are committed

การดำเนินการสำหรับการเปลี่ยนสถานะ

0->1: manual file/directory operation
1->2: git add .
2->3: git commit -m "xxx"

ตรวจสอบความแตกต่าง

0->1: git diff
0->2: git diff --cached
0->1, and 0->2: git diff HEAD
last last commit->last commit: git diff HEAD^ HEAD

เปลี่ยนกลับเป็นการกระทำครั้งสุดท้าย

2->1: git reset
1->0: git checkout .     #only for tracked files/directories(actions include modifying/deleting tracked files/directories)
1->0: git clean -fdx     #only for untracked files/directories(action includes adding new files/directories)
2->1, and 1->0: git reset --hard HEAD

เทียบเท่ากับ git clone โดยไม่ต้องดาวน์โหลดอะไรอีกเลย

git reset && git checkout . && git clean -fdx

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