2011-07-03 42 views
73

http://norbauer.com/notebooks/code/notes/git-revert-reset-a-single-fileSự khác nhau giữa "git checkout <filename>" và "git checkout - - <filename>"

Tôi đã tìm thấy một bài.

Nhưng vẫn không biết sự khác biệt giữa

  1. git checkout <filename>

  2. git checkout -- <filename>

Trong những tình huống tôi nên sử dụng đầu tiên và thứ hai lần lượt là bao nhiêu?

+1

Xem thêm [Ý nghĩa của dấu gạch ngang kiểm tra Git] (http://stackoverflow.com/q/13321458/456814). –

Trả lời

149

Tùy chọn "đặc biệt" -- có nghĩa là "xử lý mọi đối số sau thời điểm này dưới dạng tên tệp, bất kể nó như thế nào." Đây không phải là Git cụ thể, nó là một quy ước dòng lệnh chung của Unix. Thông thường, bạn sử dụng nó để làm rõ rằng đối số là tên tệp chứ không phải là tùy chọn , ví dụ:

rm -f  # does nothing 
rm -- -f # deletes a file named "-f" 

git checkout cũng mất -- để có nghĩa là lập luận tiếp theo không phải là tùy chọn "treeish" tham số nêu rõ nó mà cam kết mà bạn muốn.

Vì vậy, trong bối cảnh này nó an toàn sử dụng -- mọi khi, nhưng bạn cần nó khi tập tin bạn muốn trở lại có một cái tên bắt đầu với -, hoặc là giống như tên của một chi nhánh. Một số ví dụ cho chi nhánh/tập tin định hướng:

git checkout README  # would normally discard uncommitted changes 
         # to the _file_ "README" 

git checkout master  # would normally switch the working copy to 
         # the _branch_ "master" 

git checkout -- master # discard uncommitted changes to the _file_ "master" 

và tùy chọn/tập tin định hướng:

git checkout -p -- README # interactively discard uncommitted changes 
          # to the file "README" 

git checkout -- -p README # unconditionally discard all uncommitted 
          # changes to the files "-p" and "README" 

Tôi không chắc chắn những gì bạn làm gì nếu bạn có một chi nhánh có tên bắt đầu bằng -. Có lẽ không làm điều đó ngay từ đầu.


ở chế độ này; "checkout" cũng có thể thực hiện một số việc khác. Tôi chưa bao giờ hiểu lý do tại sao git chọn triển khai "loại bỏ các thay đổi không được cam kết" như một chế độ của tiểu mục "thanh toán", thay vì "hoàn nguyên" giống như hầu hết các VCS khác hoặc "đặt lại" mà tôi nghĩ có thể có ý nghĩa hơn trong các thuật ngữ riêng của git.

+11

git checkout kiểm tra chi nhánh . git checkout - kiểm tra phiên bản chỉ mục của tệp . – dunni

+3

Cảm ơn, không may tài liệu git không thực sự giải thích điều này – Carlton

+1

Về "quy ước Unix": thực sự '--' như một dấu phân cách giữa các tùy chọn và đối số được triển khai rộng rãi.Nó hoạt động cho bất kỳ chương trình/tiện ích nào sử dụng POSIX 'getopt (3)' để xử lý các tùy chọn dòng lệnh của nó, (xem 'man 3 getopt'), shell-scripts sử dụng' getopt (1) 'và một số chương trình thực hiện nó bản thân họ, nhưng không được bảo đảm _để làm việc. – arielf

5

Mọi thứ theo sau -- được coi là tên tệp (không phải là đối số chương trình). Điều này quan trọng nếu, ví dụ, bạn có tên tập tin mà bắt đầu bằng dấu gạch ngang.

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