Đầu git rit - đã được x


163

GitRef.org - Cơ bản :

git rmsẽ loại bỏ các mục từ khu vực tổ chức. Đây là một chút khác nhau từ git reset HEADcác tập tin "unstages". Bằng "unstage", ý tôi là nó hoàn nguyên khu vực dàn dựng với những gì đã có trước khi chúng tôi bắt đầu sửa đổi mọi thứ. git rmmặt khác, chỉ cần loại bỏ hoàn toàn tệp khỏi sân khấu, do đó nó không được bao gồm trong ảnh chụp cam kết tiếp theo, do đó sẽ xóa nó một cách hiệu quả.

Theo mặc định, a git rm filesẽ xóa hoàn toàn tệp khỏi khu vực tổ chức và cũng tắt đĩa của bạn> (thư mục làm việc). Để để tập tin trong thư mục làm việc, bạn có thể sử dụng git rm --cached.

Nhưng chính xác sự khác biệt giữa git rm --cached asdvà là git reset head -- asdgì?

Câu trả lời:


219

Có ba nơi mà một tập tin có thể là - cây, chỉ mục và bản sao làm việc. Khi bạn chỉ cần thêm một tập tin vào một thư mục, bạn đang thêm nó vào bản sao làm việc.

Khi bạn làm một cái gì đó như git add filebạn thêm nó vào chỉ mục. Và khi bạn cam kết nó, bạn cũng thêm nó vào cây.

Nó có thể sẽ giúp bạn biết ba cờ phổ biến hơn trong thiết lập lại git:

thiết lập lại git [- <mode>] [ <commit>]

Biểu mẫu này đặt lại đầu nhánh hiện tại <commit>và có thể cập nhật chỉ mục (đặt lại thành cây <commit>) và cây làm việc tùy thuộc <mode>, phải là một trong những điều sau đây:
--soft

Không chạm vào tệp chỉ mục cũng như cây làm việc (nhưng đặt lại đầu vào <commit>, giống như tất cả các chế độ làm). Điều này khiến tất cả các tệp đã thay đổi của bạn "Thay đổi được cam kết", vì trạng thái git sẽ đặt nó.

--Trộn

Đặt lại chỉ mục nhưng không phải cây làm việc (nghĩa là các tệp đã thay đổi được giữ nguyên nhưng không được đánh dấu cho cam kết) và báo cáo những gì chưa được cập nhật. Đây là hành động mặc định.

--cứng

Đặt lại chỉ mục và cây làm việc. Mọi thay đổi đối với các tệp được theo dõi trong cây làm việc <commit>đều bị loại bỏ.

Bây giờ, khi bạn làm một cái gì đó như git reset HEAD- những gì bạn thực sự đang làm git reset HEAD --mixedvà nó sẽ "đặt lại" chỉ mục về trạng thái trước khi bạn bắt đầu thêm tệp / thêm sửa đổi vào chỉ mục (thông qua git add) Trong trường hợp này, bản sao làm việc và chỉ mục (hoặc dàn) đã được đồng bộ hóa, nhưng bạn đã làm cho CHÍNH và chỉ mục được đồng bộ hóa sau khi đặt lại.

git rmmặt khác loại bỏ một tập tin khỏi thư mục làm việc và chỉ mục và khi bạn cam kết, tập tin cũng bị xóa khỏi cây. git rm --cachedtuy nhiên loại bỏ tệp khỏi chỉ mục một mình và giữ nó trong bản sao làm việc của bạn. Điều này hoàn toàn ngược lại trong git add file trường hợp này, bạn đã tạo chỉ mục khác với ĐẦU và hoạt động, trong đó, ĐẦU có phiên bản cam kết trước đó của tệp, bản sao làm việc có sửa đổi cuối cùng nếu có hoặc nội dung từ CHÍNH của các tập tin và bạn loại bỏ các tập tin từ chỉ mục. Một cam kết bây giờ sẽ đồng bộ hóa chỉ mục và cây và tệp sẽ bị xóa.


