Làm cách nào để xóa một tệp khỏi khu vực tổ chức (hoàn tác thêm git)?


1231

Tình hình: Tôi có một kho lưu trữ Git với các tệp đã có trong chỉ mục. Tôi thay đổi một số tệp, mở Git và thêm các tệp này vào khu vực tổ chức của mình bằng "git add."

Câu hỏi: Làm cách nào để xóa một trong các tệp đó khỏi khu vực tổ chức nhưng không xóa tệp đó khỏi chỉ mục hoặc hoàn tác các thay đổi đối với chính tệp đó?


40
Khu vực tổ chức chỉ số, vì vậy có lẽ bạn có thể làm rõ chính xác ý của bạn là gì?
CB Bailey


Câu trả lời:


1903

Nếu tôi hiểu chính xác câu hỏi, bạn chỉ muốn "hoàn tác" git add hỏi đã được thực hiện cho tệp đó.

Nếu bạn cần xóa một tệp khỏi khu vực tổ chức, hãy sử dụng

git reset HEAD -- <file>

Nếu bạn cần xóa toàn bộ thư mục (thư mục) khỏi khu vực tổ chức, hãy sử dụng

git reset HEAD -- <directoryName>

Sửa đổi của bạn sẽ được lưu giữ. Khi bạn chạy git statustệp sẽ một lần nữa hiển thị dưới dạng đã sửa đổi nhưng chưa được dàn dựng.

Xem git resettrang người đàn ông để biết chi tiết.


41
Cảm ơn ... Tôi chỉ nhận thấy rằng nó được nêu ngay phía trên các tập tin được dàn dựng. Đoán rằng tôi đã nhìn vào màn hình đó rất lâu, tôi đã chọn lọc những gì tôi muốn xem.
PHLAK

2
Điều này làm thay đổi tất cả những thay đổi của tôi, trái với mọi lời khuyên tôi đã nhận được ở bất cứ đâu (trang nam, ở đây, bạn bè, & c). Tôi cứ nghĩ một ngày nào đó nó sẽ làm những gì được quảng cáo, nhưng không.
rektide

6
Có cách nào để xóa các tập tin khỏi dàn dựng khi không có bất kỳ cam kết nào với repo không?
Jared Forsyth

3
Tôi tiếp tục đến và đi đến câu hỏi này. Tại sao tôi không thể nâng cấp nó nhiều lần hơn? :)
Puce

3
@Jared Forsyth Để xóa một tệp không bao giờ được cam kết từ giai đoạn sử dụng lệnh git rm --cached FILEnhư được đề xuất bởi một câu trả lời khác.
chmike

151
git rm --cached FILE

,

git rm -r --cached CVS */CVS

28
đúng, nhưng nó tốt hơn để sử dụng git resetở đây tôi nghĩ, như bạn có thể ommit tùy chọn --chached và nhận được buồn một cách nhanh chóng bằng cách sử dụng git rmlệnh :-) Với git resetbạn ở bên an toàn, nếu bạn quên thêm "một số tùy chọn" của nó sẽ giữ thay đổi để "an toàn hơn" cho việc sử dụng hàng ngày (tôi đang nói về git reset --hard).
Konrad 'ktoso' Malawski

20
Phương pháp này hữu ích nếu bạn không có các cam kết trước đó.
Một số chú mèo con

2
git rm --cached FILEgiai đoạn xóa tập tin, mà không xóa tập tin hình thức cây làm việc. Điều này khác với câu hỏi, đó là về việc hoàn tác git add.
Sampo Smolander

1
Câu trả lời này đưa ra một lỗi nếu bạn đã xóa tệp khỏi cây làm việc.
Samuel Robert

3
git rm --cachedsẽ khiến tập tin bị xóa khỏi chỉ mục, tức là tập tin sẽ trở thành tập tin không bị theo dõi . Tôi không nghĩ đây là điều OP muốn. Vui lòng xem một chủ đề liên quan ở đây: stackoverflow.com/questions/45047810/ từ
smwikipedia

