Sự khác biệt giữa “git checkout <tên tệp>” và “git checkout - - <tên tệp>”


Câu trả lời:


214

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

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

git checkout1 cũng có --nghĩa là các đối số tiếp theo không phải là tham số "treeish" tùy chọn của nó chỉ định cam kết nào bạn muốn.

Vì vậy, trong bối cảnh này, bạn có thể sử dụng luôn an toàn-- , nhưng bạn cần nó khi tệp bạn muốn hoàn nguyên có tên bắt đầu bằng -hoặc giống với tên của một nhánh. Một số ví dụ về định dạng nhánh / tệp:

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 / định dạng tệp:

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 bạn sẽ làm gì nếu bạn có một chi nhánh có tên bắt đầu bằng -. Có lẽ đừng làm điều đó ngay từ đầu.


1 trong chế độ này; "checkout" cũng có thể làm một số việc khác. Tôi chưa bao giờ hiểu tại sao git lại chọn triển khai "loại bỏ các thay đổi chưa cam kết" như một chế độ của lệnh con "kiểm tra", thay vì "hoàn nguyên" 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 theo các thuật ngữ riêng của git.


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

3
Cảm ơn, rất tiếc là 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à các đối số được thực hiện 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), các tập lệnh shell sử dụng getopt(1)và một số chương trình tự triển khai nó, nhưng không được đảm bảo hoạt động trên toàn cầu.
mình

Hả! Tôi chỉ đơn giản là đọc một ví dụ cách trở lại khi làm thế nào để loại bỏ những thay đổi làm việc, sau khi bị lãng quên nhìn thấy ước này trong các chương trình dòng lệnh khác, cho rằng --có nghĩa là 'thay đổi phủ nhận' a la C / C ++ - và đã suy nghĩ rằng kể từ đó. Tâm trí nổ tung!
underscore_d

Đối với những người như tôi: đừng nhầm lẫn với tên master, anh ấy có nghĩa là tệp có tên chính chứ không phải chi nhánh.
HarsH

7

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

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.