Использует ли git "грязные" файлы, не поставленные или не выполненные? (конфликт глоссария)

https://www.kernel.org/pub/software/scm/git/docs/gitglossary.html#def_dirty Рабочее дерево считается "грязным", если оно содержит модификации, которые не были привязаны к текущей ветке.

http://www.gitguys.com/topics/glossary/ Грязная рабочая директория Если файлы были обновлены в рабочем каталоге после их обновления в индексе, рабочий каталог считается "грязным". Рабочий каталог является чистым, если все измененные файлы в рабочем каталоге были добавлены в индекс.

Если я правильно понимаю, "индекс" также известен как "промежуточная область" и является местом, где файлы будут сохранены (скопированы на? symlinked?), когда вы их измените, хотите их зафиксировать, но haven Еще не сделано. (Первый глоссарий говорит, что промежуточная область также может использоваться для слияния. Второй глоссарий говорит, что файлы перемещаются туда "git add".)

Итак, два глоссария, кажется, говорят несовместимые вещи. Что правильно? Или есть какой-то способ, которым они оба могли быть правильными?

Ответ 1

Они на самом деле оба разумные требования. Я думаю, что "лучший ответ" заключается в том, что оба они ошибаются, хотя первая (версия kernel.org), вероятно, ближе.

Рассмотрим:

$ mkdir /tmp/repo && cd /tmp/repo
$ git init
Initialized empty Git repository in /tmp/repo/.git/
$ echo contents > file
$ git add file
$ git commit -m initial
[master (root-commit) e1731a6] initial
 1 file changed, 1 insertion(+)
 create mode 100644 file

Теперь у нас есть репозиторий с одной фиксацией, содержащей один файл.

$ echo second line >> file; git add file; echo contents > file

В этот момент индекс имеет file с двумя строками в нем. Но рабочая версия file имеет только одну строку в ней и соответствует тому, что в репозитории.

Является ли file грязным? Ну, git status --short говорит, что это, дважды (два M s). Оба git diff и git diff --cached показывают изменения (так что да, это "грязно" ), но git diff HEAD говорит, что нет изменений, и если мы git add снова и попробуем git status:

$ git status --short
MM file
$ git diff HEAD
$ git add file
$ git status
# On branch master
nothing to commit, working directory clean

Положите это нечетное изменение назад и сделайте еще одно. На этот раз используйте длинную форму git status, чтобы она давала нам дополнительную информацию:

$ echo second line >> file; git add file; echo contents > file
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   file
#
# 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:   file
#

В нем говорится, что мы можем использовать git reset (то же самое, что и git reset --mixed) с HEAD, а имя файла - неактивное; неужели это сделает рабочий каталог грязным?: -)

$ git reset HEAD file
$ git status
# On branch master
nothing to commit, working directory clean

Нет, на самом деле, он снова очищает рабочий каталог! Это следует из (отсутствия) вывода git diff HEAD: "un-staging" изменение, которое добавляет вторую строку, делает индекс ссылкой на версию HEAD, а версия рабочего каталога совпадает с версией HEAD, так что нестационарные "изменения, которые необходимо совершить" заставляют ничего не совершать и никаких изменений в рабочем каталоге.

"Правильное" определение, я думаю, что ваше дерево "чистое", если нет изменений в фиксации и никаких изменений между "деревом, поставленным для фиксации" (содержимым индекса) и "рабочим каталогом". Тем не менее, разумно спросить отдельно, является ли индекс чистым (т.е. Нет ничего поставленного для фиксации) и/или рабочее дерево является чистым (неизменным) относительно заполнения в пробе, где пустым может быть заполняется "промежуточной областью" или "фиксацией HEAD".

Что git status говорит вам, что это и ответ на вопрос: "что, если что-либо, поставлено для фиксации" и "что, если что-либо, отличается между деревом и индексом". Вы должны использовать git diff HEAD (вы можете добавить --name-only или аналогичный), чтобы увидеть, что, если что-либо, отличается между деревом работы и HEAD фиксацией, если (как это часто бывает) индекс соответствует HEAD commit.

Ответ 2

От torek answer:

Что означает git status, вы оба отвечаете на:

  • "что, если что угодно, поставлено для фиксации" и
  • "что, если что-либо, отличается между деревом и индексом".

Обратите внимание, что только рабочее дерево связано с состоянием git, а не с "рабочим каталогом".

Git 2.9.1+ (Q3 2016) сделает это более ясным.
См. commit 2a0e6cd (09 июня 2016 г.) Ларс Фогель (vogella).
(Слияние Junio ​​C Hamano - gitster - в совершить a010d61, 27 июня 2016 г.

Используйте "рабочее дерево" вместо "рабочего каталога" для git status

Рабочий каталог можно легко путать с текущим каталогом.
В одном из моих исправлений я уже обновил использование рабочего каталога с рабочим деревом для man-страницы, но я заметил, что git status также использует этот неправильный термин.

Ответ 3

В соответствии с официальной документацией Git, в разделе Stashing грязное состояние определяется как ... the dirty state of your working directory — that is, your modified tracked files and staged changes. Из этого определения файлы, поставленные для фиксации, также загрязнены. Это означает, что статья kernel.org, если это правильно, в то время как статья gitguys.com в значительной степени ошибочна. Вероятно, вы должны указать на них.