Почему git автоматически не объединяет конфликты без изменений в файлы с локальным изменением?
Выполняя git pull
периодически, я замечаю, что команда иногда заканчивается ошибкой, например
Your local changes to the following files would be overwritten by merge:
app/Ribbon.xaml
Please, commit your changes or stash them before you can merge
В этом конкретном случае у меня есть одна строка, модифицированная в этом файле локально, и ее новая версия в репозитории также изменила одну далекую линию - конфликтов нет, нет переименования, изменений в концах строк, нет подмодулей. Поэтому в этом случае я ожидал бы git для слияния изменений автоматически, не требуя от меня git commit
или git stash
...
Я знаю, что git может автоматически сменить изменения (обычно это делается), но не в этом случае.
И вопрос: что может помешать git автоматически сменять конфликты без конфликтов (в локально измененные файлы)?
Я думаю, некоторые данные могут быть пропущены в моем вопросе. Если да, дайте мне знать, что еще нужно проверить.
[27.JUN.2012 14:15] Согласно подсказкам в ответах, это нормальная политика git отказать в слиянии любых изменений с локально модифицированными файлами. Учитывая это, я бы перефразировал вопрос как-то вроде
, как включить git для автоматического слияния изменений в локально измененных файлах?
Ответы
Ответ 1
Я думаю, что это просто естественное поведение git. Поскольку ваш файл не установлен или не установлен, git действительно не знает, что вы хотите сделать с файлом. Это лучше для git отклонить притяжение, а не угадать, каково ваше намерение с файлом. Обычно я сбрасываю свои незафиксированные и неустановленные изменения перед тем, как вытащить их, а затем применим затем кэш.
Ответ 2
Git работает с файлами в репозитории, в каталоге .git/в корне проекта.
Git использует этот репозиторий для сравнения при выполнении растяжек и слияний.
В вашем случае Git достаточно умен, чтобы заметить, что вы внесли изменения, но не добавили или не перенесли их, и поэтому Git не сможет работать с ними.
Вы получите сообщение , хотя изменения находятся в отдельных областях кода, потому что вы еще не добавили файл в Git, а Git на самом деле не знаете, будет ли быть конфликтом... до Git 'видит' файл. Если вы git add
и затем git commit
файл, поэтому он находится в репозитории, тогда Git может "работать" на нем, и если изменения находятся в отдельных областях , он сможет выполнить это автоматическое слияние, который вы искали.
Таким образом, это сообщение появляется.
Ваши варианты:
-
Добавьте и скопируйте локальные файлы, затем Git может выполнять слияния.
-
Сбросьте локальные изменения, чтобы сохранить их в стороне, а затем вытащите новые файлы сервера.
-
Создайте ветку с вашими текущими изменениями - используйте checkout, затем вернитесь к мастеру и используйте reset.