Как игнорировать ошибку при 'git pull' о том, что мои локальные изменения будут перезаписаны слиянием?


569

Как игнорировать следующее сообщение об ошибке на Git pull?

Ваши локальные изменения в следующих файлах будут перезаписаны слиянием

Что если я захочу перезаписать их?

Я пробовал такие вещи, как git pull -f, но ничего не работает.

Чтобы было ясно, я хочу перезаписать только конкретные изменения, а не все.


Связанные, но не дубликаты: stackoverflow.com/questions/52704/…
Даниэль Хилгарт,

7
@BrianKnoblauch полностью согласен! Плюс, это не так уж много «слияния», если это «перезапись», не так ли? Я скучаю по SVN каждый день ...
user1944491

2
git config core.fileMode falseсохранить мои времена
Nolwennig


Что если я не хочу перезаписывать их?
Филипп Рего

Ответы:


439

Если вы хотите удалить все локальные изменения, включая файлы, которые не отслеживаются git, из вашей рабочей копии, просто спрячьте их:

git stash push --include-untracked

Если они вам больше не нужны, вы можете оставить этот тайник:

git stash drop

Если вы не хотите сохранять изменения, которые вы уже сделали - например, с помощью git add- тогда добавьте эту опцию --keep-index. Обратите внимание, что это все равно предотвратит слияние, если эти поэтапные изменения вступят в противоречие с изменениями из восходящего потока.


Если вы хотите перезаписать только определенные части ваших локальных изменений, есть две возможности:

  1. Зафиксируйте все, что вы не хотите перезаписывать, и используйте метод выше для остального.

  2. Используйте git checkout path/to/file/to/revertдля изменений, которые вы хотите перезаписать. Удостоверьтесь, что файл не установлен через git reset HEAD path/to/file/to/revert.


Возможность № 2 не работает. После выполнения команды ничего не происходит. При нажатии я все еще получаю ту же ошибку.
Мэ

1
@ user1132363: у меня работает. Пожалуйста, сначала проверьте это одним файлом. Кроме того, вы должны убедиться, что файл, который вы хотите перезаписать, не подготовлен.
Даниэль Хилгарт

3
Хитрость была в том, чтобы использовать git checkout HEAD^ path/to/file/to/revert. Использование HEAD ^ все изменило.
Мэй

2
@ user1132363: Это проверяет предыдущую версию, а не ту, которая в настоящее время проверена. Я не верю, что это правильный подход.
Даниэль Хилгарт

1
Я должен был уйти " save --keep-index".
Питер Мортенсен

318

Хорошо, с помощью двух других ответов, я пришел к прямому решению:

git checkout HEAD^ file/to/overwrite
git pull

7
Это сработало для меня. Не могли бы вы расширить этот ответ, т.е. что это на самом деле делает?
Патрис

3
Он сбрасывает локальные изменения, возвращаясь к ссылке на HEAD, которая, вероятно, является последним коммитом в основной ветке
k3a

32
почему ГОЛОВА ^ вместо ГОЛОВА?
Юра

19
HEAD ^ - это сокращение от HEAD ^ 1, что по сути означает один коммит перед HEAD. Вы также можете сделать HEAD ^ 2 для коммита до этого. Для получения дополнительной информации см. Git-scm.com/book/en/v2/… и stackoverflow.com/questions/1955985/… .
Давиднидхам

4
пожалуйста, объясните, что это делает в ответе
endolith

242

Это работает для меня, чтобы переопределить все локальные изменения и не требует идентификации:

git reset --hard
git pull

4
ТАК нужно работать над их ранжированием, громоздким, чтобы найти рабочий, высоко оцененный ответ на данный момент.
Бенедикт К.

3
@BenedictK. Я считаю, что система ранжирования надлежащим образом отражает «то, что большинство людей считают наиболее полезным». Они ранжируются по голосам. Все больше людей предпочитают другие решения. Это хорошее решение, но больше людей находят другие ответы более полезными.
Китцил

У меня просто отлично работает
Ender

супер просто =)
спасибо

танки, у меня отлично работает
Игорь

76

Вот решение, которое выбрасывает поэтапные изменения:

git reset file/to/overwrite
git checkout file/to/overwrite

11
Досадно, что если воспринимаемое различие происходит от того факта, что в файле были изменены новые строки при его извлечении, это не решит проблему.
DanielSank

1
Решил мою проблему.
Лоик Н.

Это лучший ответ, IMO, потому что он не нарушает какие-либо поставленные элементы, но решает проблему файла, предотвращающего извлечение
theRiley

