Почему Git ошибочно сообщает, что мои файлы обновлены?

Почему Git ошибочно сообщает, что мои файлы обновлены?

В моем файловом каталоге есть две папки — A и B, которые ссылаются на один и тот же репозиторий Git.

Я создал файл в папке A с именем index.html. Затем я создаю другой файл с таким же именем index.htmlв папке B. Затем я добавляю его index.htmlв папку B, фиксирую и отправляю содержимое B.

Когда я извлекаю из папки A, Git утверждает, что мои файлы "Уже обновлены". Однако в обеих папках явно разные index.htmlфайлы. Что происходит?

решение1

git pullработа заключается в том, чтобы делать fetchновые коммиты и mergeдобавлять их в текущую ветку. Если текущая ветка не устарела по сравнению с той, из которой вы тянете, pull скажетAlready up-to-date. даже если у вас есть локальные изменения в вашем рабочем каталоге. git pullкасается ветвей, а не рабочего дерева — он будет комментировать рабочее дерево только в том случае, если есть изменения, которые мешают слиянию.

Ваше описание недостаточно, чтобы объяснить, почему оно не возражает против существующего index.html, но вы не должны понимать это Already up-to-date.как то, что git думает, что у вас нет изменений. Вместо этого используйте git statusдля получения сводки.

Полезно для понимания состояния ваших веток git branch -v(показывает идентификатор коммита и связь с вышестоящей веткой каждой ветки) или gitk --allдля графического просмотра всех коммитов.

решение2

Если я правильно понимаю, следующий скрипт должен воспроизвести вашу проблему:

тест mkdir
тест компакт-диска
git init --bare test.git
git клонировать test.git a
git клонировать test.git b
эхо а > а/index.html
эхо б > б/index.html
кд б
git добавить index.html
git коммит -m добавить
git push origin мастер
кд ../а
гит тянуть

Последние git pullотпечатки:

удаленно: Подсчет объектов: 3, готово.
удаленно: всего 3 (дельта 0), повторно использовано 0 (дельта 0)
Распаковка объектов: 100% (3/3), выполнено.
Из /home/cyrus/tmp/test/test
 * [новая ветка] master -> origin/master

И содержимое index.htmlбыло молча перезаписано:

cyrus:~/tmp/test/a$ cat index.html
б

решение3

Помните одну вещь о git-отслеживает контент, а не файлы.

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

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

решение4

Похоже, вы привыкли к SVN, где разные папки (или даже файлы, не знаю) могут быть извлечениями разных ревизий.

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

Связанный контент