Подтвердить что ты не робот

Git проверка с точкой

Какая разница между следующими командами git:

git  checkout branch
git  checkout branch .
git  checkout  .  #<-- used at the branch

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

4b9b3361

Ответ 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 . Теперь нет ветки с именем ., поэтому она просто вытащит текущее имя папки из текущая ветвь.