Специальная «опция» --означает «обрабатывать каждый аргумент после этой точки как имя файла, независимо от того, как он выглядит». Это не зависит от 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 в этом режиме; "checkout" может делать и несколько других вещей. Я никогда не понимал, почему git решил реализовать «отменить незафиксированные изменения» в качестве режима подкоманды «checkout», а не «вернуться», как большинство других VCS, или «сбросить», что, как мне кажется, могло бы иметь больше смысла в терминах git.