Почему 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.