วิธีลบไฟล์ออกจากพื้นที่จัดเตรียมคอมไพล์?


549

ฉันทำการเปลี่ยนแปลงบางไฟล์ของฉันใน repo ในพื้นที่ของฉันและจากนั้นฉันก็ทำตามgit add -Aที่ฉันคิดว่าเพิ่มไฟล์มากเกินไปในพื้นที่จัดเตรียม ฉันจะลบไฟล์ทั้งหมดออกจากพื้นที่จัดเตรียมได้อย่างไร?

หลังจากฉันทำอย่างนั้นฉันจะทำgit add "filename"เอง


2
หวังว่าคุณกำลังมองหาสิ่งนี้: stackoverflow.com/questions/1505948/…
sumitb.mdi

27
git statusแจ้งให้คุณทราบอย่างแน่นอนว่าต้องทำอย่างไรถ้าคุณต้องการเลิกทำไฟล์
Michael Foukarakis

6
@MichaelFoukarakis สถานะคอมไพล์ไม่เป็นประโยชน์ถ้าคุณต้องการ unstage ไดเรกทอรีทั้งหมดถ้ามันท่วมเทอร์มินัลกับเอาท์พุท (เช่น node_modules)
whiterook6

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

คำตอบ:


689

คุณสามารถ unstage ไฟล์จากดัชนีโดยใช้

git reset HEAD -- path/to/file

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

git reset HEAD -- .

นอกจากนี้สำหรับการอ้างอิงในอนาคตผลลัพธ์ของgit statusจะบอกคุณคำสั่งที่คุณต้องใช้เพื่อย้ายไฟล์จากสถานะหนึ่งไปยังอีก


5
$ git reset HEAD -- .ผลิตfatal: Failed to resolve 'HEAD' as a valid ref.หมายเหตุที่ฉันไม่เคยได้กระทำใด ๆ ; มันเป็นครั้งแรกgit addหลังจากgit init
Patrizio Bertoni

5
git reset @นอกจากนี้คุณยังสามารถใช้
alex

@alex มันดีกว่าแค่ธรรมดาgit resetเหรอ?
Antony Hatchkins

7
@AntonyHatchkins ตรงกันกับ@ HEAD
alex

ทำงานให้ฉันโดยสิ้นเชิงขอบคุณ!
wayneseymour

305

ใช้

git reset

เพื่อ unstage ไฟล์ staged ทั้งหมด


3
ฉันขอถามว่ามันแตกต่างกันอย่างไรgit reset HEAD --หรือมันเป็นวิธีที่ง่ายกว่าในการปฏิบัติการแบบเดียวกัน?
ProNotion

1
@ProNotion Reset ใช้เป็นHEADค่าเริ่มต้น จุดประสงค์ของคนที่--อยู่ในคุณgit reset HEAD --คืออะไร?
Antony Hatchkins

@AntonyHatchkins ควรได้รับตามด้วยการหยุดเต็ม (จุด) และถูกนำมาจากตัวอย่างในคำตอบที่ยอมรับ
ProNotion

11
@ProNotion ขออภัยฉันเข้าใจคุณผิด git reset HEAD -- .มีความแตกต่างในการที่จะรีเซ็ตไฟล์ในไดเรกทอรีปัจจุบันและด้านล่างในขณะที่git resetรีเซ็ตไฟล์ทั้งหมดในโครงการ
Antony Hatchkins

101

หากคุณได้ผูกไฟล์ที่ไม่ต้องการไว้จำนวนหนึ่งแล้วคุณสามารถ unstage และบอกคอมไพล์ให้ทำเครื่องหมายว่าถูกลบ (โดยไม่ต้องลบทิ้ง) ด้วย

git rm --cached -r .

--cachedบอกให้ลบเส้นทางออกจากการจัดเตรียมและดัชนีโดยไม่ลบไฟล์เองและ-rดำเนินการกับไดเรกทอรีซ้ำ จากนั้นคุณสามารถgit addไฟล์ใด ๆ ที่คุณต้องการติดตามต่อไป


ฉันคิดว่ามันคือ "git rm -."
Alexander Mills

1
มีข้อผิดพลาดร้ายแรงเกี่ยวกับการไม่ลบไฟล์ด้วย "git rm -."
Alexander Mills

@AlexMills ฉันจะอัปเดตคำตอบของฉันเพื่อพูดถึงตัวเลือกที่แท้จริงสำหรับrmการเลิกทำไฟล์ทั้งหมด
สูงสุด

2
ฉันลองมันในไฟล์เอกพจน์เช่นนี้: "git rm --cached my / file.java" และฉันเห็นไฟล์นั้นยังอยู่ในพื้นที่จัดเตรียม แต่ถูกลบไปแล้ว! @ Max เมื่อคุณเรียกใช้คำสั่งนี้ไฟล์ของคุณถูกลบจริงหรือเพียงแค่ยกเลิกการจัดฉาก หากคุณไม่ได้มองหาพฤติกรรมนั้นฉันก็จะตอบด้วย
OrwellHindenberg

