2012-06-26 47 views

Trả lời

95

Bởi vì không có điểm (lệnh khác quy định rằng chức năng đã được), và nó làm giảm khả năng làm những điều sai trái một cách tình cờ.

"Đặt lại khó" cho đường dẫn chỉ được thực hiện với git checkout HEAD -- <path> (xem phiên bản hiện có của tệp).

Cài đặt lại mềm cho đường dẫn không có ý nghĩa.

Đặt lại hỗn hợp cho đường dẫn là những gì git reset -- <path> thực hiện.

+42

Cá nhân, tôi nghĩ 'git checkout - 'nên * thay thế * bằng' git reset --hard '. Nó có ý nghĩa hơn rất nhiều ... – vergenzt

+18

'git checkout - ' không thực hiện khôi phục cài đặt gốc; nó thay thế nội dung cây đang hoạt động với nội dung theo giai đoạn. 'git checkout HEAD - ' thực hiện thiết lập lại cứng cho đường dẫn, thay thế cả chỉ mục và cây đang hoạt động bằng phiên bản từ cam kết CHÍNH. –

+0

Vui lòng xem câu hỏi được liên kết: http://stackoverflow.com/questions/15404535/how-to-git-reset-hard-a-subdirectory. Bất kỳ ý tưởng? – krlmlr

12

Bạn có thể hoàn thành những gì bạn đang cố gắng thực hiện bằng cách sử dụng git checkout HEAD <path>.

Điều đó nói rằng, thông báo lỗi được cung cấp không có ý nghĩa với tôi (như git reset chỉ hoạt động tốt trên thư mục con) và tôi không thấy lý do gì khiến bạn không thể thực hiện chính xác những gì bạn đang yêu cầu.

-1

git reset --soft HEAD ~ 1 tên tệp hoàn tác cam kết nhưng thay đổi vẫn còn ở địa phương. filename có thể - cho tất cả các file đã cam kết

+4

gây tử vong 'Không thể thiết lập lại mềm với đường dẫn.' – alt

2

Câu hỏi đặt ra cách đã là answered, tôi sẽ giải thích một phần lý do tại sao .

Vì vậy, git reset làm gì? Tùy thuộc vào các thông số quy định, nó có thể làm hai việc khác nhau:

  • Nếu bạn chỉ định một con đường, nó sẽ thay thế các tập tin phù hợp trong chỉ mục với các tập tin từ một cam kết (HEAD theo mặc định). Hành động này không ảnh hưởng đến cây làm việc ở tất cả và thường được sử dụng như là đối diện của git thêm.

  • Nếu bạn không chỉ định đường dẫn, nó sẽ di chuyển nhánh nhánh hiện tại sang cam kết được chỉ định và cùng với, tùy chọn đặt lại chỉ mục và cây đang hoạt động về trạng thái của cam kết đó. Hành vi bổ sung này được kiểm soát bởi tham số chế độ:
    --soft: không chạm vào chỉ mục và cây đang hoạt động.
    - được trộn (mặc định): đặt lại chỉ mục nhưng không phải là cây đang hoạt động.
    --hard: đặt lại chỉ mục và cây đang hoạt động.
    Ngoài ra còn có các tùy chọn khác, xem tài liệu về danh sách đầy đủ và một số trường hợp sử dụng.

    Khi bạn không chỉ định một cam kết, giá trị mặc định là HEAD, vì vậy git reset --soft sẽ không làm gì cả, vì đó là lệnh di chuyển đầu sang HEAD (tới trạng thái hiện tại). Mặt khác, git reset --hard có ý nghĩa do các hiệu ứng phụ của nó, nó di chuyển đầu đến HEAD đặt lại chỉ mục và cây đang hoạt động thành HEAD.

    Tôi nghĩ rõ ràng là tại sao thao tác này không phải cho các tệp cụ thể theo bản chất của nó - nó được thiết kế để di chuyển nhánh đầu tiên, đặt lại cây làm việc và chỉ mục là chức năng phụ.

Các vấn đề liên quan