จะยกเลิกการเปลี่ยนแปลงที่ไม่ได้รับการยอมรับรวมถึงไฟล์และโฟลเดอร์ได้อย่างไร


1071

มีคำสั่ง git เพื่อยกเลิกการเปลี่ยนแปลงที่ไม่ได้รับการผูกมัดทั้งหมดในแผนผังการทำงานและดัชนีรวมถึงลบไฟล์และโฟลเดอร์ที่สร้างขึ้นใหม่หรือไม่?



1
ฉันได้อ่านคำตอบที่หลากหลายและยากที่จะจำไว้ด้านล่างทั้งหมดด้วยคำเตือนและกรณีขอบและ "ไม่ทำงานถ้าคุณมี xxx" และติดอยู่กับการลบ repo ทั้งหมดการโคลนเพื่อลบไฟล์ที่แก้ไขและเพิ่มทั้งหมด . ยังเป็นเพียงสองคำสั่ง rm -r projectdir; git clone xxx สำหรับฉันนี่เป็นการดำเนินงานที่บ่อยครั้ง - ลองดู repo เล่นรอบกับมันแล้วต้องการกลับไปเช็คเอาท์ที่สะอาดเพื่อที่ฉันจะสามารถเริ่มแก้ไขได้ ไม่ดี แต่ใช้งานได้ 100% หวังว่าวันหนึ่งพวกเขาจะเพิ่มคำสั่งง่ายๆสำหรับสิ่งนี้
John Little

คำตอบ:


1771

คุณสามารถรันคำสั่งทั้งสองนี้:

# Revert changes to modified files.
git reset --hard

# Remove all untracked files and directories.
# '-f' is force, '-d' is remove directories.
git clean -fd

147
เป็นความคิดที่ดีที่จะเรียกใช้ 'git clean -nd' เพื่อดูตัวอย่างการเปลี่ยนแปลงก่อนที่จะใช้ git clean เพื่อให้แน่ใจว่าคุณไม่มีไฟล์หรือไดเรกทอรีที่ไม่ได้ติดตามซึ่งคุณสนใจ
jpw

79
ช่วยชีวิตผู้คนไปที่เอกสาร: - f บังคับ, -d คือลบไดเรกทอรี, - n คือการรันแบบแห้ง (เช่น - การแห้ง - วิ่ง; แสดงผลลัพธ์โดยไม่ทำอะไรเลย)
Aaron Campbell

12
git clean -iสำหรับโหมดการโต้ตอบ
galath

มันไม่ได้รีเซ็ตไฟล์ที่ไม่มีการจัดเรียงของฉันฉันต้องทำการจัดลำดับไฟล์ก่อน
Aron Lorincz

4
@IgorGanapolsky คุณอาจอยู่ในช่วงกลางของความขัดแย้ง git merge --abortลองใช้
htanata

555

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

git checkout -- .

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

git checkout --

1
เมื่อฉันลองทำสิ่งนี้ฉันจะได้รับ "error: pathspec '.' ไม่ตรงกับไฟล์ใด ๆ ที่ git รู้จัก
Mike K

34
ความแตกต่างระหว่างสิ่งนี้กับgit reset --hardอะไร?
Felipe Almeida

104
'รีเซ็ต git - ฮาร์ด' จะยกเลิกการเปลี่ยนแปลงทั้งแบบฉากและไม่มีฉากในขณะที่ 'เช็คเอาต์ git -.' จะยกเลิกการเปลี่ยนแปลงที่ไม่มีการเปลี่ยนแปลงเท่านั้น
divideByZero

แต่ถ้าคุณใช้การชำระเงินและคุณได้ทำการแก้ไขไฟล์แล้ว cmd จะกลับมาว่าฉันต้องทำการผสานแม้ว่าฉันจะต้องย้อนกลับการเปลี่ยนแปลงนี้ก็ตาม
Vinicius Monteiro

