รีเซ็ต git - ฮาร์ด HEAD ออกจากไฟล์ที่ไม่ได้ติดตาม


584

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

คุณจะบอกคอมไพล์ได้อย่างไร "เพียงแค่นำมันกลับไปที่สิ่งที่ดึงครั้งสุดท้ายไม่มีอะไรมากไม่มีอะไรน้อย"


44
git reset --hardรีเซ็ตดัชนีของคุณและแปลงไฟล์ที่ถูกติดตามกลับสู่สถานะเดิมเหมือนอยู่ใน HEAD มันปล่อยไฟล์ที่ไม่ได้ติดตามเพียงอย่างเดียว
fifigyuri

คำตอบ:


904

คุณต้องใช้git clean -f -dเพื่อกำจัดไฟล์และไดเรกทอรีที่ไม่ได้ติดตามในสำเนาการทำงานของคุณ

หากคุณต้องการรีเซ็ตที่เก็บทั้งหมดเป็นหลักรวมถึง submodules git ทั้งหมดให้รันสคริปต์นี้:

git reset --hard HEAD
git clean -f -d
git checkout master
git fetch origin master
git reset --hard origin/master
git pull
git submodule update
git submodule update --init --recursive
git submodule foreach git reset --hard HEAD
git submodule foreach git clean -f -d
git submodule foreach git submodule update --init --recursive
git submodule foreach git fetch
git submodule foreach git pull
git status

56
นอกจากนี้-xหากคุณต้องการลบไฟล์. gitignored และกลับสู่สถานะเดิม
jtdubs

44
เพิ่ม-nในการทดสอบจะถูกลบออกก่อน รวมพวกเขาทั้งหมดเข้าด้วยกัน:-dfn
HyBRiD

31
คำสั่งทั่วไปของฉันอยู่git clean -qfdxที่นี่ ลบทุกอย่างและทำอย่างเงียบ ๆ
aragaer

3
-d -fสามารถ decalred ครั้งที่สอง-dffสำหรับการ-d -f -fนี้จะลบไดเรกทอรีที่ไม่ได้ติดตามรวมทั้งการป้องกันไดเรกทอรีที่ไม่ได้ติดตาม
ThorSummoner

3
@BKSpurgeon: ใช่มันจะลบไฟล์ คุณหมายถึงอะไร»ฉันต้องการไฟล์ที่ไม่มีการติดตามเหมือนก่อนหน้า? Git ไม่รู้อะไรเกี่ยวกับไฟล์ที่ไม่ได้ติดตามยกเว้นว่ามีอยู่ มันไม่ได้ติดตามไฟล์เหล่านี้หลายเวอร์ชัน (เนื่องจากไม่ได้ติดตาม )
knittl

60

หากคุณมีไฟล์ที่คุณต้องการเก็บไว้:

git clean -di จะทำความสะอาดแบบอินเตอร์แอคทีฟซึ่งอนุญาตให้คุณลบเฉพาะไฟล์ / dirs ที่คุณไม่ต้องการอีกต่อไป


48
git reset --hard && git clean -dfx

หรือ zsh ให้นามแฝง 'gpristine':

alias gpristine='git reset --hard && git clean -dfx'

ซึ่งมีประโยชน์จริงๆ

หากทำงานบน repo ที่มีการแยกกันอย่าลืมดึงและรีเซ็ตจาก repo / สาขาที่ถูกต้องตัวอย่างเช่น:

git fetch upstream && git reset --hard upstream/master && git clean -df

8
ขอโทษถ้านี่ไม่ใช่คำสั่งที่ปลอดภัย - ฉันไม่ได้พยายามที่จะปลอดภัยฉันกำลังพยายามตอบคำถาม คุณสามารถแสดงความคิดเห็นว่าสิ่งนี้ตอบคำถามได้หรือไม่?
jjnevis

