6

У меня есть 2 папки A и B в моей файловой директории, которые связаны с одним и тем же Git-репозиторием.

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

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

4 ответа4

7

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

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

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

2

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

mkdir test
cd test
git init --bare test.git
git clone test.git a
git clone test.git b
echo a > a/index.html
echo b > b/index.html
cd b
git add index.html
git commit -m add
git push origin master
cd ../a
git pull

Последние git pull prints:

remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/cyrus/tmp/test/test
 * [new branch]      master     -> origin/master

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

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

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

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

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

0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .