Внесение изменений в файл, который был добавлен git, а затем git commit работает нормально

Долгое время читатель первый раз постер. Я наконец-то учусь мерзавцу и немного запутался. Из того, что я прочитал и, вероятно, неправильно понял, вы должны "git add" после внесения изменений в файл (сохранить файл локально в вашем ide?) Перед тем, как "git committing".

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

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

Мой тест для этого - запустить "git add", изменить файл и сохранить его, попробовать коммит, чтобы увидеть, регистрирует ли он изменения без нового "git add", что он и делает, выводя сообщение с информацией об изменениях, которые я сделал. Я должен что-то упустить в моем понимании. Спасибо за любую помощь.

1 ответ

Некоторые IDE делают git add для тебя. Ваш может быть одним из них - мы не можем сказать, так как вы не назвали его.

Некоторые IDE не делают git add для тебя. В этом случае вы должны сделать это самостоятельно.

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

Для меня это звучит так, будто ваша ментальная модель соответствует реальной модели Mercurial. В Mercurial вы используете hg add сказать Mercurial: этот файл должен быть в коммитах. С тех пор, hg commit использует версию этого файла в вашем рабочем дереве для создания нового коммита.

(Рабочее дерево - это то место, где вы выполняете свою работу. Это в отличие от коммитов, которые доступны только для чтения: вы буквально не можете изменять файлы, хранящиеся в коммитах. Обычно они также сильно сжаты и полезны в форме. только для системы контроля версий. Это верно как для Mercurial, так и для Git.)

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

Когда Git извлекает коммит, он копирует его содержимое как в индекс, так и в рабочее дерево. Версия каждого файла в индексе соответствует версии, сохраненной только для чтения в коммите; но копия в индексе может быть перезаписана. Затем Git использует индексную копию (которая теперь совпадает с копией коммита), чтобы создать копию рабочего дерева в обычном несжатом формате, чтобы вы могли работать с ним.

Когда ты бежишь git add file, Git копирует обычный, несжатый файл рабочего дерева обратно в индекс (он же staging-area). Это заменяет предыдущую версию этого файла, и git commit передаст версию индекса, которая теперь соответствует версии рабочего дерева.

Поскольку Git делает коммиты из того, что находится в индексе, вы или ваша IDE должны постоянно копировать любые изменения, сделанные в рабочем дереве, в индекс. Тот факт, что индексная версия уже находится в специальном сжатом формате Git-only, делает git commit идите очень быстро - за счет необходимости выполнения всех этих дополнительных шагов копирования. В большом хранилище с большим количеством файлов это действительно имеет огромное значение: hg commit может занять несколько секунд, пока git commit почти мгновенно.

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

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