
В моем файловом каталоге есть две папки — 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) действуют на все рабочие файлы независимо от папки, в которой вы в данный момент находитесь.