88

git reset <file>

Hoạt động cho dù bạn có bất kỳ cam kết trước đó.


53

Vì vậy, một điều chỉnh nhỏ cho câu trả lời của Tim Henigan: bạn cần sử dụng - trước tên tệp. Nó sẽ trông như thế này:

git reset HEAD -- <file>

6
Những gì --làm và tại sao thêm nó? Tôi đã làm git reset HEAD <file>và nó đã làm việc.
Paolo

15
--là một loại chia. Trong trường hợp tên tệp là không thông thường, ví dụ: ( -fhoặc master) git sẽ hiểu nó là đối số dòng lệnh hoặc tên nhánh thay vì tên tệp. Xem tại đây
Andrew

3
Điều này làm việc cho tôi khi lệnh không có - không phải do không có cam kết trước đó cho tệp đó. Cảm ơn.
Matt

17
git reset filename.txt

Nếu bạn có một sửa đổi trong filename.txt, bạn đã thêm nó vào giai đoạn do nhầm lẫn và bạn muốn xóa tệp khỏi dàn nhưng bạn không muốn mất các thay đổi.


6

Trong trường hợp bạn chỉ muốn xóa một tập hợp con các thay đổi cho tệp của mình, bạn có thể sử dụng:

git reset -p

hoặc là

git reset -p <file_name>

Lệnh này về cơ bản là ngược lại git add -p: nó sẽ chỉ loại bỏ các thay đổi được chọn khỏi khu vực tổ chức. Tôi thấy nó cực kỳ hữu ích trong việc "bỏ qua" một cái gì đó mà tôi đã thêm nhầm.


4

Nếu bạn muốn xóa các tệp theo một mẫu nhất định và bạn đang sử dụng git rm --cached, bạn cũng có thể sử dụng các mẫu toàn cầu tệp.

Xem ở đây .


2

Bạn muốn:

  • Ảnh hưởng đến một tập tin duy nhất

  • Xóa tệp khỏi khu vực tổ chức

  • Không xóa tập tin duy nhất khỏi chỉ mục

  • Đừng hoàn tác thay đổi

và giải pháp là

git reset HEAD file_name.ext

hoặc là

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

2

Khi bạn làm như vậy git status, Git sẽ cho bạn biết cách mở màn:

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

Vì vậy, git reset HEAD <file>làm việc cho tôi và những thay đổi là không cảm động.


2

Tôi nghĩ có lẽ bạn đã nhầm lẫn với khái niệm chỉ số , như @CB Bailey nhận xét:

Khu vực tổ chức là chỉ số.

Bạn chỉ có thể coi thư mục dàn dựngchỉ mục là điều tương tự.
Vì vậy, giống như câu trả lời của @Tim Henigan , tôi đoán:

bạn chỉ muốn "hoàn tác" git addcái đã được thực hiện cho tập tin đó.



Đây là câu trả lời của tôi:

Thông thường, có hai cách để hoàn tác thao tác trên sân khấu , như các câu trả lời khác đã được đề cập:

git reset HEAD <file>

git rm --cached <file>

Nhưng sự khác biệt là gì?

Giả sử tập tin đã được dàn dựng và tồn tại trong thư mục làm việc , hãy sử dụng git rm --cached <file>nếu bạn muốn xóa nó khỏi thư mục dàn và giữ tệp trong thư mục làm việc . Nhưng lưu ý rằng thao tác này sẽ không chỉ xóa tệp khỏi thư mục dàn mà còn đánh dấu tệp như deletedtrong thư mục dàn , nếu bạn sử dụng

git status

Sau thao tác này, bạn sẽ thấy điều này:

        deleted:    <file>

Đó là một bản ghi của việc loại bỏ các tập tin từ thư mục dàn . Nếu bạn không muốn giữ bản ghi đó và chỉ muốn hoàn tác thao tác trước đó của tệp, hãy sử dụnggit reset HEAD <file> thay thế.


