Что это значит, когда git говорит, что файл «нуждается в обновлении»?

156

Я не могу найти приличного объяснения сообщения «[file]: needs update», которое время от времени выплевывает git. Даже официальный Git FAQ объясняет это как TODO. Если бы кто-то мог объяснить А) что это значит; и б) как это исправить, буду крайне признателен.

rofrankel
источник
1
Хороший вопрос, как вы сказали, даже у GitFaq нет ответа: git.wiki.kernel.org/index.php/…
Джастин Эфир
1
Вы можете увидеть stackoverflow.com/questions/5367734/...
1
Вы можете точно сказать, какая команда производит это? А какая версия Git? Я пытался удалить их из пользовательского интерфейса, поэтому последние Git не должны говорить вам об этом, за исключением мест, которые я забыл ;-).
Матье Мой

Ответы:

108

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

Майкл Мрозек
источник
4
Это на самом деле не тяга - это слияние, которое является частью тяги. Вы увидите ту же ошибку, если попытаетесь объединить локальную ветвь с той же проблемой, и я думаю, что другие операции слияния (apply, stash apply ...) выдают похожие ошибки, если не те же.
Каскабель
Ах, спасибо. Это на самом деле имеет смысл. Я думаю, мне нужно убедиться, что я фиксирую изменения перед извлечением из другой ветки.
rofrankel
7
В случае, если это помогает результаты поиска, я также столкнулся с этой проблемой, пытаясь сделать git svn rebaseс грязной рабочей копией. Копить, сохранять, перебазировать, копить поп, и все было правильно с миром.
Адам Таттл
1
Сам файл не может быть изменен - ​​даже изменение атрибутов файла (таких как разрешения) может вызвать это.
Чиборг
22

Как отмечали другие, сообщение о необходимости обновления означает, что файл загрязнен или, другими словами, устарел. Но вместо того, чтобы делать сброс и начинать все сначала, то можно просто сделать это, git statusа затем, git add <file> если он находится в измененном списке. Потому что вы уже могли добавить файл раньше, но затем изменили его. Это случилось со мной, и с этим простым addя решил проблему.

Ломжа
источник
7

Войдите на свой производственный / целевой сервер, cdв каталог, содержащий ваше приложение, и выполните эти две команды.

1. Сбросить до последней версии

ВНИМАНИЕ, это удалит все ваши изменения:

git reset --hard HEAD

2. Потяните изменения

git pull origin master

NXT
источник
1
[git reset --hard HEAD] работал для меня. Я сделал коммит с общего диска Windows, но мой каталог Ubuntu не будет отражать коммит, который я только что сделал, даже если это была та же папка (Z: сопоставлена ​​с / var / www / html /). После выполнения этого, [git status] и [git pull] оба теперь показывают, что оно актуально.
Кит DC
Это решение, которое работало для меня тоже. Я попытался использовать Git поддерево с помощью SourceTree в Windows, и оно плохо испортилось в процессе.
Артем Руссаковский
3

Как говорится в ответе на другой связанный вопрос, сообщение просто означает, что у вас есть ожидающие изменения. Вы также получаете это, например, если вы вносите некоторые изменения git add, затем передумаете и сделаете это git reset HEAD fileс намерением начать все сначала.

tripleee
источник
2
git reset HEAD fileвызывает появление того же сообщения
эксперт
2

Эта ошибка может возникать, когда процесс перебазирования вносит дополнительные изменения в файлы, которые не находятся в целевой ветви.

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

Добавление новой записи для обработки нового типа файла как двоичного файла и повторная попытка всего процесса решили проблему для меня.

полномочие
источник
1

В моем случае я продолжал получать

assets/ElipseThree.png: needs update
You must edit all merge conflicts and then
mark them as resolved using git add

У меня были эти файлы в моем каталоге, но они были переименованы в моей текущей ветке. Чтобы исправить, я побежал

$ git mv assets/ElipseThree.png assets/elipseThree.png
$ git add assets/elipseHalfFull.png 
$ git rebase --continue

и это позволило мне продолжить

ThinkDigital
источник