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

на 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 is и как он интерпретируется как промежуточная область.

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

4 ответов


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

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

git commit -m "Message"

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


фокус в том, что:

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

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

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


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

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

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


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

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


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

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