จะลบไฟล์ออกจากดัชนีในคอมไพล์ได้อย่างไร?


355

วิธีลบไฟล์ออกจากดัชนี (= staging area = cache) โดยไม่ลบไฟล์ออกจากระบบไฟล์?


5
คุณหมายถึง "รีเซ็ตสิ่งที่เคยมีมาก่อน" หรือ "ลบเพราะฉันไม่ต้องการให้ไฟล์นั้นอีกต่อไป"?
Andrew Aylett

ในกรณีของฉันมันเหมือนกันเพราะไฟล์ไม่เคยมีมาก่อน ...
hcs42

คำตอบ:


504

คุณต้องการ:

git rm --cached [file]

หากคุณไม่ใช้--cachedตัวเลือกนี้จะเป็นการลบออกจากแผนผังการทำงาน git rmปลอดภัยกว่าเล็กน้อยgit resetเนื่องจากคุณจะได้รับการเตือนหากเนื้อหาที่จัดฉากไม่ตรงกับส่วนปลายของสาขาหรือไฟล์บนดิสก์ (ถ้าไม่คุณต้องเพิ่ม--force)


8
วิธีนี้ใช้งานได้ดีเช่นถ้าคุณตรวจสอบโดยไม่ตั้งใจในไฟล์ build ตัวกลางหรือไฟล์การกำหนดค่าท้องถิ่นที่ไม่ได้ทำให้เป็น. gitignore ของคุณ ใช้git rm --cachedเพื่อลบออกจาก repo เพิ่มไฟล์หรือไดเรกทอรีที่เกี่ยวข้องใน. gitignore, stage และกระทำตามปกติ พวกเขาจะหายไปจาก repo แต่ยังคงไม่มีใครแตะต้องในต้นไม้ท้องถิ่นของคุณและคุณจะไม่ตรวจสอบพวกเขาอีกครั้งโดยไม่ตั้งใจ
Ionoclast Brigham

22
นอกจากนี้ยังลบไฟล์จาก repo (ระยะไกล) หลังจากที่คุณส่งและส่ง
powder366

6
สิ่งนี้ไม่ได้ลบออกจากดัชนี แต่ทำเครื่องหมายว่าถูกลบในดัชนี
JotaBe

4
คำตอบนี้น่าจะผิดเนื่องจากลบไฟล์จาก repo (ตามที่ @ powder366 ได้กล่าวไว้แล้ว) ซึ่งไม่ได้เป็นผลลัพธ์ที่ตั้งใจไว้
โอโตโม

1
วิธีนี้ไม่ได้ผลสำหรับฉัน มันทำเครื่องหมายไฟล์ที่ระบุว่าถูกลบแล้วลบออกจาก repo ท้องถิ่น
paiego

134

การทำเช่นนี้จะเป็นการสร้าง <file> ให้กับคุณ (โดยไม่ลบหรือแก้ไขไฟล์):

git reset <file>

6
สิ่งนี้จะลบการเปลี่ยนแปลงล่าสุดสำหรับไฟล์เฉพาะ แต่เก็บไว้ใน repo (ระยะไกล) หลังจากส่งและส่ง
powder366

1
นี่คือคำตอบที่ฉันต้องการ HEADโปรดทราบว่าคุณไม่ได้มีการระบุ
Michael Dorst

จุดดี @MichaelDorst ฉันได้อัปเดตคำตอบเพื่อละเว้นHEAD!
David Underhill

3
git reset HEAD <file> 

สำหรับการลบไฟล์เฉพาะออกจากดัชนี

และ

git reset HEAD

สำหรับการลบไฟล์ที่จัดทำดัชนีทั้งหมด


1

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

เพียงใช้เครื่องมือที่ใช้ GUI ซึ่งสนับสนุนการจัดการดัชนีตัวอย่างเช่น:

  • git gui <- ใช้เฟรมเวิร์ก Tk window - สไตล์ที่คล้ายคลึงกับ gitk
  • git cola <- อินเตอร์เฟส GUI สไตล์ที่ทันสมัยกว่า

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


วิธีการเกี่ยวกับมุมมองที่แตกต่าง: ถ้าคุณทำผิดพลาดในขณะที่ใช้คำสั่งที่แนะนำอย่างใดอย่างหนึ่งที่ค่อนข้างลับ:

  • git rm --cached [file]
  • git reset HEAD <file>

