Разница между "git checkout <имя файла>" и "git checkout - - <имя файла>"

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

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

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

  1. git checkout <filename>

  2. git checkout -- <filename>

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

4 ответа

Решение

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

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

      git checkout -- filename

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

      git checkout filename

попытается проверить ветку с тем же именем, если она не существует, она выполнит ту же операцию, что иgit checkout -- <filename>

Разница между и заключается в обработке неслитых изменений.

отменяет изменения в текущей ветке и заменяет файл версией из указанной ветки или коммита. Если у вас есть неслитые изменения в файле, эта команда завершится ошибкой, и вы получите сообщение об ошибке.

отменяет все изменения в файле, включая любые неслитые изменения. Это полезно, когда вы хотите полностью отменить локальные изменения и начать заново с версии из указанной ветки или коммита.

В итоге,используется для переключения на определенную версию файла с сохранением изменений, которые были объединены в текущую ветвь, в то время какотменяет все изменения в файле, включая неслитые изменения.

Другие вопросы по тегам