-------- KẾT THÚC TRẢ LỜI --------

PS: Tôi đã nhận thấy một số câu trả lời được đề cập:

git checkout -- <file>

Lệnh này dành cho tình huống khi tập tin đã được dàn dựng , nhưng tập tin đã được sửa đổi trong thư mục làm việc sau khi nó được dàn dựng, sử dụng thao tác này để khôi phục tập tin trong thư mục làm việc từ thư mục dàn . Nói cách khác, sau thao tác này, các thay đổi xảy ra trong thư mục làm việc của bạn , KHÔNG phải thư mục dàn của bạn .


2

Sau phiên bản 2.23, Git đã giới thiệu git restorelệnh mà bạn có thể sử dụng để làm điều đó. Trích dẫn tài liệu chính thức:

Khôi phục các đường dẫn được chỉ định trong cây làm việc với một số nội dung từ nguồn khôi phục. Nếu một đường dẫn được theo dõi nhưng không tồn tại trong nguồn khôi phục, nó sẽ bị xóa để phù hợp với nguồn.

Lệnh cũng có thể được sử dụng để khôi phục nội dung trong chỉ mục với --stagedhoặc khôi phục cả cây làm việc và chỉ mục với --staged --worktree.

Vì vậy, bạn có thể gọi git restore --staged <path>và bỏ tập tin nhưng cũng giữ những thay đổi bạn đã thực hiện. Hãy nhớ rằng nếu tệp không được dàn dựng, bạn sẽ mất tất cả các thay đổi bạn đã thực hiện đối với tệp đó.


1

Nếu bạn thay đổi nhiều tệp được theo dõi nhưng chỉ muốn tạo một vài trong số chúng, hãy thực hiện

git add .

không phải lúc nào cũng thuận lợi (hoặc được khuyến nghị) - vì nó xử lý tất cả các tệp được theo dõi (một số trường hợp bạn chỉ muốn giữ thay đổi cho chính mình và không muốn đưa chúng vào kho lưu trữ từ xa).

cũng không phải là lý tưởng để làm một loạt

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

nếu bạn có nhiều thư mục lồng nhau (đó là trường hợp trong hầu hết các dự án) - sẽ gây khó chịu

Đó là khi Git GUI hữu ích (có lẽ chỉ khi tôi sử dụng nó). Chỉ cần mở GUI Git, nó hiển thị các phần tệp được dàn dựng và không được dàn dựng. Chọn các tệp từ phần dàn dựng mà bạn muốn hủy bỏ và nhấn

Ctrl+U (cho cửa sổ)

để làm sáng tỏ họ.


1

Đối với các phiên bản mới hơn của Git, có git restore --staged <file> .

Khi tôi thực hiện git statusvới phiên bản Git, 2.26.2.windows.1nó cũng được khuyến nghị sử dụng cho giai đoạn:

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

( Bài đăng này cho thấy, trong các phiên bản trước git reset HEADđược khuyến nghị tại thời điểm này)

Tôi rất có thể đề nghị này bài giải thích sự khác nhau giữa git revert, git restoregit resetcũng như các thông số bổ sung cho git restore.


0

Mẫu của tôi:

$ 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

Như bạn có thể nhận thấy

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

-1

Bạn cần phải ở trong thư mục của tập tin và sau đó nhập đoạn sau vào terminal

git reset HEAD .

Giả định là bạn chỉ cần thiết lập lại một tệp.



-10

git checkout -- <file>

Nó hoạt động hoàn hảo để xóa các tập tin khỏi Khu vực tổ chức


4
như được lưu ý dưới đây, điều này hoàn nguyên các thay đổi đối với tệp, điều này sẽ tiến một bước xa hơn OP muốn đi.
stolli

git rm flie.txt --cached
Juan Ramirez

-11

Trong trường hợp của tôi, tôi làm

git checkout -- FILE

9
Điều này sẽ hoàn nguyên các thay đổi cho tập tin, phải không?
Martin Burch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.