git: เลิกทำการเปลี่ยนแปลงการเปลี่ยนแปลงทั้งหมดรวมถึงไฟล์ใหม่


1151

วิธีลบการเปลี่ยนแปลงทั้งหมดจากไดเรกทอรีการทำงานรวมถึงไฟล์ที่ไม่ได้ติดตามใหม่ ฉันรู้ว่าgit checkout -fทำอย่างนั้น แต่จะไม่ลบไฟล์ที่ไม่ได้ติดตามใหม่ที่สร้างขึ้นตั้งแต่การส่งครั้งล่าสุด

ใครบ้างมีความคิดในการทำเช่นนั้น?


1
@Joel & Wayfarer: ทำไมคุณไม่ลองgit help resetและgit help clean
SHernandez

3
ทำนามแฝงสำหรับนี้ในการกำหนดค่าคอมไพล์ของคุณเป็นความคิดที่ดี;)
anubina

คำตอบ:


1699
git reset --hard # removes staged and working directory changes

## !! be very careful with these !!
## you may end up deleting what you don't want to
## read comments and manual.
git clean -f -d # remove untracked
git clean -f -x -d # CAUTION: as above but removes ignored files like config.
git clean -fxd :/ # CAUTION: as above, but cleans untracked and ignored files through the entire repo (without :/, the operation affects only the current directory)

หากต้องการดูสิ่งที่จะถูกลบก่อนมือโดยไม่ต้องลบออกให้ใช้การ-nตั้งค่าสถานะ (นี่คือการทดสอบรัน) เมื่อคุณพร้อมที่จะลบจริงแล้วลบ-nธง:

git clean -nfd


16
หมายเหตุ: การรีเซ็ต git - ฮาร์ดลบการเปลี่ยนแปลงแบบกำหนดขั้นตอนรวมถึงการเปลี่ยนแปลงไดเรกทอรีทำงาน นอกจากนี้ git clean -f -d น่าจะตรงกันข้ามกับการเพิ่มไฟล์ที่ไม่ได้ติดตามใหม่ จากคำถามผู้ถามอาจมีความสุขมากกับไฟล์ที่ถูกละเว้นในปัจจุบัน
CB Bailey

7
อ่านคำตอบต่อไปและระวังสวิตช์ -x (นอกจากนี้ยังอาจลบการตั้งค่าในเครื่องของคุณเช่นไฟล์รหัสผ่าน / db-settings เช่น database.yml)
Boris

9
สวิตช์ -x นั้นไม่จำเป็นและค่อนข้างอันตรายในกรณีนี้
Tim Gautier

66
git clean -fxdอาจเป็นอันตรายได้ถ้าคุณไม่รู้ว่ากำลังทำอะไรอยู่ คุณอาจสิ้นสุดการลบไฟล์ที่ไม่ได้ติดตามที่สำคัญอย่างถาวรเช่นฐานข้อมูลของคุณ ฯลฯ ใช้ความระมัดระวัง
Mason Stewart

10
โปรดทราบว่าgit clean -f -dจะลบไฟล์จากโฟลเดอร์ที่ถูกข้ามด้วย ดังนั้นสิ่งที่คุณบันทึกในท้องถิ่นและสิ่งต่าง ๆ เช่นนั้นจะหายไป ปกติแล้วมันไม่ใช่ปัญหาใหญ่ แต่ควรรู้
cyriel

299

วิธีที่ปลอดภัยที่สุดที่ฉันใช้บ่อย:

git clean -fd

คำอธิบายไวยากรณ์ตาม/docs/git-cleanหน้า:

  • -f(นามแฝง: --force) หากตัวแปรการกำหนดค่า Git clean.requireForce ไม่ได้ตั้งค่าเป็นเท็จ git clean จะปฏิเสธที่จะลบไฟล์หรือไดเรกทอรีเว้นแต่จะได้รับ -f, -n หรือ -i Git จะปฏิเสธที่จะลบไดเรกทอรีที่มีไดเรกทอรีย่อยหรือไฟล์. git เว้นแต่ว่าจะได้รับวินาที
  • -d. ลบไดเรกทอรีที่ไม่ได้ติดตามซึ่งนอกเหนือจากไฟล์ที่ไม่ได้ติดตาม หากไดเรกทอรีที่ไม่ได้ติดตามได้รับการจัดการโดยที่เก็บ Git อื่นมันจะไม่ถูกลบโดยค่าเริ่มต้น ใช้ตัวเลือก -f สองครั้งหากคุณต้องการลบไดเรกทอรีดังกล่าว

