В чем разница между рабочим каталогом и git Index? - PullRequest
8 голосов
/ 09 июля 2011

git book определяет индекс 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 ]

7 голосов
/ 09 июля 2011

Хитрость:

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

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

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


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

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

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

4 голосов
/ 09 июля 2011

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

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

3 голосов
/ 09 июля 2011

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

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

2 голосов
/ 09 июля 2011

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

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

git commit -m "Message"

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

...