Что значит «--» флаг во многих git операциях?
По довольно распространённому соглашению, все параметры после двойной черты считаются позиционными (чаще всего это имена файлов). 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
Многие консольные команды разбирают переданные им параметры используя вызов getopt
getopt отдельно выделяет аргумент "--" как маркер окончания списка параметров:The special argument "--" forces an end of option-scanning regardless of the scanning mode. 
То есть после найденного -- будет прекращена обработка строки вызова, все последующие параметры будут оставлены как есть, даже если там будет что-то похожее на другие поддерживаемые программой параметры.
В частности, git reset использует это поведение для однозначного отделения имён файлов: всё после -- будет восприниматься как имена файлов вместо чего-то вот такого:$ git reset file
fatal: ambiguous argument 'file': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git  [...] -- [...]'