Làm thế nào để loại bỏ một tập tin từ chỉ mục trong git?


355

Làm cách nào để xóa tệp khỏi chỉ mục (= staging area = cache) mà không xóa tệp khỏi hệ thống tệp?


5
Bạn có nghĩa là "đặt lại về những gì đã có trước đó" hoặc "xóa, vì tôi không muốn tập tin đó nữa"?
Andrew Aylett

Trong trường hợp của tôi, nó giống nhau bởi vì tập tin không tồn tại trước đó ...
hcs42

Câu trả lời:


504

Bạn muốn:

git rm --cached [file]

Nếu bạn bỏ qua --cachedtùy chọn, nó cũng sẽ xóa nó khỏi cây làm việc. git rman toàn hơn một chút git reset, bởi vì bạn sẽ được cảnh báo nếu nội dung theo giai đoạn không khớp với đầu của nhánh hoặc tệp trên đĩa. (Nếu không, bạn phải thêm --force.)


8
Điều này cũng hoạt động rất tốt nếu ví dụ: bạn vô tình kiểm tra trong một số tệp trung gian xây dựng hoặc tệp cấu hình cục bộ không đưa nó vào .gitignore của bạn; sử dụng git rm --cachedđể xóa chúng khỏi repo, thêm các tệp hoặc thư mục có liên quan vào .gitignore, giai đoạn và cam kết như bình thường. Chúng sẽ biến mất khỏi repo nhưng vẫn còn nguyên vẹn trong cây địa phương của bạn và bạn sẽ không vô tình kiểm tra lại chúng.
Ionoclast Brigham

22
Điều này cũng xóa tệp khỏi repo (từ xa) sau khi bạn cam kết và đẩy.
bột366

6
Điều này không xóa nó khỏi chỉ mục, nhưng đánh dấu nó là bị xóa trong chỉ mục.
JotaBe

4
Câu trả lời này rất có thể sai vì nó xóa một tệp khỏi repo (như @ Powder366 đã được đề cập) không phải là kết quả dự định.
otomo

1
Giải pháp này không hiệu quả với tôi. Nó đánh dấu tập tin được chỉ định là đã xóa, và sau đó xóa nó khỏi repo cục bộ.
paiego

134

Điều này sẽ loại bỏ <file> cho bạn (mà không xóa hoặc sửa đổi tệp):

git reset <file>

6
Điều này loại bỏ thay đổi mới nhất cho tệp cụ thể nhưng giữ nó trong repo (từ xa) sau khi cam kết và đẩy.
bột366

1
Đây là câu trả lời tôi đang tìm kiếm. Lưu ý rằng bạn không phải chỉ định HEAD.
Michael Dorst

Điểm tốt @MichaelDorst. Tôi đã cập nhật câu trả lời để bỏ qua HEAD!
David Underhill

3
git reset HEAD <file> 

để xóa một tập tin cụ thể khỏi chỉ mục.

git reset HEAD

để loại bỏ tất cả các tập tin được lập chỉ mục.


1

Tùy thuộc vào quy trình làm việc của bạn, đây có thể là điều mà bạn cần hiếm khi đủ để cố gắng tìm ra giải pháp dòng lệnh (trừ khi bạn tình cờ làm việc mà không có giao diện đồ họa vì một số lý do).

Chỉ cần sử dụng một trong các công cụ dựa trên GUI hỗ trợ quản lý chỉ mục, ví dụ:

  • git gui <- sử dụng khung cửa sổ Tk - kiểu tương tự như gitk
  • git cola <- giao diện GUI kiểu hiện đại hơn

Những thứ này cho phép bạn di chuyển các tệp vào và ra khỏi chỉ mục bằng cách bấm và nhấp. Họ thậm chí còn có hỗ trợ để chọn và di chuyển các phần của tệp (thay đổi riêng lẻ) đến và từ chỉ mục.


