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

Этот вопрос похож на этот, но более конкретный.

У меня есть проект с двумя ветками: staging и beta. Я разрабатываю на staging и использую ветку master для исправления ошибок. Поэтому, если я работаю над постановкой и вижу ошибку, я перехожу на ветку master:

git checkout master

и сделайте то же самое:

git add fileToAdd
git commit -m "bug fixed"

а затем сливаюсь с обеими ветками:

git checkout staging
git merge master
git checkout beta
git merge beta

И неважно, есть ли в рабочем дереве другие файлы.

Но теперь, когда я пытаюсь перейти на ветку master, я получаю сообщение об ошибке:

error: Your local changes to the following files would be overwritten by checkout:
src/Pro/ConvocationBundle/Controller/DefaultController.php
Please, commit your changes or stash them before you can switch branches.
Aborting

Я подумал, что надо удалить файл из области подготовки:

git reset HEAD src/Pro/ConvocationBundle/Controller/DefaultController.php

но я получаю ту же ошибку. Если я сделаю git status, я получу No changes to commit


person Manolo    schedule 15.03.2014    source источник
comment
Вы пробовали reset --hard? Если вы действительно уверены, что хотите отменить свои изменения. Или используйте тайник, если вы этого не сделаете.   -  person keltar    schedule 15.03.2014
comment
@keltar - Нет. Я не хочу сбрасывать свои изменения. Просто оставьте их на рабочем дереве для более позднего коммита.   -  person Manolo    schedule 15.03.2014
comment
Я не думаю, что вы можете переключать ветки, сохраняя незафиксированные изменения, но я легко могу ошибаться - это не совсем мое поле. Попробуйте git add your-file и зафиксируйте.   -  person keltar    schedule 15.03.2014
comment
@keltar - Я раньше так работал. Я не хочу сейчас фиксировать какие-либо изменения в staging.   -  person Manolo    schedule 15.03.2014
comment
Возможно, ваш конфликтующий файл не был изменен, когда вы пытались это сделать раньше. У вас есть изменения, git нужно их где-то сохранить, чтобы восстановить позже. Без коммитов это вряд ли возможно. Но если вы действительно не хотите - используйте stash, именно поэтому он существует.   -  person keltar    schedule 15.03.2014
comment
@keltar - Буду признателен за подробный ответ.   -  person Manolo    schedule 15.03.2014


Ответы (7)


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

Ваши варианты, на мой взгляд, следующие: зафиксировать, а затем внести в этот коммит дополнительные изменения (вы можете изменять коммиты в git, если они не pushed); или - используйте тайник:

git stash save your-file-name
git checkout master
# do whatever you had to do with master
git checkout staging
git stash pop

git stash save создаст тайник, содержащий ваши изменения, но не связанный ни с одной фиксацией или даже ветвью. git stash pop применит последнюю запись в тайнике к вашей текущей ветке, восстанавливая сохраненные изменения и удаляя их из тайника.

person keltar    schedule 15.03.2014
comment
Спасибо. Вы уверены, что это не повлияет на мое рабочее дерево (не добавленные файлы)? Я не хочу потерять свои изменения: - / - person Manolo; 15.03.2014
comment
К сожалению, add неверно набран, хотя на самом деле save .. обновляется. То есть для других файлов? git stash save без параметра имени файла сохранит все измененные файлы, если вы хотите (и вернет их в состояние, которое было выполнено последним). И наличие дополнительной копии дерева каталогов никогда не повредит, но я всегда параноидально относился к этому. - person keltar; 15.03.2014
comment
Дело в том, чтобы сохранить все измененные файлы, кроме того, который я хочу добавить в ветку master. Кроме того, можно ли pop внести изменения в другую ветку? - person Manolo; 15.03.2014
comment
Я не уверен, что ты имеешь в виду. Да, вы можете применить тайник к другой ветке, но он просто заменит содержимое файлов, а не объединит их. - person keltar; 15.03.2014
comment
Идеально! Работал как шарм. Спасибо ;-) - person Manolo; 15.03.2014
comment
Что, если вы хотите посмотреть, где эти изменения? - person CodyBugstein; 01.03.2015
comment
@Imray, что значит "где"? Есть git stash show, который может быть (а может и не быть) тем, что вы хотели. - person keltar; 01.03.2015
comment
Я имею в виду, я хочу знать, где в моем файле я внес изменения, которые вызывают это приглашение - person CodyBugstein; 01.03.2015
comment
@Imray git status или git diff. Проблема вызвана только незафиксированными изменениями, что и покажет эта команда. - person keltar; 01.03.2015
comment
Я не понимаю, почему произошла эта ошибка. Разве это не вся концепция разделения ветвей. Я только что сделал git checkout master и получил эту ошибку, которая не имеет никакого смысла. какое отношение master имеет к любой другой ветке? - person Honey; 19.08.2016
comment
@Honey это не имеет отношения к веткам, проблема в незафиксированных изменениях. Checkout по определению должен сбросить ваши файлы до состояния master, но при этом будет потеряно текущее содержимое, и, поскольку это содержимое не зафиксировано, будет невозможно вернуться в это состояние позже, поэтому возникает ошибка. Вы не будете потом расстраиваться из-за потерянных изменений. - person keltar; 19.08.2016
comment
Работал как шарм. до этого я сохранял свои изменения в блокноте, прятал оригинал и заменял его после переключения ветвей. этот ответ был более понятным и простым и простым способом обрабатывать коммиты. :) - person Shashaank V V; 15.03.2019
comment
Неполный ответ. Голосовать против. Первая команда может выдать ошибку. Никаких локальных изменений для сохранения - person Philip Rego; 18.05.2019
comment
Не ответ. Почему? Что, если я не хочу изменений? Что делать, если изменения незаметны и незаметны? - person Sean Munson; 23.01.2020
comment
Используйте git stash drop <stash_id>, чтобы удалить определенный тайник, или git stash clear, чтобы удалить их все. - person mloning; 31.01.2020
comment
Итак, если мы снова git stash save your-file-name, тогда он удалит предыдущий тайник или объединит их обоих? - person Ali Raza; 18.02.2021
comment
@AliRaza создаст новую запись в тайнике. Вы можете просмотреть их через git stash list. - person keltar; 18.02.2021

