Ответ 1
Специальный "параметр" --
означает "обрабатывать каждый аргумент после этой точки как имя файла, независимо от того, как он выглядит". Это не Git -специфическое, это общее соглашение командной строки Unix. Обычно вы используете его, чтобы уточнить, что аргумент является именем файла, а не опцией, например.
rm -f # does nothing
rm -- -f # deletes a file named "-f"
git checkout
1 также принимает --
, чтобы означать, что последующие аргументы не являются его необязательным "деревенским" параметром, определяющим, какой фиксацией вы хотите.
Поэтому в этом контексте безопасно использовать --
всегда, но вам это нужно, когда файл, который вы хотите вернуть, имеет имя, начинающееся с -
, или совпадает с именем ветки. Некоторые примеры различий между ветвями/файлами:
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 в этом режиме; "checkout" может делать и другие вещи. Я никогда не понимал, почему git решил реализовать "отказаться от незавершенных изменений" как режим подкоманды "checkout", а не "возвращать", как большинство других VCS, или "reset", что, я думаю, может иметь больше смысла в git собственные условия.