Разница между "git checkout <filename>" и "git checkout - - <filename>" - PullRequest
95 голосов
/ 03 июля 2011

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

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

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

  1. git checkout <filename>

  2. git checkout -- <filename>

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

Ответы [ 2 ]

190 голосов
/ 03 июля 2011

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

6 голосов
/ 03 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...