Різниця між "git checkout <ім'я файлу>" та "git checkout - - <ім'я файлу>"


115

http://norbauer.com/notebooks/code/notes/git-revert-reset-a-single-file

Я знайшов пост.

Але досі не знаю, у чому різниця між

  1. git checkout <filename>

  2. git checkout -- <filename>

У якій ситуації я повинен використовувати перший та другий відповідно?


Відповіді:


214

Спеціальний "варіант" --означає "трактувати кожен аргумент після цього пункту як ім'я файлу, незалежно від того, як він виглядає". Це не специфічно для Git, це загальна угода командного рядка Unix. Зазвичай ви використовуєте його для уточнення, що аргумент - це ім'я файлу, а не опція , наприклад

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

git checkout1 також --означає, що наступні аргументи не є його необов'язковим "дерев’яним" параметром, що вказує, яку комісію потрібно зробити.

Отже, у цьому контексті це безпечно використовувати --завжди, але він вам потрібен, коли файл, який ви хочете відновити, має ім'я, яке починається з -, або таке, як ім'я гілки. Деякі приклади для розрізнення гілок / файлів:

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"

і розбір варіантів / файлів:

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"

Я не впевнений, що ви робите, якщо у вас є філія , назва якої починається з -. Можливо, не робіть цього в першу чергу.


1 в цьому режимі; "Оформити замовлення" також може робити кілька інших речей. Я ніколи не розумів, чому git вирішив реалізувати "відкинути невмілі зміни" як режим підкоманди "checkout", а не "повернути", як більшість інших VCSes, або "скинути", що, на мою думку, може мати більше сенсу у власних умовах git.


12
git checkout <ім'я> перевіряє відділення <ім'я>. git checkout - <ім'я> перевіряє версію індексу файлу <ім'я>.
dunni

3
Дякую, на жаль, документація на git насправді цього не пояснює
Carlton

1
Щодо "конвенції Unix": це дійсно --як роздільник між варіантами та аргументами широко реалізований. Він працює для будь-якої програми / утиліти, яка використовує POSIX getopt(3)для обробки своїх параметрів командного рядка (див. man 3 getopt), Скриптів оболонок, які використовують getopt(1), і деяких програм, які реалізують його самостійно, але не гарантується, що вони універсально працюють.
аріельф

Га! Я просто прочитав приклад зворотнього шляху, коли про те, як відмовитись від робочих змін, забувши побачити цю конвенцію в інших програмах командного рядка, припустив, що це --означає «заперечувати зміни» a la C / C ++ - і думав про це з тих пір. Розум роздутий!
підкреслюй_d

Для таких людей, як я: не плутайте імені master, він має на увазі файл з ім'ям master, а не гілка.
Жорсткий

7

Все, що слідує за --, трактується як ім'я файлу (не як аргумент програми). Це важливо, якщо, наприклад, у вас є назви файлів, які починаються з тире.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.