Git проверка с точкой
Какая разница между следующими командами git
:
git checkout branch
git checkout branch .
git checkout . #<-- used at the branch
Почему, когда я просматриваю разные ветки в разные папки, я сначала пропустил некоторые файлы.
Но когда я использую вторую команду, все в порядке?
Ответы
Ответ 1
git checkout
(1) делает очень разные вещи независимо от того, задан ли указатель пути или нет.
- Только с спецификатором ветвей (
git checkout branch
) он переключит текущий рабочий каталог на указанную ветку, сохранив локальные изменения, если это возможно, и не получилось иначе. Если вы уже находитесь на branch
, он ничего не сделает. Он только изменяет файлы в рабочем каталоге, которые отличаются от HEAD
и branch
, и сбой, если какой-либо из них имеет локальные модификации (индексированные или нет).
- С спецификатором пути он перезапишет все соответствующие файлы (все файлы соответствуют
.
) с указанным контентом:
- Только спецификатор пути (
git checkout .
) записывает содержимое из индекса. То, что он отменяет нестационарную локальную модификацию. Чтобы отменить поэтапные изменения, используйте git reset
с указателем пути.
- При использовании спецификаторов ветвей и путей (
git checkout branch .
) он записывает содержимое в указанную ревизию. Он не будет изменять, где HEAD
указывает, поэтому, если branch
отличается от HEAD
, после этого будут неустановленные изменения.
Обратите внимание, что справочная страница отличает дополнительные случаи использования опции -b/- branch и -p/- patch, но это в основном простые расширения вышеупомянутых случаев.
Ответ 2
Вышеуказанное объяснение прекрасное, но позвольте мне объяснить примеры.
git checkout
может использоваться с папками и ветвями файлов.
Скажем, есть файл index.html
и dev
.
Если я случайно изменил index.html
, и я хочу отменить, что я просто запустил git checkout index.html
. Он вернет мой файл в первоначальную форму.
Теперь скажем, что я внес некоторые изменения внутри папки dev и хочу, чтобы эти изменения были обратно внутри папки dev. Если я буду использовать git checkout dev
, и если есть какая-либо ветвь dev
, то она проверит, что dev ветка, а не папка с именем dev
.
Итак, я бы побежал
git checkout -- dev
Теперь эта голая двойная тире означает текущую ветку. Таким образом, над командой запрос от git заключается в том, что, пожалуйста, дайте мне папку "dev" с текущей ветвью.
Давайте поговорим о вашем случае использования.
git checkout branch
эта команда просто проверит ветку с именем "branch"
git checkout branch .
Вторая команда сообщит git, что, пожалуйста, проверьте .
или текущее имя папки из ветки с именем "branch"
git checkout . #<-- used at the branch
, как вы говорите, сначала вы переключились на ветку с именем "branch" , используя git checkout branch
, тогда вы просто делаете git checkout .
Теперь нет ветки с именем .
, поэтому она просто вытащит текущее имя папки из текущая ветвь.