ตามที่ระบุไว้ในความคิดเห็นมันอาจจะดีกว่าที่จะทำ git clean -ndที่แห้งและบอกคุณว่าจะถูกลบก่อนที่จะลบจริง

ลิงก์ไปที่git cleanหน้าเอกสาร: https://git-scm.com/docs/git-clean


124
ฉันมักgit clean -nd .จะลบไฟล์โดยใช้ก่อนเสมอgit clean -fd .
tbear

14
ทำไม? คุณช่วยอธิบายรายละเอียดได้ไหม
Greg B

31
สำหรับตัวเลือกclean -n gitนั้นจริงแล้วเป็นการรันแบบแห้งซึ่งไม่ได้ลบอะไรเลยมันแค่แสดงให้คุณเห็นว่าจะทำอะไร
RNickMcCandless

2
@tbear คุณก็สามารถทำที่ว่างเปล่าadd -A+ commit -a+ ก่อนrevert head git cleanการตรวจสอบการลบแต่ละครั้งก็ไม่ได้ปรับขนาดสำหรับสถานการณ์สำคัญ นอกจากนี้การวิ่งแบบแห้งไม่ใช่กระสุนเงิน: จะเป็นอย่างไรถ้าคุณพลาดบางสิ่งหรือทำผิดพลาดระหว่างการตรวจสอบ
Pacerier

1
สิ่งนี้จะลบไฟล์ แต่ไม่เลิกทำการแก้ไข
donquixote

202

สำหรับทุกunstagedไฟล์ใช้:

git checkout -- .

.ที่สิ้นสุดเป็นสิ่งสำคัญ

คุณสามารถแทนที่.ด้วยชื่อไดเรกทอรีย่อยเพื่อล้างเฉพาะไดเรกทอรีย่อยเฉพาะของโครงการของคุณ ปัญหาคือการแก้ไขเฉพาะที่นี่


7
@Vincent: - หลีกเลี่ยงข้อผิดพลาดในการพิมพ์โดยบอกคำสั่งเช็คเอาต์ว่าไม่มีการระบุพารามิเตอร์เพิ่มเติม หากไม่มีพวกเขาคุณสามารถจบด้วยสาขาใหม่แทนการรีเซ็ตสาขาปัจจุบัน!
Igor Rodriguez

2
นี่เป็นเส้นทางที่ปลอดภัยที่สุด แต่จะไม่ลบไฟล์ที่ไม่ได้ติดตาม (ไฟล์ที่เพิ่มใหม่)
TinkerTenorSoftwareGuy

5
สิ่งนี้ไม่ได้กู้คืนไฟล์ที่ถูกลบ แต่ไม่มีข้อผูกมัด
Cerin

เพียงแค่ FYI ฉันคิดถึงสิ่งนี้ ตรวจสอบให้แน่ใจว่าคุณอยู่ในไดเรกทอรีที่คุณต้องการลบการเปลี่ยนแปลงที่ไม่จัดเตรียมไว้ ยกตัวอย่างเช่นผมมีการเปลี่ยนแปลงใน 2 ไฟล์ที่แตกต่างกันในสถานที่ที่แตกต่างกันในสาขาเช่น: และsrc/app/work/filename.js ../app/working/test/filename.jsเพียงแค่ใช้git checkout -- .ในสาขาเท่านั้นลบไฟล์แรก ( โดยไม่นำ .. / ) ดังนั้นฉันต้องcd ../ขึ้นไปยังไดเรกทอรีที่สองเพื่อลบไฟล์ที่สองโดยใช้คำสั่งนั้น
Chris22

57

ดูที่git cleanคำสั่ง

git-clean - ลบไฟล์ที่ไม่ได้ติดตามจากแผนผังการทำงาน

ทำความสะอาดแผนผังการทำงานโดยลบไฟล์ที่ไม่อยู่ภายใต้การควบคุมเวอร์ชันซ้ำ ๆ เริ่มจากไดเรกทอรีปัจจุบัน

โดยปกติไฟล์ที่ไม่รู้จัก git เท่านั้นที่ถูกลบ แต่ถ้าระบุตัวเลือก -x ไฟล์ที่ถูกละเว้นจะถูกลบด้วยเช่นกัน เช่นนี้สามารถเป็นประโยชน์ในการลบผลิตภัณฑ์สร้างทั้งหมด


ฉันได้ลองgit clean -iและเลือก "ล้าง" จากเมนูแล้วนี่เป็นการลบไฟล์ใหม่ในที่สุด
Sany

43

ผลงานดังต่อไปนี้:

git add -A .
git stash
git stash drop stash@{0}

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

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

