В чем разница между рабочим каталогом и 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
,