Что означает - (одна черта) в "git checkout - ..."? - PullRequest
1 голос
/ 26 июня 2019

В моем репозитории произошли некоторые изменения (скажем, пути всех отредактированных файлов начинались с abc_), которые я хотел удалить, с помощью команды:

git checkout -- abc_*

Однако я сделал опечатку и вместо двух тире я использовал только одну:

git checkout - abc_*

Похоже, вместо того, чтобы отбрасывать изменения, команда добавила еще больше изменений для фиксации - фактически она добавила несколько сотен файлов, имена которых начинаются с abc_ (но не все из них в проекте!).

Мой вопрос: Что я только что сделал? Или, точнее: что означает тире?

Все ответы, которые мне удалось найти, объясняли, что делают две черты (-), но я понимаю это. Я также считаю, что понимаю, как работает git checkout как с аргументом branch / tree-ish, так и с путями к файлам. Однако я не могу найти никакой информации о значении одной тире - для обозначения параметров также используются тире (например, git checkout -b ...), что затрудняет поиск этой команды.

Ответы [ 3 ]

5 голосов
/ 26 июня 2019

Единственная тире здесь означает предыдущую активную ветвь или отдельную ГОЛОВКУ.

Случай 1:

git checkout master
git checkout dev

# here - means master
git checkout -

# here - means dev
git checkout -

Случай 2:

# detached HEAD
git checkout refs/heads/master
# back to master
git checkout master

# detached HEAD again
git checkout -

# master again
git checkout -

Итак git checkout - abc_*означает перезаписывать пути (abc_ *) в рабочем дереве, заменяя его содержимым в предыдущей активной ветви или отдельном HEAD.Смотрите git checkout

2 голосов
/ 26 июня 2019

Как уже отвечали другие, git checkout - извлекает последнюю ветку.Проверьте заметки о выпуске :

@{-1} - это способ ссылки на последнюю ветку, в которой вы были.
Это принимается не только там, где ожидается имя объекта, но и везде, где ожидается имя ветви, и действует так, как если бы вы ввели имя ветви.Например, "git branch --track mybranch @{-1}", "git merge @{-1}" и "git rev-parse --symbolic-full-name @{-1}" будут работать, как и ожидалось.

Чтобы продемонстрировать, что произошло, давайте попробуем этот пример:

$ (master) echo 'Hello from master' > test
$ (master) git commit -am 'Hello from master'

Теперь давайте создадим еще одну ветку branch_1 и изменим «тестовый» файл:

$ (master) git checkout branch_1
$ (branch_1) echo 'Hello from branch_1' > test
$ (branch_1) git commit -am 'Hello from branch_1'

Если вы сейчас запустите git checkout -, вы вернетесь к мастеру:

$ (branch_1) git checkout -
$ (master)

Наконец, запуск git checkout - test извлечет тестовый файл из ветви branch_1:

$ (master) git checkout - test
Updated 1 path from e2bcb78
$ git diff --cached
@@ -1 +1 @@
-Hello from master
+Hello from branch_1
2 голосов
/ 26 июня 2019

-- - это специальный аргумент , который сообщает Git, что следующие за ним аргументы являются путями;те, что перед ним, являются чем-то другим (параметры команды, удаленные имена, имена веток, имена тегов и т. д.)

- в git checkout - - это имя ветви .- - это псевдоним "@{-1}", представляющий имя предыдущей текущей ветви (ветвь, которая была текущей ветвью перед последней командой git checkout, которая использовалась для изменения ветви).

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