3
สิ่งนี้ใช้ได้ดีและควรสร้างไว้ใน IMHO คอมไพล์ (แม้ว่าฉันไม่แน่ใจว่าฉันจะใช้ -x เป็นประจำ) หลายครั้งที่ฉันทำงานเกี่ยวกับโครงการในท้องถิ่นยังไม่ได้ซิงค์กับ GitHub ฯลฯ และผู้ปรับโครงสร้างที่ยุ่งเหยิงกำลังยุ่งเหยิงไปเกินกว่าสถานะ IDE 'เลิกทำ' ของ IDE สัญชาตญาณของฉันคือการย้อนกลับไปสู่การยอมรับครั้งล่าสุด แต่การทำ Google เพื่อที่จะตอบคำถามสำหรับการกระทำครั้งสุดท้ายไม่ใช่การส่งครั้งสุดท้าย สิ่งที่ฉันต้องการคือกลับไปสู่ความมุ่งมั่นล่าสุด สิ่งนี้ทำ ควรเป็นวิธีที่ง่ายกว่าแม้ว่า ขอบคุณ Linus! ;-)
Dell Anderson

5
มันอันตรายเพราะมันจะลบไฟล์ที่ถูกเพิกเฉยด้วยสิ่งที่-xคล้ายกันหากคุณเพิ่งโคลน repo ถ้านั่นคือสิ่งที่คุณต้องการมันสมบูรณ์แบบ หากคุณต้องการลบไฟล์ที่ไม่ได้ติดตามการลบ-xตัวเลือกจะใช้งานได้ดี
Emile Bergeron

2
ขอบคุณพระเจ้าสำหรับgpristine
Snowcrash

2
และลบการตั้งค่า intellij;)
Kalpesh Soni

17

วิธีการโต้ตอบของผู้ใช้:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/amazon/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/s3/ [y/N]? y

-i สำหรับการโต้ตอบ
-f สำหรับ force
-d สำหรับไดเรกทอรี
-x สำหรับไฟล์ที่ถูกละเว้น (เพิ่มถ้าจำเป็น)

หมายเหตุ: เพิ่ม-nหรือ--dry-runเพื่อตรวจสอบสิ่งที่จะทำ


4

git stashคุณสามารถใช้ คุณต้องระบุ--include-untrackedมิฉะนั้นคุณจะพบปัญหาเดิม

git stash --include-untracked

จากนั้นเพียงแค่ปล่อยรายการสุดท้ายในที่เก็บ

git stash drop

คุณสามารถสร้างนามแฝงที่มีประโยชน์ได้สำหรับสิ่งนั้นและเรียกมันว่าgit wipe:

git config --global alias.wipe "! git stash -q --include-untracked && git stash drop -q"

2

คำสั่งที่คุณกำลังมองหาคือ git clean


4
ครั้งต่อไปโปรดเพิ่มคำอธิบาย / ตัวอย่างเพิ่มเติมอีกเล็กน้อยสิ่งที่จะช่วยให้ผู้ใช้เข้าใจในสิ่งที่มันทำและในกรณีนี้พารามิเตอร์ใดที่จะใช้
รักบี้

1

git-clean ใช้เพื่อลบไฟล์ที่ไม่ได้ติดตามในแผนผังการทำงาน ต่อไปนี้เป็นตัวเลือก (โดยย่อ) ที่สามารถใช้กับgit cleanคำสั่ง

-dใช้เมื่อไม่ระบุพา ธ ดังนั้นคอมไพล์ recurse ในไดเรกทอรี untracked ลบออก

-f/--force เพื่อลบไฟล์ที่ไม่ได้ติดตามที่ซ้อนกัน

-i/--interactive แสดงสิ่งที่ต้องทำและล้างไฟล์แบบโต้ตอบ

-n/--dry-run แสดงสิ่งที่จะเกิดขึ้นโดยไม่ลบอะไรเลย

-x ละเว้นไฟล์

ตัวอย่าง: git clean -f -d-> ลบไฟล์ที่ไม่ได้ติดตามทั้งหมดในไดเรกทอรีปัจจุบันไดเรกทอรีย่อยใด ๆ


-16

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

git add .
git reset --hard HEAD~100
git pull

7
ฉันไม่คิดว่านี่เป็นสิ่งที่ OP ต้องการ คำตอบอื่น ๆ อาจทำได้ดีกว่าแสดงให้เห็นถึงวิธีการแก้ไขนี้
เอเวอรี่

1
สิ่งนี้อาจช้าหากคุณมีไฟล์จำนวนมากที่จะเพิ่ม
Devin G Rhode

4
ไม่เกี่ยวข้องกันโดยสิ้นเชิง
Azeem Hassni

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