Разница между "git checkout <filename>" и "git checkout - - <filename>"

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

Я нашел сообщение.

Но до сих пор не знаю, в чем разница между

  • git checkout <filename>

  • git checkout -- <filename>

В какой ситуации я должен использовать первый и второй соответственно?

Ответ 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 собственные условия.

Ответ 2

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