... คุณมีโอกาสที่แท้จริงในการสูญเสียข้อมูล - หรืออย่างน้อยก็หาได้ยาก ถ้าคุณต้องการจริงๆที่จะทำนี้มีความถี่สูงมากโดยใช้เครื่องมือ GUI ที่มีแนวโน้มที่จะมีความปลอดภัย


ทำงานโดยไม่มีดัชนี

จากความคิดเห็นและการโหวตฉันได้ตระหนักว่ามีผู้คนมากมายที่ใช้ดัชนีอยู่ตลอดเวลา ฉันไม่. นี่คือวิธี:

  • มอบสำเนาการทำงานทั้งหมดของฉัน (กรณีทั่วไป): git commit -a
  • กระทำเพียงไม่กี่ไฟล์: git commit (list of files)
  • ยอมรับทั้งหมด แต่ไฟล์ที่ถูกแก้ไขบางส่วน: git commit -aจากนั้นแก้ไขผ่านgit gui
  • ตรวจทานการเปลี่ยนแปลงทั้งหมดเป็นสำเนาการทำงาน: git difftool --dir-diff --tool=meld

@ มาร์ติน: ฉันคิดว่ามันขึ้นอยู่กับขั้นตอนการทำงานของคุณ ในแนวทางของฉันฉันไม่เคยใช้ดัชนีโดยตรง git commit -aเมื่อฉันต้องการที่จะบันทึกการทำงานของฉันฉันเพียงแค่ทำกระทำที่เต็มไปด้วย เมื่อฉันตอบคำถามนี้มันเป็นเพราะฉันได้ทำ (แปลกใหม่) " เลือกเชอร์รี่ที่ตรงกันข้าม " ซึ่งทำให้ไฟล์ในดัชนีสำหรับคุณ แต่ฉันต้องการที่จะแก้ไขไฟล์ก่อนที่จะกระทำ ฉันลบไฟล์ออกจากดัชนีในขณะที่แก้ไขมันเพื่อให้ diffs ทำงานตามที่ฉันคุ้นเคย
nobar

กรณีการใช้งานของฉันแคบมากและไร้ประโยชน์จริง ๆ : สร้างสาขา; เพิ่มโฟลเดอร์ที่เต็มไปด้วยไฟล์สำหรับสาขาเท่านั้น เปลี่ยนเป็นต้นแบบ ผสาน; ops, เพิ่มโฟลเดอร์ที่ไม่ถูกต้องเป็นมาสเตอร์, เพิ่มไปยัง gitignore; ไฟล์จะไม่ถูกลบออกจากการกระทำ - ได้รับทางออกที่ดีกว่าคือการใช้งานได้rmทันที แต่ก่อนอื่นฉันคิดว่าการสลับแบรนช์จะไม่ฆ่าโฟลเดอร์ที่ถูกเพิกเฉย แต่ ... ฉันใช้ github "gui based" ซึ่งเป็นเครื่องมือที่ดีพอสำหรับฉันและรองรับการจัดการดัชนียกเว้นว่ามันไม่รองรับ แล้วฉันจะใช้ 2 gui เพื่อการใช้งานที่แคบได้อย่างไร ยังไม่เห็นด้วยกับคำตอบ
cregox

3
นี่คือคำตอบที่ไม่เป็นที่นิยมอย่างแน่นอน อย่างไรก็ตามฉันค่อนข้างแน่ใจว่าวิธีที่ฉันแนะนำเป็นวิธีที่เหมาะสมสำหรับบางคน (รวมตัวเองด้วย) ฉันใช้เครื่องมือเหล่านี้เพื่อจัดการดัชนีสองสามครั้งต่อปี
nobar

1
ทุกวันนี้เครื่องมือแก้ไขการเขียนโปรแกรมและ IDE มีแนวโน้มที่จะรองรับการปรับเปลี่ยนดัชนีแบบกราฟิก อะตอมของ GitHub อย่างน้อยก็ทำ
nobar

1
ฉันชอบอินเตอร์เฟส cli มากกว่า gui ทุกวันแม้ว่ามันจะอันตรายกว่าก็ตาม มันจะทำให้ฉันใช้ git ได้โดยไม่ต้องมี gui ซึ่งฉันรู้สึกสบายใจ (แทนที่จะหลงทางเมื่อฉันไม่สามารถติดตั้งเครื่องมือเหล่านี้บนเซิร์ฟเวอร์ระยะไกลได้) ทั้งหมดที่กล่าวคำตอบนี้ถูกต้องสมบูรณ์และไม่สมควรได้รับ downvotes "cli elitist" +1 สำหรับการให้ทางเลือก gui ที่ดี!
SidOfc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.