Чому Git помилково відзначає, що мої файли актуальні?


6

У мене є 2 папки A та B у моєму каталозі файлів, які зв'язуються з тим же сховищем Git.

Я створив файл у папці А з назвою "index.html". Потім я створюю інший файл, який також називається "index.html" у папці B. Потім я додаю "index.html" у папку B, фіксує та натискає вміст B.

Коли я витягую з папки A, Git стверджує, що мої файли "вже оновлюються". Проте обидві папки явно мають різні файли "index.html". Що відбувається?


Оновлення - видалення "index.html" з папки A після цього не допомагає. Помилка "Вже актуальна". все ще виникає, коли я тягну в папку А.
David Faux

Ви зробили git rm index.html в?
new123456

Коли ви створили index.html у папці А, ви git add і git commit це, або просто помістити його в папку? Git не піклується про те, що знаходиться в папці, тільки про те, про що йому було сказано дбати.
asfallows

Відповіді:


7

git pull Робота fetch нові компроміси та merge їх у поточну гілку. Якщо поточна гілка не застаріла в порівнянні з тією, з якої ви тягнете, тягніть, скажіть Already up-to-date. навіть якщо у вашому робочому каталозі є місцеві зміни . git pull стосується гілок, а не робочого дерева - коментуватиме робоче дерево тільки в тому випадку, якщо є зміни, які заважають об'єднанню.

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

Щоб зрозуміти стан ваших гілок, git branch -v є корисним (він показує ідентифікатор фіксації і відношення до гілки кожної гілки), або 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 відбитки:

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

Я не знаю, яку версію git ви використовуєте, але це очевидно не безпечна поведінка. Що робити, якщо я маю щось важливе в тому, що перезаписано index.html? На останньому потягу, мій git каже error: Untracked working tree file 'index.html' would be overwritten by merge.
jjlin

git version 1.7.2.5. Я ніколи не говорив, що це безпечна поведінка. Це повідомлення з'являється за певних обставин, але це не так (не питайте мене, чому).
cYrus

0

Пам'ятайте про одне git - він відстежує вміст, а не файли .

Внутрішньо весь вміст у сховищі зберігається blob десь. Що ви вважаєте файлом, git вважає ім'я, яке вказує на крапку. Що ви вважаєте двома файлами з однаковим вмістом, git вважається двома іменами, пов'язаними з однією групою. Отже, оскільки жодна з крапок не змінилася, репозиторій не змінився.

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


0

Схоже, ви звикли до SVN, де різні папки (або навіть файли, не знаєте) можуть бути перевірками різних версій.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.