Làm thế nào về một quan điểm khác nhau: Nếu bạn gây rối trong khi sử dụng một trong các lệnh được đề xuất, khá khó hiểu:

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

... Bạn có cơ hội thực sự mất dữ liệu - hoặc ít nhất là làm cho nó khó tìm. Trừ khi bạn thực sự cần phải làm điều này với tần suất rất cao, sử dụng công cụ GUI có thể sẽ an toàn hơn .


Làm việc mà không có chỉ số

Dựa trên các nhận xét và phiếu bầu, tôi đã nhận ra rằng rất nhiều người sử dụng chỉ số mọi lúc. Tôi không. Đây là cách thực hiện:

  • Cam kết toàn bộ bản sao làm việc của tôi (trường hợp điển hình): git commit -a
  • Cam kết chỉ một vài tệp: git commit (list of files)
  • Cam kết tất cả trừ một vài tệp đã sửa đổi: git commit -asau đó sửa đổi quagit gui
  • Xem xét đồ họa tất cả các thay đổi đối với bản sao làm việc: git difftool --dir-diff --tool=meld

@Martin: Tôi đoán nó phụ thuộc vào quy trình làm việc của bạn. Theo cách tiếp cận của tôi, tôi không bao giờ sử dụng chỉ số trực tiếp. Khi tôi muốn lưu công việc của mình, tôi chỉ cần thực hiện đầy đủ các cam kết với git commit -a. Khi tôi trả lời câu hỏi này, đó là vì tôi đã làm (một kỳ lạ) " cherry pick ngược đưa các tệp vào chỉ mục cho bạn, nhưng tôi muốn chỉnh sửa một tệp trước khi cam kết. Tôi lấy tập tin ra khỏi chỉ mục trong khi tôi chỉnh sửa nó để diffs hoạt động theo cách mà tôi đã từng sử dụng.
tộc

trường hợp sử dụng của tôi rất hẹp và vô dụng: tạo ra một nhánh; thêm thư mục chứa đầy các tệp cho chi nhánh; chuyển sang làm chủ; hợp nhất; ops, thêm thư mục sai vào master, thêm nó vào gitignore; các tệp sẽ không bị xóa khỏi cam kết - được cấp, một giải pháp tốt hơn sẽ chỉ là sử dụng rmngay lập tức nhưng trước tiên tôi nghĩ rằng các nhánh chuyển đổi sẽ không giết chết thư mục bị bỏ qua . nhưng ... tôi sử dụng công cụ "gui dựa" github đủ tốt cho tôi và hỗ trợ một số quản lý chỉ mục trừ khi nó không hỗ trợ điều này. Vì vậy, những gì, tôi nên sử dụng 2 gui cho sử dụng hẹp? vẫn không thể đồng ý với câu trả lời.
cregox

3
Đây là một câu trả lời quyết định không phổ biến. Tuy nhiên, tôi khá chắc chắn rằng cách tiếp cận mà tôi đề xuất là phương pháp phù hợp với một số người (bao gồm cả bản thân tôi). Tôi sử dụng một trong những công cụ này để thao túng chỉ số một vài lần mỗi năm.
tộc

1
Ngày nay các trình soạn thảo lập trình và IDE có khả năng hỗ trợ thao tác chỉ mục đồ họa. Ít nhất là nguyên tử của GitHub .
tộc

1
Tôi thích giao diện cli hơn gui bất cứ ngày nào mặc dù nó nguy hiểm hơn. Nó sẽ cho phép tôi sử dụng git ngay cả khi không có gui mà tôi thấy thoải mái (thay vì bị mất khi tôi không thể cài đặt các công cụ như vậy trên máy chủ từ xa chẳng hạn). Tất cả những gì đã nói câu trả lời này là hoàn toàn hợp lệ và không xứng đáng với những người hạ thấp "cli elitist", +1 vì đã cung cấp một sự thay thế gui tốt!
SidOfc
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.