Я столкнулся с той же проблемой и решил ее

git checkout -f branch

и его спецификация довольно ясна.

-f, --force

При переключении ветвей продолжайте, даже если индекс или рабочее дерево отличается от HEAD. Это используется, чтобы выбросить локальные изменения.

При проверке путей из индекса не допускайте сбоев при несоединенных записях; вместо этого не объединенные записи игнорируются.

person KikiYu    schedule 14.09.2015
comment
Когда мой git застрял (никаких локальных изменений, но все же эта ошибка), это решение помогло мне! - person lukyer; 19.11.2015
comment
Спасибо, вы спасли мой экран от попадания в него кулака. - person Owl; 07.09.2016
comment
Я потерял свои изменения таким образом - person Jacek Dziurdzikowski; 20.02.2018
comment
Да, вы потеряете изменения, сделав это, это должно сопровождаться большой оговоркой. - person Alexander Mills; 15.07.2018
comment
Я хочу наоборот. master находится за моей веткой, и я в курсе master, но он все еще не может переключать ветки. Должно быть ошибка git. - person jgmjgm; 16.04.2019

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

git checkout -f branch_name
person Deepika Patel    schedule 05.10.2015
comment
sudo не требуется, это только нарушит права доступа к файлам. Это та же команда git, что была опубликована годом ранее @kiki_yu, но она еще хуже. - person kenorb; 24.07.2016
comment
Я потерял свои изменения таким образом - person Jacek Dziurdzikowski; 20.02.2018
comment
@JacekDziurdzikowski Итак, вы дважды теряли свои изменения (см. Комментарий к ответу kiki_yu), оба применяя решения, в которых очень явно упоминалось, что отмена локальных изменений была самой целью. Мой детектор сарказма сломан или ... ты серьезно? - person RomainValeri; 22.11.2018
comment
@RomainValeri Хм, я думаю, это был мой способ предупредить других, которые только начинают использовать git (они должны быть новичками, если читают этот пост), чтобы они были готовы попрощаться с любыми внесенными изменениями. Я подумал, что изменения, сделанные в одной ветке, должны оставаться в этой ветке, пока я не проверю ее снова. Подсказка новичкам, которые тоже так думают: используйте git stash :) - person Jacek Dziurdzikowski; 23.11.2018
comment
Повторяющийся ответ без причины. В первом ответе еще больше информации. - person MAChitgarha; 24.01.2020

Я столкнулся с той же проблемой и решил ее

git checkout -f ветка

Что ж, будьте осторожны с переключателем -f. Вы потеряете все незафиксированные изменения, если воспользуетесь переключателем -f. Хотя могут быть некоторые варианты использования, в которых полезно использовать -f, в большинстве случаев вы можете захотеть stash свои изменения, а затем switch ветвей. Процедура stashing объяснена выше.

person BeNiza    schedule 31.07.2018
comment
Так я потерял свои местные изменения - person Animesh Kumar; 26.10.2020

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

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

git fetch

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

Например, для разработчиков iOS:

pod deintegrate

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

Если желаемая ветка не нова, вы можете выбрать фиксацию и исправить конфликты или сохранить изменения, а затем исправить конфликты.

1. Git Stash (рекомендуется)

git stash
git checkout <desiredBranch>
git stash apply

2. Вишневый сбор (дополнительная работа)

git add <your file>
git commit -m "Your message"
git log

Скопируйте sha вашего коммита. Затем откажитесь от нежелательных изменений:

git checkout .
git checkout -- . 
git clean -f -fd -fx

Убедитесь, что ваша ветка обновлена:

git fetch

Затем оформляйтесь в нужное отделение

git checkout <desiredBranch>

Затем вишня выберите другой коммит:

git cherry-pick <theSha>

Теперь исправим конфликт.

  1. В противном случае вы можете также отказаться от изменений текущих веток с помощью:
git checkout -f branch
person ScottyBlades    schedule 28.08.2020
comment
git stash работал отлично - person Dm Mh; 16.04.2021

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

person Vitaly Zdanevich    schedule 29.10.2018
comment
Будет более полезно, если вы дадите больше объяснений по этому поводу. - person MAChitgarha; 24.01.2020

у меня была такая же ошибка. На самом деле я попытался переопределить старый пакет SDK flutter новым обновленным пакетом. так что произошла ошибка.

Я открыл каталог flutter sdk с VS Code и очистил проект

используйте этот код в VSCode cmd

git clean -dxf

затем используйте git pull

person mohammed arshad    schedule 24.02.2021