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


1230

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

คำถาม:ฉันจะลบหนึ่งในไฟล์เหล่านั้นออกจากพื้นที่จัดเตรียมได้อย่างไร แต่ไม่ลบออกจากดัชนีหรือยกเลิกการเปลี่ยนแปลงไฟล์เอง?


40
พื้นที่การแสดงละครเป็นดัชนีดังนั้นบางทีคุณสามารถอธิบายให้ชัดเจนว่าคุณหมายถึงอะไร
CB Bailey


เป็นไปได้ที่ซ้ำกันของวิธีการเลิกทำการ 'git add' ก่อนส่ง
TungstenX

คำตอบ:


1902

หากฉันเข้าใจคำถามอย่างถูกต้องคุณเพียงแค่ต้องการ "เลิกทำ" สิ่งgit addที่ทำเพื่อไฟล์นั้น

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

git reset HEAD -- <file>

หากคุณต้องการลบไดเรกทอรีทั้งหมด (โฟลเดอร์)ออกจากพื้นที่จัดเตรียมใช้

git reset HEAD -- <directoryName>

การแก้ไขของคุณจะถูกเก็บไว้ เมื่อคุณเรียกใช้git statusไฟล์จะปรากฏขึ้นอีกครั้งตามที่แก้ไข แต่ยังไม่จัดฉาก

ดูgit resetหน้าคนสำหรับรายละเอียด


41
ขอบคุณ ... ฉันเพิ่งสังเกตเห็นว่ามีการระบุไว้ข้างต้นไฟล์ staged เดาว่าฉันกำลังดูหน้าจอนั้นนานมากฉันก็เลือกที่จะเลือกสิ่งที่ฉันอยากเห็น
PHLAK

2
นี่เป็นการเปลี่ยนแปลงที่ไม่เปลี่ยนแปลงทั้งหมดของฉันตรงกันข้ามกับทุกคำแนะนำที่ฉันได้รับทุกที่ (หน้าคนที่นี่เพื่อน & c) ฉันคิดอยู่เรื่อย ๆ ว่ามันจะทำในสิ่งที่โฆษณา แต่ไม่
rektide

6
จะมีการลบไฟล์ออกจากการแสดงเมื่อยังไม่ได้ทำพันธสัญญากับ repo หรือไม่?
Jared Forsyth

3
ฉันยังคงมาและมาถึงคำถามนี้ ทำไมฉันถึงไม่สามารถลงคะแนนซ้ำอีกครั้งได้? :)
Puce

3
@Jared Forsyth ในการลบไฟล์ที่ไม่เคยกระทำจากสเตจใช้คำสั่งgit rm --cached FILEตามคำแนะนำอื่น
chmike

151
git rm --cached FILE

,

git rm -r --cached CVS */CVS

28
จริง แต่มันจะดีกว่าที่จะใช้git resetที่นี่ฉันคิดว่าในขณะที่คุณอาจ ommit - ตัวเลือกที่เก็บไว้และเศร้าอย่างรวดเร็วโดยใช้git rmคำสั่ง :-) กับgit resetคุณในด้านความปลอดภัยถ้าคุณลืมที่จะเพิ่ม "ตัวเลือกบางอย่าง" มันจะ เก็บการเปลี่ยนแปลงเพื่อให้ "ปลอดภัย" สำหรับการใช้งานประจำวัน (ฉันกำลังพูดถึงgit reset --hard)
Konrad 'ktoso' Malawski

20
วิธีนี้มีประโยชน์ถ้าคุณยังไม่เคยทำอะไรมาก่อน
ลูกแมวบางคน

2
git rm --cached FILEขั้นตอนการลบไฟล์โดยไม่ต้องลบไฟล์ในรูปแบบต้นไม้การทำงาน git addนี้แตกต่างจากคำถามซึ่งเป็นเรื่องเกี่ยวกับความหายนะ
Sampo Smolander

1
คำตอบนี้จะเกิดข้อผิดพลาดหากคุณลบไฟล์ออกจากแผนผังการทำงาน
ซามูเอลโรเบิร์ต

3
git rm --cachedจะทำให้ไฟล์ถูกลบออกจากดัชนีเช่นไฟล์นั้นจะกลายเป็นไฟล์ที่ไม่ได้ติดตาม ฉันไม่คิดว่านี่คือสิ่งที่ OP ต้องการ โปรดดูหัวข้อที่เกี่ยวข้องที่นี่: stackoverflow.com/questions/45047810/…
smwikipedia


