В чем разница между рабочим каталогом и git Index?

Книга git определяет индекс git:

Индекс Git используется в качестве промежуточной области между вашим рабочим каталогом и вашим хранилищем. Вы можете использовать индекс для создания набора изменений, которые вы хотите зафиксировать вместе. Когда вы создаете фиксацию, то, что фиксируется, - это то, что в данный момент находится в индексе, а не в вашем рабочем каталоге.

Но мне все еще трудно понять это, особенно подчеркнутое утверждение, что "то, что совершено, - это не то, что находится в моем рабочем каталоге".

Пока в моей ограниченной работе с git все в рабочем каталоге всегда фиксируется, если я делаю:

git add <all new files in the working directory>
git commit -a -m "git will refuse to commit without this comment" 

Затем git фиксирует все измененные файлы, а также все новые файлы.

Итак, по сути, мой рабочий каталог является промежуточной областью?

Я не уверен, что тогда git index и как это интерпретируется как промежуточная зона.

Не могли бы вы объяснить?

4 ответа

Решение

Ответ в вашем конкретном случае заключается в том, что вы правильно понимаете документацию, но используете команду "ярлык" для фиксации всего вашего рабочего каталога.

Если вы бежите git commit -a -m "Message" тогда ваш рабочий каталог обрабатывается так, как будто это промежуточная область. Иногда это удобно, но вы теряете возможность использовать индекс по назначению. Попробуйте следующую команду:

git commit -m "Message"

Если вы сделаете это вместо этого, вы можете использовать промежуточную область, чтобы зафиксировать только часть изменений, которые вы внесли в ваш рабочий каталог.

Хитрость заключается в следующем:

когда вы добавляете (git add) в индекс, вам не нужно сразу фиксировать

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

Так что это может помочь время от времени добавлять в индекс текущие усилия по разработке, зная, что вы можете в любой момент зафиксировать последнее "стабильное" состояние, которое вы проиндексировали.


Другой способ - это не то, что находится в вашем рабочем дереве, когда вы git add --patch:

Интерактивно выбирайте фрагменты патча между индексом и рабочим деревом и добавляйте их в индекс.
Это дает пользователю возможность просмотреть разницу, прежде чем добавлять измененное содержимое в индекс.

Вы можете добавить часть вашего текущего файла в индекс (например, одну из трех написанных вами функций), а затем зафиксировать только это.

Индекс является копией дерева каталогов, управляемого git. Изначально это копия того, что находится в коммите HEAD. git add копирует файлы из рабочего каталога в индекс. git commit создает новый коммит из того, что находится в индексе.

Индекс похож на буфер - он не хранится в истории git, но доступ к нему контролируется git (в отличие от вашего рабочего каталога, доступ к которому можно получить любым количеством способов). git фиксирует из индекса, поэтому то, что фиксируется, является тем, что контролирует git.

Индекс / промежуточная область НЕ является вашим рабочим каталогом. Вы можете сделать простой тест, чтобы увидеть это. Создайте файл в вашем рабочем каталоге с именем, скажем, foo, Добавьте текст в файл. Тогда делай git add foo, Сейчас редактирую foo снова и добавьте (или удалите) еще немного текста.

Если вы бежите git diff --cached (который показывает, что в индексе), вы увидите только foo как это было после первого раунда правок и последующих git add, Если вы делаете git diff (который показывает, что изменилось в вашем рабочем каталоге), вы увидите все дополнительные изменения, которые вы сделали после git add,

Другие вопросы по тегам