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