По довольно распространённому соглашению, все параметры после двойной черты считаются позиционными (чаще всего это имена файлов).
git
придерживается этого соглашения.
Например кто-то случайно создал файл с именем
-n
, а вы хотите вывести все файлы в папке командой
cat
$ ls -l
total 8
-rw-rw-r-- 1 lynn lynn 6 Apr 19 12:34 file1
-rw-rw-r-- 1 lynn lynn 6 Apr 19 12:33 -n
если просто выполнить
cat *
, то получится странное:
$ cat *
1 file1
потому что bash раскрыл звёздочку и получилась команда
can file1 -n
, т.е. вывести файл
file1
с нумерацией строк.
А вот так всё выведется правильно:
$ cat -- *
file1
a
b
c
Потому что раскроется в
cat -- file1 -n
, но по соглашению, после
--
не может быть ключей команды, только имена файлов.
Конкретно в git
есть ещё более строгое соглашение, по которому параметры после
--
могут быть только путями.
Например если у вас есть файл
test
и ветка
test
, то будет так:
$ git branch
* master
test
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: test
no changes added to commit (use "git add" and/or "git commit -a")
$ git reset test
fatal: ambiguous argument 'test': both revision and filename
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
$ git reset -- test
Unstaged changes after reset:
M test