7
git checkout - เพียงแค่จะแสดงรายการไฟล์ที่จะเปลี่ยนกลับ (ไม่มีการดำเนินการเพียงแค่รายการ) สิ่งนี้มีประโยชน์หากคุณต้องการดูว่าไฟล์ใดบ้างที่จะได้รับผลกระทบก่อนที่จะทำการเช็คเอาต์ -
Krish Srinivasan

107

ใช้ "ชำระเงิน git - ... " เพื่อยกเลิกการเปลี่ยนแปลงในไดเรกทอรีการทำงาน

git checkout -- app/views/posts/index.html.erb

หรือ

git checkout -- *

ลบการเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นกับไฟล์ที่ไม่มีสถานะในสถานะ git เช่น

modified:    app/controllers/posts.rb
modified:    app/views/posts/index.html.erb

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

ในgit checkout -- *ดาวจะถูกแทนที่ด้วยเชลล์ด้วยไฟล์และไดเรกทอรีทั้งหมดในไดเรกทอรีปัจจุบัน ดังนั้นควรไปในไดเรกทอรีย่อย มันใช้งานได้สำหรับฉัน แต่ต้องขอบคุณที่เน้นไวยากรณ์ ": /" ที่ตะเข็บสะอาดกว่าในความคิดของฉัน
mcoolive

53

วิธีหนึ่งที่ไม่สำคัญคือการเรียกใช้สองคำสั่งนี้:

  1. git stash สิ่งนี้จะย้ายการเปลี่ยนแปลงของคุณไปยังที่เก็บซึ่งนำคุณกลับสู่สถานะ HEAD
  2. git stash drop นี่จะเป็นการลบที่ซ่อนล่าสุดที่สร้างในคำสั่งสุดท้าย

3
สิ่งนี้ใช้ไม่ได้กับการเปลี่ยนแปลงที่ไม่ได้รับการยอมรับ แต่เป็นการเปลี่ยนแปลงที่ทำไว้แล้วเท่านั้น
b0xxed1n

4
ฉันใช้มันสำหรับการเปลี่ยนแปลงแบบไม่มีข้อผูกมัดและใช้งานได้
Paul D. Eden

7
@ b0xxed1n Stashing นั้นเกี่ยวกับการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดและเห็นได้ชัดว่ามันใช้งานได้สำหรับพวกเขา
TJ

git stash ถูกสร้างขึ้นเพื่อบันทึกการเปลี่ยนแปลงที่ไม่ได้รับการยอมรับเพื่อให้คุณสามารถ .. บันทึกโดยไม่ต้องกระทำ
Rob

git stashทำให้เกิดข้อผิดพลาดดังต่อไปนี้:fatal: git-write-tree: error building trees Cannot save the current index state
IgorGanapolsky

19
git clean -fd

ไม่ช่วยไฟล์ใหม่ยังคงอยู่ สิ่งที่ฉันทำคือการลบทรีทำงานทั้งหมดแล้ว

git reset --hard

ดู " ฉันจะล้างไดเรกทอรีการทำงานในท้องถิ่นของฉันในคอมไพล์ได้อย่างไร " สำหรับคำแนะนำในการเพิ่ม-xตัวเลือกในการล้างข้อมูล:

git clean -fdx

การ -xตั้งค่าสถานะหมายเหตุจะลบไฟล์ทั้งหมดที่ละเว้นโดย Git ดังนั้นโปรดระมัดระวัง (ดูการสนทนาในคำตอบที่ฉันอ้างถึง)


-fdx คืออะไร "บังคับทำเนียบและ x คืออะไร
Adi Prasetyo

@AdiPrasetyo -x ตั้งค่าสถานะลบไฟล์ที่ถูกละเว้นทั้งหมดเช่นกัน; อาจเป็นผลที่ไม่พึงประสงค์ดังนั้นฉันจึงปรับปรุงคำตอบของฉัน
Fr0sT

