Как мне разрешить git сказать «Зафиксируйте свои изменения или спрячьте их до того, как вы сможете объединиться»?

763

Я сделал некоторые обновления на своем локальном компьютере, перенес их в удаленный репозиторий, и теперь я пытаюсь вытащить изменения на сервер, и я получаю сообщение;

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

WP-содержание / W3TC-конфигурации / master.php

Пожалуйста, передайте свои изменения или спрячьте их, прежде чем сможете объединить.

Итак, я побежал,

git checkout -- wp-content/w3tc-config/master.php

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

Любые идеи?

Джо Спраг
источник
11
Это более четкий вопрос с большим количеством деталей и лучшим ответом. Я думаю, что это важно держать это рядом. Да, сначала технически спросили другого, но удаление этого затруднило бы людям поиск ответов, которые они ищут.
Джо Спраг

Ответы:

1302

Вы не можете объединиться с локальными изменениями. Git защищает вас от потери потенциально важных изменений.

У вас есть три варианта:

  • Зафиксируйте изменения, используя

    git commit -m "My message"
    
  • Спрятать это.

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

    Чтобы спрятать, введите

    git stash
    

    Сделайте слияние, а затем вытяните тайник:

    git stash pop
    
  • Откажитесь от локальных изменений

    используя git reset --hard
    илиgit checkout -t -f remote/branch

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

    с помощью git checkout filename

STDCALL
источник
104
Вы также можете отменить локальные изменения для определенного файла, выполнив: git checkout filename
ckb
6
Спасибо. Я хотел бы добавить к этому, если вы делаете, git reset --hardвы также можете удалить неотслеживаемые файлы сgit clean -dfx
Jo Sprague
13
По умолчанию git stashне будут храниться файлы, для которых нет истории. Так что если у вас есть файлы, которые вы еще не добавили, но которые были бы перезаписаны или «созданы» слиянием, то слияние все равно будет заблокировано. В этой ситуации вы также можете git stash -uхранить незафиксированные файлы. Или вы можете просто удалить их!
Joeytwiddle
25
бегать git clean -dfxбыло ужасной идеей. Удалены некоторые файлы .gitignored, которые мне действительно нужны.
ezuk
5
Я столкнулся с ситуацией, когда у пользователя после git reset --hardвнесения изменений все еще были изменения!
Амеди Ван Гасс
83
git stash
git pull <remote name> <remote branch name> (or) switch branch
git stash apply --index

Первая команда временно сохраняет ваши изменения в тайнике и удаляет их из рабочего каталога.

Вторая команда переключает ветви.

Третья команда восстанавливает изменения, которые вы сохранили в тайнике (эта --indexопция полезна, чтобы убедиться, что промежуточные файлы все еще находятся в стадии подготовки ).

Loganathan
источник
1
stackoverflow.com/questions/15286075/… , также может быть полезным
vikramvi
2
чтобы объяснить точку зрения @ vikramvi: мы также можем использовать git stash popвместо git stash apply. Первый удаляет его из тайника, в то время как последний все еще держит его там
Anupam
27

Вы можете попробовать один из следующих методов:

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

Для простых изменений попробуйте перебазировать поверх него, потянув за изменения, например:

git pull origin master -r

Таким образом, он будет применять вашу текущую ветку к верхней ветке после загрузки.

Это эквивалентно: checkout master, fetchи rebase origin/masterкоманда Git.

Это потенциально опасный режим работы. Он переписывает историю, которая не сулит ничего хорошего, когда вы уже опубликовали эту историю. Не используйте эту опцию, если вы не прочитали git-rebase(1)внимательно.


проверять, выписываться

Если вас не волнуют ваши локальные изменения, вы можете переключиться на другую ветку временно (с применением силы) и переключить ее обратно, например,

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

сброс

Если вас не волнуют ваши локальные изменения, попробуйте сбросить его в HEAD (исходное состояние), например

git reset HEAD --hard

Если вышеупомянутое не поможет, это могут быть правила в вашем файле нормализации git ( .gitattributes), поэтому лучше зафиксировать то, что он говорит. Или ваша файловая система не поддерживает разрешения, поэтому вы должны отключить ее filemodeв своем git config.

Связанный: Как заставить "git pull" перезаписать локальные файлы?

kenorb
источник
1
Не работает: я получаю все то же сообщение типа «сначала спрятать ваши изменения». Когда я набираю «git stash», а затем «git pull» -> «error: у вас есть несохраненные изменения .. сначала сделайте stash».
Незадолго
@ trinity420 Может ли это быть вашими правами доступа к файлам, проверьте, git statusкакие у вас изменения после сохранения. Если ни один ответ не помогает, рассмотрите возможность добавления нового вопроса.
Кенорб
спасибо, но моя проблема решена, все перепробовал здесь, ничего не получалось, затем нажал «зафиксировать изменения», «объединить» в PHPStorm, а затем я развернул изменения, и это сработало ..
trinity420
14

Попробуй это

git stash save ""

и попробуйте снова потянуть

Мистер никто
источник
В моем случае мне нужно использовать git stash -u, как прокомментировано на stackoverflow.com/questions/15745045/…
Fruit
13

Итак, ситуация, с которой я столкнулся, была следующей:

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

кроме, прямо перед этим, был удаленным: так на самом деле это:

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

То, что происходило, было (я думаю, не на 100% положительным), крюк получения git post начал работать и облажаться из-за изменений движения в репозитории удаленного сервера, которые теоретически не должны были быть затронуты.