53

ดังนั้นการปรับแต่งเล็กน้อยกับคำตอบของ Tim Henigan: คุณต้องใช้ - ต่อหน้าชื่อไฟล์ มันจะมีลักษณะเช่นนี้:

git reset HEAD -- <file>

6
สิ่งที่--ต้องทำและทำไมต้องเพิ่มมัน ฉันทำgit reset HEAD <file>และมันได้ผล
เปาโล

15
--เป็นตัวหาร ในกรณีที่ชื่อไฟล์ไม่เป็นทางการเช่น ( -fหรือmaster) git จะตีความว่าเป็นอาร์กิวเมนต์บรรทัดคำสั่งหรือชื่อสาขาแทนชื่อไฟล์ ดูที่นี่
Andrew

3
สิ่งนี้ใช้ได้กับฉันโดยที่คำสั่งไม่มี - ไม่ได้เกิดจากไม่มีข้อผูกมัดก่อนหน้าสำหรับไฟล์นั้น ขอบคุณ
Matt

17
git reset filename.txt

หากคุณมีการปรับเปลี่ยนใน filename.txt คุณเพิ่มไปยังขั้นตอนโดยไม่ได้ตั้งใจและคุณต้องการลบไฟล์ออกจากการจัดเตรียม แต่คุณไม่ต้องการสูญเสียการเปลี่ยนแปลง


6

ในกรณีที่คุณต้องการลบชุดย่อยของการเปลี่ยนแปลงในไฟล์คุณสามารถใช้:

git reset -p

หรือ

git reset -p <file_name>

คำสั่งนี้เป็นพื้นหลังของgit add -p: มันจะลบการเปลี่ยนแปลงที่เลือกออกจากพื้นที่การแสดงเท่านั้น ฉันพบว่ามีประโยชน์อย่างยิ่งในบางสิ่งที่ "เพิ่ม"


4

หากคุณต้องการลบไฟล์ตามรูปแบบที่กำหนดและคุณใช้อยู่git rm --cachedคุณสามารถใช้รูปแบบไฟล์ -Glob ได้เช่นกัน

ดูที่นี่


2

คุณต้องการ:

  • ส่งผลกระทบต่อไฟล์เดียว

  • ลบไฟล์ออกจากพื้นที่จัดเตรียม

  • ไม่ลบไฟล์เดียวจากดัชนี

  • อย่าเลิกทำการเปลี่ยนแปลงตัวเอง

และทางออกคือ

git reset HEAD file_name.ext

หรือ

git reset HEAD path/to/file/file_name.ext

2

เมื่อคุณทำเช่นgit statusนั้น Git จะบอกให้คุณทราบถึงวิธีการไม่เสถียร:

Changes to be committed: (use "git reset HEAD <file>..." to unstage).

ดังนั้นgit reset HEAD <file>ทำงานสำหรับฉันและการเปลี่ยนแปลงที่ถูกยกเลิกการสัมผัส


2

ฉันคิดว่าคุณอาจสับสนกับแนวคิดของดัชนีตามที่@CB Bailey แสดงความคิดเห็น:

พื้นที่การแสดงละครคือดัชนี

คุณสามารถพิจารณาการจัดเตรียมไดเรกทอรีและดัชนีแบบเดียวกัน
ดังนั้นเช่นเดียวกับคำตอบของ @Tim Heniganฉันเดาว่า:

คุณเพียงแค่ต้องการ "เลิกทำ" สิ่งgit addที่ทำกับไฟล์นั้น



นี่คือคำตอบของฉัน:

โดยทั่วไปมีสองวิธีในการยกเลิกการดำเนินการตามขั้นตอนตามคำตอบอื่น ๆ ที่กล่าวถึงแล้ว:

git reset HEAD <file>

และ

git rm --cached <file>

แต่ความแตกต่างคืออะไร?

สมมติไฟล์ที่ได้รับการจัดฉากและอยู่ในไดเรกทอรีการทำงานมากเกินไป, การใช้งานgit rm --cached <file>ถ้าคุณต้องการที่จะลบออกจากการแสดงละครไดเรกทอรีและเก็บไฟล์ในไดเรกทอรีการทำงาน แต่ขอให้สังเกตว่าการดำเนินการนี้จะไม่เพียง แต่ลบไฟล์ออกจากไดเรกทอรีการจัดเตรียมแต่ยังทำเครื่องหมายไฟล์เช่นเดียวกับdeletedในการจัดเตรียมไดเรกทอรีถ้าคุณใช้