ฉันยังคงไม่สามารถรีบูทได้ ฉันได้รับข้อผิดพลาด: ข้อผิดพลาด: ไม่สามารถรวมในการเปลี่ยนแปลง โปรแกรมแก้ไขล้มเหลวที่ 0003 สร้างการโทรกลับไปที่สำเนาของโปรแกรมแก้ไขที่ล้มเหลวพบได้ใน:
IgorGanapolsky

13

ฉันคิดว่าคุณสามารถใช้คำสั่งต่อไปนี้: git reset --hard


hhmm ... ฉันทำอย่างนั้น แต่ไฟล์ของฉันยังอยู่ที่นั่น ฉันควรทำอะไรหลังจากนั้น
MEM

1
git reset จะยกเลิกการเปลี่ยนแปลงที่ไม่ได้รับอนุญาตในแผนผังการทำงานเท่านั้น มันจะไม่ลบไฟล์และโฟลเดอร์ใหม่ ผมไม่แน่ใจว่าจะทำอย่างไรกับคอมไพล์
Josnidhin

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

6

โปรดทราบว่าอาจยังมีไฟล์ที่ดูเหมือนจะไม่หายไป - ไฟล์เหล่านั้นอาจไม่ได้รับการแก้ไข แต่คอมไพล์อาจทำเครื่องหมายว่าถูกแก้ไขเนื่องจากการเปลี่ยนแปลง CRLF / LF ดูว่าคุณได้ทำการเปลี่ยนแปลงบางอย่างใน.gitattributesเร็ว ๆ นี้

ในกรณีของฉันฉันได้เพิ่มการตั้งค่า CRLF ลงใน.gitattributesไฟล์และไฟล์ทั้งหมดยังคงอยู่ในรายการ "ไฟล์ที่แก้ไข" เพราะสิ่งนี้ การเปลี่ยนการตั้งค่า. gitattributes ทำให้หายไป


6

หากคุณมีการเปลี่ยนแปลงที่ไม่มีข้อผูกมัด (เฉพาะในสำเนาการทำงานของคุณ) ที่คุณต้องการเปลี่ยนกลับเป็นสำเนาในการส่งล่าสุดของคุณให้ทำดังต่อไปนี้:

git checkout filename

ฉันพยายามทำสิ่งนี้หลังจากไม่ได้รับการผูกมัดgit rm filenameและมันไม่ทำงาน error: pathspec 'filename' did not match any file(s) known to git.
falsePockets

วิธีแก้ปัญหาสำหรับการเลิกทำgit rmคือgit checkout master -- filename
falsePockets

3

Git 2.23 แนะนำgit restoreคำสั่งเพื่อกู้คืนไฟล์แผนผังการทำงาน

https://git-scm.com/docs/git-restore

เพื่อเรียกคืนไฟล์ทั้งหมดในไดเรกทอรีปัจจุบัน

คอมไพล์เรียกคืน

หากคุณต้องการกู้คืนไฟล์ต้นฉบับ C ทั้งหมดให้ตรงกับเวอร์ชันในดัชนีคุณสามารถทำได้

git restore '* .c'


1
มันคอมไพล์ 2.23ไม่ใช่ 2.13
phuclv

2

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

git checkout .

ตัวอย่าง:

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   application/controllers/Drivers.php
        modified:   application/views/drivers/add.php
        modified:   application/views/drivers/load_driver_info.php
        modified:   uploads/drivers/drivers.xlsx

no changes added to commit (use "git add" and/or "git commit -a")

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git checkout .

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean

-2

ฉันมักจะใช้วิธีนี้ทำงานได้ดี:

mv fold/file /tmp
git checkout fold/file

ตรงนี้เป็นสิ่งที่คนที่มี "ไลค์" 357 คนเสนอ มีเพียงคุณเท่านั้นที่สร้างสำเนาสำรองของไฟล์ที่เช็คเอาต์ใหม่
Matthias

-3

วิธีที่ปลอดภัยและระยะยาว:

  1. git branch todelete
  2. git checkout todelete
  3. git add .
  4. git commit -m "I did a bad thing, sorry"
  5. git checkout develop
  6. git branch -D todelete

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