65

Вы можете либо зафиксировать свои изменения перед слиянием, либо спрятать их:

  1. git stash save
  2. git merge origin/master
  3. git stash pop

10
Дело в том, что вы не должны этого делать. Просто возьмите текущий материал HEAD и… объедините его! Это действительно просто, Git, все другие VCS делают это ... но нет. Линус должен был сделать это раздражающим, чтобы использовать.
Джон

@Jon Это решение для Ubuntu, я не нашел ничего лучше, чем это.
Сунил Кумар,

К сожалению, --autostashопция доступна только с --rebaseопцией (
Евгений Коньков

Это будет представлять так много проблем, это не стоит. Также требуется 5 минут для загрузки. Также вводит ошибки «Unlink of file». downvote
Филипп Рего

51

Если вы хотите отменить ваши локальные изменения в одном файле, вы можете сделать следующее:

git checkout -- <file>

Затем вы можете перезаписать файл [s] последней версией, просто выполнив:

git pull

@pabloasc Это уничтожить ваши локальные изменения в этом файле.
Сунил Кумар,

6
Да, это так: «Что если я захочу перезаписать их?»
Дэвид

1
Оригинальный вопрос не может этого, этот ответ может дать кто-то кошмар, который может слепо скопировать вставить команду.
Сунил Кумар

Если вы уже сделали коммит, вам сначала нужно отменить коммит через, git reset HEAD~а затем выполнитьgit checkout
dopexxx

git checkout -- <file>терпит неудачу сerror: pathspec '<file>' did not match any file(s) known to git.
A__

18

Если ваш репозиторий содержит несколько файлов, которые удаляются из master:

  1. git checkout master
  2. git fetch origin
  3. git reset --hard origin/master
  4. git checkout -b newbranch

12

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

Используйте на свой риск.


Когда вы застряли из-за окончания строки, этот метод спасет вас
Дэн Писарски

Это не работает для меня. Файлы не существуют локально, и я все еще получаю ошибку.
PRMan

11

git stash save --keep-index не работал для меня.

Команда ниже работала как положено.

git reset --hard
git pull

Он отменяет все локальные изменения, если они вам не нужны.


10

Здесь так много ответов, что я не хочу добавлять еще один, но все вышеперечисленное более грубое, чем нужно. Я должен делать это все время, так как Git, кажется, запутался и говорит, что я изменил файлы, которые не изменились (не могу восстановить, потому что они не изменились, но я не могу вытащить, потому что они предположительно изменились) Самый простой и Самое быстрое, что я нашел до сих пор:

git stash
git stash drop
git pull

работал как шарм
Blaze

Удивительно! простое и рабочее решение.
naïveRSA

молодец, спасибо большое
Хамза

8

В недавнем Git вы можете добавить команду -r/ --rebaseon, pullчтобы перебазировать вашу текущую ветку поверх ветки upstream после выборки. Предупреждение должно исчезнуть, но есть риск, что вы получите некоторые конфликты, которые вам нужно будет решить.


В качестве альтернативы вы можете оформить другую ветку с применением силы, а затем вернуться обратно master, например:

git checkout origin/master -f
git checkout master -f

Затем потяните его снова как обычно:

git pull origin master

Использование этого метода может сэкономить ваше время от stashing ( git stash) и потенциальных проблем с разрешениями, перезагрузки файлов ( git reset HEAD --hard), удаления файлов ( git clean -fd) и т. Д. Кроме того, вышеизложенное легче запомнить.


8

Эта проблема связана с тем, что вы внесли изменения локально в файл / s, и тот же файл / файлы существует с изменениями в репозитории Git, поэтому перед pull / push вам нужно будет сохранить локальные изменения:

Чтобы перезаписать локальные изменения одного файла:

git reset file/to/overwrite
git checkout file/to/overwrite

Чтобы перезаписать все локальные изменения (изменения во всех файлах):

git stash
git pull
git stash pop

Также эта проблема может быть из-за того, что вы находитесь на ветке, которая не объединена с главной веткой.


5

git reset --hard && git clean -df

Внимание : это сбросит и удалит все неотслеживаемые файлы.


27
Один не использует топор, чтобы удалить муху со лба друга.
HonoredMule

3
НЕ используйте это, не зная, что некоторые файлы будут удалены.
Андромеда


4

Лучший способ решить эту проблему:

git checkout -- <path/file_name>

После этого вы можете перезаписать файл:

git pull origin master

У меня была упомянута проблема, потому что я обновил индекс, чтобы предположить, что файлы не изменились. Это все еще не позволило бы мне сделать тягу. Я использовал git checkout -- path/*только один раз, и это позволило мне выполнить тягу после.
Стивен О'Флинн

4

Это сработало для меня, чтобы отменить изменения на живом удаленном сервере и извлечь из системы управления исходным кодом GitHub:

git reset --hard
git pull origin master

4

Вот моя стратегия для решения проблемы.

Постановка задачи

Нам нужно внести изменения более чем в 10 файлов. Мы пытались PULL (git pull origin master), но Гит кричал:

ошибка: Ваши локальные изменения в следующих файлах будут перезаписаны слиянием. Пожалуйста, передайте изменения или сохраните их перед тем, как объединить.

Мы пытались выполнить commitи тогда pull, но они тоже не сработали.

Решение

На самом деле мы были в грязной стадии, потому что файлы находились в «промежуточной области», также называемой «индексной областью», а некоторые находились в «головной области» или «локальной директории Git». И мы хотели вытащить изменения с сервера.

Проверьте эту ссылку для получения информации о различных этапах Git в понятной форме: этапы GIT

Мы выполнили следующие шаги

  • git stash (это сделало наш рабочий каталог чистым. Ваши изменения хранятся в стеке Git).
  • git pull origin master (Вытащить изменения с сервера)
  • git stash apply (Применены все изменения из стека)
  • git commit -m 'message' (Совершил изменения)
  • git push origin master (Перенес изменения на сервер)
  • git stash drop (Бросить стек)

Давайте разберемся, когда и зачем нужно прятаться

Если вы находитесь в грязном состоянии, это означает, что вы вносите изменения в свои файлы, а затем вы по какой-либо причине вынуждены тянуть или переключаться на другую ветку для какой-то очень срочной работы, поэтому на данный момент вы не можете тянуть или переключаться, пока вы не совершите изменения. Команда stashздесь как рука помощи.

Из книги ProGIT , 2-е издание:

Часто, когда вы работали над частью своего проекта, все в беспорядке, и вы хотите немного переключить ветки, чтобы работать над чем-то другим. Проблема в том, что вы не хотите делать коммит наполовину проделанной работы, чтобы потом вернуться к этому вопросу. Ответом на этот вопрос является команда git stash. Stashing берет грязное состояние вашего рабочего каталога, то есть ваших измененных отслеживаемых файлов и поэтапных изменений, и сохраняет его в стек незавершенных изменений, которые вы можете повторно применить в любое время.


3

Если вы хотите перезаписать определенные изменения, вам нужен способ сообщить, какие из них вы хотите забыть.

Вы можете попытаться выборочно сохранить изменения, которые хотите отменить, git stash --patchи затем сбросить их git stash drop. Затем вы можете извлечь удаленные изменения и объединить их как обычно.


3

TL; DR;

git pull --rebase --autostash
  -r, --rebase[=false|true|merges|preserve|interactive]
       When true, rebase the current branch on top of the upstream branch after
       fetching. If there is a remote-tracking branch corresponding to the upstream

  --autostash, --no-autostash
       Before starting rebase, stash local modifications away if
       needed, and apply the stash entry when done

Я не знаю, почему это еще не ответили, но решение, как вы можете видеть, простое. Все ответы здесь предлагают то же самое: удалить / сохранить ваши локальные изменения и применить апстрим, а затем (если вы save) примените свои локальные изменения сверху.

Что git pull --rebase --autostashделает пошагово:

1. your local changes saved by `--autostash`
2. your local commits saved by `--rebase`
3. commits from upstream applied to your branch
4. your local commits are restored on top of upstream
5. your local changes are restored to working directory

Мой случай (вероятно, ваш тоже):

У меня есть локальные изменения (изменения в рабочем каталоге):

введите описание изображения здесь

Когда я пытаюсь получить удаленные изменения, я получаю сообщение об ошибке:

введите описание изображения здесь

Эти изменения не пересекаются с локальными изменениями:

введите описание изображения здесь

Поэтому, когда я pull --rebase --autostashлокальные изменения сохраняются и применяются без проблем автоматически

введите описание изображения здесь

Теперь мои локальные изменения немного ниже: введите описание изображения здесь


2

У меня был особый случай: у меня был файл с --assume-неизмененным. Это было трудно найти, так как git statusкоманда не показывала никаких изменений


У меня такая же проблема. Вы нашли способ обойти это? Я полагаю, что могу удалить, а затем повторно добавить предположить, что без изменений ... я просто вручную извлек эти файлы, чтобы получить неизмененные версии ... просто интересно, есть ли способ просто сделать checkout / rebase / merge просто перезаписать их.
Дэвид

1
Нет, я должен был отказаться от всего этого "предполагать неизменным".

2

Если вы хотите сохранить производственные изменения на сервере, просто объединитесь в новый элемент конфигурации. Метод обработки заключается в следующем:

git stash
git pull
git stash pop

Может быть, вы не выполняете все операции. Вы можете знать, что вы можете делать дальше.


Затем вы можете использовать Git diff - w + имя файла, чтобы автоматически подтвердить слияние кода
YanQing

1

Я игнорировал файл в своем репо, и когда я это сделал, git pull upstream masterя получил следующую ошибку:

ошибка: ваши локальные изменения в следующих файлах будут перезаписаны слиянием: myfile.js Пожалуйста, передайте ваши изменения или сохраните их, прежде чем вы сможете объединить. Aborting

Чтобы решить это, я сделал следующее

git update-index --no-assume-unchanged myfile.js

Я тогда сделал git statusи получил это сообщение

На главном филиале Ваша ветвь отстает от 'origin / master' на 4 коммита и может быть быстро перенесена. (используйте «git pull» для обновления вашей локальной ветки)

Изменения, не подготовленные для фиксации: (используйте «git add ...» для обновления того, что будет зафиксировано) (используйте «git checkout - ...» для отмены изменений в рабочем каталоге)

изменено: myfile.js

изменения не добавлены в коммит (используйте «git add» и / или «git commit -a»)

Затем я git checkout myfile.jsпоследовал git pull upstream master. На этот раз операция git pull прошла успешно.


1

Я сталкивался с этим, когда тянул от мастера.

То, как я справился, используя Visual Studio;

  1. Сначала я выполнил Undo commit для своего решения.
  2. Затем я выполнил процесс Git pull.

Надеюсь это поможет!



1

Я новичок в Git и не уверен, что мое решение хорошая идея.

Я проверил ВСЕ ответы, и ни один из них не работал для меня!

Но я нашел другое решение:

1. Backup both of local and repository versions of the file.
2. Delete the file from repository.
3. git add .
4. git commit
5. git push

Надеюсь это поможет.


1

Ошибка «Ваши локальные изменения в следующих файлах будут перезаписаны слиянием», потому что у вас есть некоторые изменения в локальном репо, которые еще НЕ были зафиксированы, поэтому перед извлечением из удаленного репо просто зафиксируйте изменения в локальном репо.

Допустим, у вашего удаленного репо есть какая-то ветка xyz, и вы хотите, чтобы эта ветка удаленного репо xyz была объединена (скопирована) с локальной веткой репозитория xyz,

{
git checkout xyz                  //check out to the respective branch in local repo
git commit -m "commiting message" //commit changes if any, in local repo branch xyz
git pull                          //it pulls remote xyz branch into local xyz branch
}

0

Если эта ошибка из-за окончания строки,

git add
git checkout mybranch

будет работать. Я не совсем уверен, почему это работает.



0

Это сообщение также может произойти, если git-lfsиспользуется и указатель файла был перезаписан реальным файлом.

тогда вы используете:

git stash
git lfs migrate import
git pull

полный вывод из моего дела

λ git stash
Saved working directory and index state WIP on master: 5d4ad47 Merge branch 'feature/...' into 'master'
Encountered 1 file(s) that should have been pointers, but weren't:
        public/apple-touch-icon.png

λ git pull
Updating 5a4ad44..b25f79d
error: Your local changes to the following files would be overwritten by merge:
        public/apple-touch-icon.png
Please commit your changes or stash them before you merge.
Aborting

λ git lfs migrate import
migrate: Fetching remote refs: ..., done
migrate: Sorting commits: ..., done
migrate: Rewriting commits: 100% (0/0), done
migrate: Updating refs: ..., done
migrate: checkout: ..., done


λ git pull
Updating 5d4ad47..a25c79a
Fast-forward
 public/apple-touch-icon.png | Bin 2092 -> 130 bytes
 public/favicon.ico          | Bin 6518 -> 1150 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)

см. https://github.com/git-lfs/git-lfs/issues/2839.


0

Я попытался, и это успешно, прежде чем вытащить, позвольте зафиксировать все файлы, которые вы не зафиксировали, то вы не будете получать эти сообщения от AS.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.