Tôi nhận thấy rằng sau khi git rm --cachedcác git difflệnh không hiển thị bất kỳ khác, nhưng git diff --cachedchương trình diff, như thể nó vẫn còn lưu trữ. Các git statustuy nhiên cho thấy các tập tin như là Untracked. Có vẻ không nhất quán.
haridsv

7
Đừng bận tâm ... tôi nên sử dụng git reset --mixed. Tôi đã có một chút bối rối bởi tuyên bố git rm --cachedngược lại git add. Theo nghĩa đen, nó không chính xác và có thể gây ra thiệt hại. Trong trường hợp của tôi, tôi đã từng git addthêm một tệp đã sửa đổi vào khu vực tổ chức và muốn ngược lại với "phần bổ sung đó" chứ không phải phần bổ sung ban đầu của tệp. + Câu trả lời của Greg Hewgill đã giúp tôi có được bức tranh rõ ràng hơn.
haridsv

12
Tôi thấy việc sử dụng bản sao làm việc, cây và cây làm việc hơi khó hiểu. Cây làm việc là bản sao làm việc, hay cây?
Nealv

3
Như @haridsv đã đề cập, nói git rm --cached'trái ngược hoàn toàn với git add file' là sai lệch. git reset filegần hơn với sự đối lập của git add file.
Matt Browne

@Nealv muộn màng, nhưng đối với những người khác tìm thấy chủ đề này: bản sao làm việc, cây và cây làm việc đều đề cập đến cùng một điều (trong bối cảnh của git).
De Novo

83

Có lẽ một ví dụ sẽ giúp:

git rm --cached asd
git commit -m "the file asd is gone from the repository"

đấu với

git reset HEAD -- asd
git commit -m "the file asd remains in the repository"

Lưu ý rằng nếu bạn không thay đổi bất cứ điều gì khác , thì cam kết thứ hai sẽ không thực sự làm gì cả.


3
Bạn có thể cho tôi biết dấu gạch nối kép đó không - sau khi thực sự có nghĩa là gì?
yuva

30
@yuva: --Được sử dụng để tách các tùy chọn lệnh khỏi tên tệp. Nếu có cả một nhánh và một tệp có tên asd, thì git reset HEAD asdsẽ mơ hồ. Câu --nói "mọi thứ theo sau đây là tên tệp".
Greg Hewgill

git reset HEAD <file>chính xác như git rm --cached <file>và sau đó git add --intent-to-add <file>?
rượu là ác

1
@al Alcoholisevil không, trừ trường hợp đặc biệt. Xem này tuyệt vời, câu trả lời ngắn gọn.
De Novo

45

git rm --cached filesẽ loại bỏ các tập tin từ giai đoạn. Đó là, khi bạn cam kết tập tin sẽ bị xóa. git reset HEAD -- filesẽ chỉ đơn giản là đặt lại tệp trong khu vực tổ chức về trạng thái trên cam kết CHÍNH, tức là sẽ hoàn tác mọi thay đổi bạn đã thực hiện đối với tệp đó kể từ lần cam kết trước. Nếu thay đổi đó xảy ra khi mới thêm tệp, thì chúng sẽ tương đương.


7
Kết hợp với khái niệm (như đã đề cập trong các câu trả lời khác) git rm --cached filehoàn toàn ngược lại git add, câu trả lời này rất có ý nghĩa với tôi, và khá cô đọng. Gần như ngắn như nhận xét này;)
rbatt

2
@rbatt chỉ để đặt bình luận ở đây là tốt, và làm rõ, git rm --cached filekhông phải là ngược lạigit add file . Hành vi xảy ra ngược lại git add filetrong trường hợp cụ thể khi bạn đã thêm một tệp mới, chưa được theo dõi trước đó. Trong mọi trường hợp khác, ngược lại git add filegit reset HEAD file. git reset HEAD filecũng đảo ngược git add filetrong trường hợp đầu tiên (thêm một tệp không bị theo dõi) và trong mọi trường hợp, đó là lý do tại sao git gợi ý nên làm nếu bạn muốn đảo ngược một git add.
De Novo
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.