เครดิต: https://stackoverflow.com/a/52719/246724


1
ทำไมคุณอ้างถึง stash @ {0} แทนที่จะเป็นเพียงแค่git stash drop?
maikel

สุจริตผมจำไม่ได้ :)
donquixote

อันนี้ใช้ได้ผล โปรดทราบว่าคุณอยู่ในไดเรกทอรีหลัก ( git add -A .) ฉันเสียไป 30m เพราะไม่มีไฟล์ที่ตรงกัน ขอบคุณ!
9869932

ฉันเคยใช้วิธีการนี้และมีข้อดี อย่างไรก็ตามฉันได้พบวิธีแก้ปัญหาที่เสนอโดย jfountain และ Heath Dutton มากขึ้นเพื่อแก้ไขปัญหาเดิม IMHO
HeyZiko

2
git stash drop stash @ {0} ดร็อป stash ล่าสุดถ้าคุณทำ git stash มันจะดรอป stash ทั้งหมดที่คุณทำไว้
DonatasD

42

คุณสามารถทำได้สองขั้นตอน:

  1. ย้อนกลับไฟล์ที่แก้ไข: git checkout -f
  2. ลบไฟล์ที่ไม่ได้ติดตาม: git clean -fd

3
+1 เพราะง่าย นอกจากนี้เพราะมันทำงานและทำสิ่งที่ OP ต้องการโดยไม่ทำให้พวกเขากลัวด้วย omg สิ่งนี้จะลบทุกอย่าง
geekzster

30

ฉันคิดว่ามันเป็น ( คำเตือน: ต่อไปนี้จะล้างทุกอย่าง )

$ git reset --hard HEAD
$ git clean -fd

resetยกเลิกการเปลี่ยนแปลง cleanเพื่อลบใด ๆ ที่ไม่ได้ติดตามไมล์และd irectories


สิ่งนี้ไม่ทำงานฉันยังคงได้รับการเตือนความขัดแย้งเมื่อทำในgit pullภายหลัง: CONFLICT (content): Merge conflict in...ฉันจะแก้ไขปัญหานี้ได้โดยgit pull --strategy=ours
rubo77


4

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

ดูgit help cleanข้อมูลเพิ่มเติมรวมถึงตัวเลือกที่มีประโยชน์อื่น ๆ


4

หากคุณต้องการยกเลิกการเปลี่ยนแปลงทั้งหมดที่คุณสามารถใช้ตัวเลือกใด ๆ .gitconfigที่ถูกต้องในนามแฝงใน ตัวอย่างเช่น

[alias]
    discard = "!f() { git add . && git stash && git stash drop stash@{0}; }; f"

การใช้งาน: git discard


1
นามแฝงนี้ฉันชอบมาก
ธง

3

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

คุณสามารถทำได้ในสาขาปัจจุบันเช่นนี้

git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git revert HEAD
git reset HEAD^^

หรือคุณสามารถทำได้บน HEAD เดี่ยว (สมมติว่าคุณเริ่มที่สาขา BRANCHNAME):

git checkout --detach HEAD
git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git checkout BRANCHNAME

อย่างไรก็ตามสิ่งที่ฉันมักจะทำคือการกระทำเป็นชิ้น ๆ จากนั้นตั้งชื่อบางส่วนหรือทั้งหมดที่เรียกว่า "DISCARD: ... " จากนั้นใช้การรีบูตแบบโต้ตอบเพื่อลบการกระทำที่ไม่ดีและรักษาสิ่งที่ดี

git add -p  # Add changes in chunks.
git commit -m"DISCARD: Some temporary changes for debugging"
git add -p  # Add more stuff.
git commit -m"Docblock improvements"
git tag archive/local-changes-2015-08-01
git rebase -i (commit id)  # rebase on the commit id before the changes.
  # Remove the commits that say "DISCARD".

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

git lolและgit lolaทางลัดที่ได้รับประโยชน์มากกับเวิร์กโฟลว์นี้


3

สำหรับโฟลเดอร์เฉพาะฉันใช้:

git checkout -- FolderToClean/*

3
ไม่ได้ลบไฟล์ที่ไม่ได้ติดตามเนื่องจากสถานะ OP
vonbrand

0

อาจเป็นคำตอบ noob แต่: ฉันใช้ TortoiseGit สำหรับ windows และมีคุณสมบัติที่ดีที่เรียกว่า REVERT ดังนั้นสิ่งที่คุณทำเพื่อยกเลิกการเปลี่ยนแปลงที่ไม่มีการผลักดันแบบ nonstaged ในพื้นที่ของคุณคือ:

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