Так что я закончил тем, что проследил через ловушку post-receive и обнаружил это: мне пришлось перейти в удаленный репозиторий на сервере, и произошло изменение (которого не было в моем локальном репозитории, который, на самом деле, сказал, что он совпадает, никаких изменений, ничего для фиксации, обновлений и т. д.) Так что пока на локальном сервере не было никаких изменений, на сервере я затем сделал, git checkout -- some/file.extа затем локальные и удаленные репозитории действительно совпали, и я смог продолжить работу и развернуть. Не совсем уверен, как возникла эта ситуация, хотя пара дюжин разработчиков плюс изменения в ИТ могут быть как-то связаны с этим.

Майк
источник
2
Это вопрос или ответ?
stdcall
2
@stdcall - немного и того, и другого. Когда я столкнулся с этой ситуацией, как описано в вопросе, это то, что я должен был сделать, чтобы это исправить. Это определенно не было нормальным разрешением git, и, судя по этому вопросу, похоже, что это может быть та же самая ненормальная ситуация (т. Е. Изменения конфигурации на сервере, но локальные изменения отсутствуют). Если у кого-то есть больше идей относительно того, почему (или как) это произошло, я бы приветствовал любое понимание.
Майк
7

ВНИМАНИЕ: Это удалит неотслеживаемые файлы, поэтому это не лучший ответ на этот вопрос.

В моем случае я не хотел хранить файлы, так что это сработало для меня:

Git 2.11 и новее:

git clean  -d  -fx .

Старый Git:

git clean  -d  -fx ""

Ссылка: http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -x означает, что игнорируемые файлы также удаляются, а также файлы, неизвестные git.

  • -d означает удаление неотслеживаемых каталогов в дополнение к неотслеживаемым файлам.

  • -f требуется, чтобы заставить его работать.

Темная материя
источник
4

Чтобы сохранить записи о вновь созданных файлах при решении этой проблемы:

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

  1. Поставь свои локальные изменения. (не совершать). Постановка необходима для создания патча новых созданных файлов (так как они все еще не отслежены)

git add .

  1. Создать патч для записи

git diff --cached > mypatch.patch

  1. Отменить локальные изменения и удалить новые локальные файлы

git reset --hard

  1. Вытащить изменения

git pull

  1. Примените свой патч

git apply mypatch.patch

Git объединяет изменения и создает файлы .rej для изменений, которые не объединяются.

По предложению Anu, если у вас есть проблемы с применением патча, попробуйте:

git apply --reject --whitespace=fix mypatch.patch Этот ответ git: patch не применяется, подробно рассказывает об этой проблеме

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

Manpreet
источник
Я хотел добавить часть кода новыми изменениями, поэтому я сделал: 1. создал патч из моей локальной ветки dev 2. сделал hard reset 3. вытянул новые изменения из master в dev (чтобы избежать конфликтов слияния) 4 . сделал небольшое изменение в моем локальном dev 5. передал удаленному dev 6. применил патч назад -> Ошибка error: patch failed: yourfile.py:33 error: yourfile.py: patch does not applyполучена : у меня все еще есть mypatch.patch, но я не знаю, почему он не применяется, и я потерял свои изменения !
Ану
Я понял, правильная команда была git apply --reject --whitespace=fix mypatch.patch, я получил свои изменения, фу !!! [Спасибо] ( stackoverflow.com/a/15375869/6484358 )
Ану
1
Ану, команда git apply mypatch.patch верна для применения патча, это то, что я использую все время, могут быть некоторые проблемы с самим созданным патчем, и вы никогда не потеряете свои изменения, если у вас есть патч в руке, это содержит все консолидированные изменения.
Manpreet
2

Просить совершить, прежде чем тянуть

  • мерзавец
  • git pull origin << фирменное имя >>

Если нужно :

  • Git Stash применить
Рахул Манкар
источник
1
Используйте git stash, когда вы хотите записать текущее состояние рабочего каталога и индекса, но хотите вернуться в чистый рабочий каталог. Команда сохраняет ваши локальные изменения и возвращает рабочий каталог в соответствие с коммитом HEAD.
Пушпак Шарма
2

Для меня только git reset --hardсработало.

Фиксация не была вариантом, так как нечего было коммитить.

Прятаться было не вариант, потому что нечего было прятать.

Похоже, это могло быть из исключенных файлов .git/info/excludeи с git update-index --assume-unchanged <file>некоторыми файлами.

Лео
источник
0

В моем случае я сделал резервную копию, а затем удалил файл, на который Git жаловался, зафиксировал его, затем смог наконец проверить другую ветку.

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

CodyBugstein
источник
0

Я попробовал первый ответ: git stashс наибольшим количеством очков, но сообщение об ошибке все еще выскакивало, и затем я обнаружил, что эта статья фиксирует изменения вместо тайника «Reluctant Commit»

и сообщение об ошибке исчезло окончательно:

1: git add .

2: git commit -m "this is an additional commit"

3: git checkout the-other-file-name

тогда это сработало. надеюсь, этот ответ поможет. :)

Софи Кай
источник
0

Если вы используете Git Extensions, вы сможете найти свои локальные изменения, Working directoryкак показано ниже:

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

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

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

Когда вы нашли какое-то незафиксированное изменение:

Выберите строку с помощью Working directory, перейдите на вкладку « Разница », щелкните правой кнопкой мыши строки с карандашом (или +или -), выберите « Сброс», чтобы сначала зафиксировать или зафиксировать или сохранить, или все, что вы хотите с ним сделать.

Бижан
источник
0

Для меня это сработало:

git reset --hard

а потом

git pull origin <*current branch>

после того

git checkout <*branch>

Хлоя
источник
0

Вероятно

git --rebase --autostash

помог бы

Евгений Коньков
источник