@OrwellHindenberg ขอบคุณที่ชี้ให้เห็น! --cachedจริงๆแล้วคือการหยุดการติดตามไฟล์ที่คุณได้ทำไปแล้ว ดังนั้นไฟล์จึงไม่ถูกลบจริง ๆ แต่ git คิดว่าเป็น ฉันชี้แจงเรื่องนี้ในคำตอบของฉัน
Max

30

คุณสามารถใช้

git reset HEAD

จากนั้นเพิ่มไฟล์เฉพาะที่คุณต้องการ

git add [directory/]filename

คุณสามารถเพิ่มพารามิเตอร์ -x และไฟล์ที่ถูกละเว้นจะถูกลบด้วย มันมีประโยชน์ถ้าคุณทำกับ. gignignore ของคุณและมีบางอย่างที่เป็นประโยชน์ (เช่นในกรณีของฉัน) ( git-scm.com/docs/git-clean )
Keeprock

1
ด้วยโฟลเดอร์ส่วนเกินgit statusจะบอกไดเรกทอรีการทำงานให้คุณสะอาด - โกหก! git clean -dfขอบคุณที่ทำงาน
Leo

5
โปรดทราบว่าgit clean -dfจะลบไฟล์อย่างถาวร บนระบบที่คล้าย UNIX ระบบจะเรียกunlink()และไฟล์ที่ถูกลบของคุณจะไม่สามารถกู้คืนได้
Hanxue

11
OP ถามถึงการยกเลิกการจัดเก็บไฟล์ คุณแนะนำให้เขาลบไฟล์ ฉันขอแนะนำให้คุณอ่านเกี่ยวกับพื้นที่การจัดเตรียมก่อนที่จะตอบ
Antony Hatchkins

ขอบคุณที่ลบโครงการที่ยังไม่ได้บันทึกทั้งหมด
Vansuita Jr.

7

ตามที่ระบุไว้ในคำตอบอื่น ๆ git resetที่คุณควรใช้ git add -Aนี้จะยกเลิกการดำเนินการของ

หมายเหตุ: git resetเทียบเท่ากับgit reset --mixedสิ่งนี้

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


2
.. และเพื่อลบไฟล์เดียวออกจากพื้นที่การแสดงละครคุณสามารถทำได้git reset filenameToNotCommit
SherylHohman


1

คุณสามารถรีเซ็ตพื้นที่การแสดงละครได้หลายวิธี:

  1. รีเซ็ต HEAD และเพิ่มไฟล์ที่จำเป็นทั้งหมดเพื่อเช็คอินอีกครั้งดังนี้:

     git reset HEAD ---> removes all files from the staging area
     git add <files, that are required to be committed>
     git commit -m "<commit message>"
     git push 
    

อะไรทำให้คำตอบนี้แตกต่างจากคำตอบหกข้อที่มีอยู่
Antony Hatchkins

1

ในการลบไฟล์ทั้งหมดออกจากพื้นที่การจัดเตรียมการใช้ -
git reset
เพื่อลบการใช้ไฟล์เฉพาะ -
git reset "File path"


1

ใช้

git reset HEAD

การดำเนินการนี้จะลบไฟล์ทั้งหมดออกจากพื้นที่จัดเตรียม


1

หากมีการเพิ่มไฟล์ที่ไม่ต้องการลงในพื้นที่จัดแสดง แต่ยังไม่ได้ทำการยืนยันการรีเซ็ตแบบง่ายจะทำงาน:

$ git reset HEAD file
# Or everything
$ git reset HEAD .

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

git checkout -- .

0

ใช้ " git reset HEAD <file>..." เพื่อ unstage fils

เช่น: unstage ไฟล์ทั้งหมด

git reset HEAD .

เพื่อ unstage ไฟล์เดียว

git reset HEAD nameFile.txt

-3

ฉันลองใช้วิธีการเหล่านี้ทั้งหมด แต่ไม่มีใครทำงานให้ฉันได้ ฉันลบไฟล์ .git โดยใช้rm -rf .gitแบบฟอร์มการเก็บข้อมูลท้องถิ่นและหลังจากนั้นอีกไม่ได้git initและgit addและคำสั่งประจำ มันได้ผล


4
การอ่านเอกสาร git นั้นให้ผลตอบแทนมากกว่าการทำตามคำแนะนำจากxkcd.com/1597 ;)
Antony Hatchkins

1
บางทีคุณอาจมีปัญหาความสมบูรณ์ในกรณีเฉพาะของคุณและนี่คือตัวเลือกที่เหลือ แต่ก็ไม่แนะนำ
Shad

โปรดอย่าทำเช่นนี้คุณจะทำลาย repo คอมไพล์ทั้งหมดของคุณ
Lennart Rolland

-5

วิธีที่ดีที่สุดในการยกเลิกไฟล์ของคุณที่มีอยู่แล้วในพื้นที่จัดเตรียมคือการ รีเซ็ต git - ฮาร์ด ซึ่งนำไฟล์ staged กลับมา โปรดใช้ความระมัดระวังในตอนนี้ซึ่งจะลบการเปลี่ยนแปลงทั้งแบบ staged และ unstaged


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