aleksand44
@aleksand44

Что значит «--» флаг во многих git операциях?

Замечаю постоянно что во многих осноных операциях он присутствует, но смысл так и не понял.
Например:
git reset -- file1.txt dev/nginx_vhosts/file2.txt
  • Вопрос задан
  • 1767 просмотров
Решения вопроса 2
Lynn
@Lynn
nginx, js, css
По довольно распространённому соглашению, все параметры после двойной черты считаются позиционными (чаще всего это имена файлов). 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
Ответ написан
Комментировать
Melkij
@Melkij
PostgreSQL DBA
Многие консольные команды разбирают переданные им параметры используя вызов 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 [...] -- [...]'
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы