По довольно распространённому соглашению, все параметры после двойной черты считаются позиционными (чаще всего это имена файлов).
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