git status

หลังจากการดำเนินการนี้คุณจะเห็นสิ่งนี้:

        deleted:    <file>

มันเป็นบันทึกของการลบไฟล์จากไดเรกทอรีการแสดงละคร หากคุณไม่ต้องการเก็บบันทึกนั้นและเพียงต้องการยกเลิกการดำเนินการขั้นตอนก่อนหน้าของไฟล์ให้ใช้git reset HEAD <file>แทน


-------- สิ้นสุดคำตอบ --------

PS: ฉันสังเกตเห็นบางคำตอบที่กล่าวถึง:

git checkout -- <file>

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


2

หลังจากเวอร์ชัน2.23Git ได้แนะนำgit restoreคำสั่งที่คุณสามารถใช้ทำสิ่งนั้นได้ การอ้างอิงเอกสารอย่างเป็นทางการ:

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

คำสั่งนอกจากนี้ยังสามารถใช้ในการกู้คืนเนื้อหาในดัชนีที่มี หรือเรียกคืนทั้งต้นทำงานและดัชนีที่มี--staged--staged --worktree

ดังนั้นคุณสามารถเรียกใช้git restore --staged <path>และเลิกทำไฟล์ได้ แต่ยังคงการเปลี่ยนแปลงที่คุณทำไว้ โปรดจำไว้ว่าหากไฟล์ไม่ได้ถูกจัดฉากคุณจะสูญเสียการเปลี่ยนแปลงทั้งหมดที่ทำไป


1

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

git add .

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

ไม่เหมาะที่จะทำอะไรเป็นพวง

git add path/to/file1 path/to/file2

หากคุณมีไดเรกทอรีที่ซ้อนกันจำนวนมาก (ซึ่งเป็นกรณีในโครงการส่วนใหญ่) - ทำให้น่ารำคาญ

นั่นคือเมื่อ Git GUI มีประโยชน์ (อาจเป็นเพียงครั้งเดียวที่ฉันใช้งาน) เพียงแค่เปิด Git GUI มันจะแสดงส่วนไฟล์ที่เป็นฉากและไม่มีฉาก เลือกไฟล์จากส่วนของฉากที่คุณต้องการยกเลิกการขึ้นเวทีและกด

Ctrl+U (สำหรับ windows)

เพื่อ unstage พวกเขา


1

สำหรับรุ่นใหม่ของ Git git restore --staged <file>มี

เมื่อฉันทำgit statusกับรุ่น Git 2.26.2.windows.1ก็ขอแนะนำสำหรับ unstaging:

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)

( โพสต์นี้แสดงให้เห็นว่าในรุ่นก่อนหน้านี้git reset HEADได้รับการแนะนำ ณ จุดนี้)

ผมขอแนะนำให้นี้โพสต์อธิบายความแตกต่างระหว่างgit revert, git restoreและและพารามิเตอร์เพิ่มเติมสำหรับgit resetgit restore


0

ตัวอย่างของฉัน:

$ git status
On branch feature/wildfire/VNL-425-update-wrong-translation
Your branch and 'origin/feature/wildfire/VNL-425-update-wrong-translation' have diverged,
and have 4 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   ShopBack/Source/Date+Extension.swift
    modified:   ShopBack/Source/InboxData.swift
    modified:   ShopBack/en.lproj/Localizable.strings

ตามที่คุณอาจสังเกตเห็น

> Changes to be committed:
>       (use "git reset HEAD <file>..." to unstage)

-1

คุณต้องอยู่ในไดเรกทอรีของไฟล์แล้วพิมพ์คำสั่งต่อไปนี้ลงในเทอร์มินัล

git reset HEAD .

ข้อสันนิษฐานคือคุณต้องรีเซ็ตหนึ่งไฟล์เท่านั้น


-4

หากต้องการหยุดทุกอย่างพร้อมกันให้รันคำสั่งนี้

git reset HEAD -- .

ไม่สามารถเพิ่มไฟล์หลังจากนั้น
Karl Morrison

-10

git checkout -- <file>

มันทำงานได้อย่างสมบูรณ์แบบเพื่อลบไฟล์ออกจาก Staging Area


4
ดังที่ระบุไว้ด้านล่างการย้อนกลับเป็นการเปลี่ยนแปลงไฟล์ซึ่งจะไปอีกขั้นหนึ่งเกินกว่าที่ OP ต้องการจะดำเนินการ
stolli

git rm flie.txt --cached
Juan Ramirez

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