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

128

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

У меня есть проект с двумя ветками ( 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

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

Ответы:

128

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

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

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применит последнюю запись в тайнике к вашей текущей ветке, восстановит сохраненные изменения и удалит их из тайника.

Keltar
источник
3
Спасибо. Вы уверены, что это не повлияет на мое рабочее дерево (не добавленные файлы)? Я не хочу потерять свои изменения: - /
Manolo
Ой, опечатка, addкогда оно действительно save... обновлено. То есть для других файлов? git stash saveбез параметра имени файла сохранит все измененные файлы, если вы хотите (и вернет их в состояние последней фиксации). И наличие дополнительной копии дерева каталогов никогда не повредит, но я всегда параноидально относился к этому.
keltar
Дело в том, чтобы сохранить все измененные файлы, кроме того, который я хочу добавить в masterветку. Также как вариант были бы popизменения в другой ветке?
Manolo
Я не уверен, что ты имеешь в виду. Да, вы можете применить тайник к другой ветке, но он просто заменит содержимое файлов, а не объединит их.
keltar
1
@Honey это не имеет отношения к веткам, проблема в незафиксированных изменениях. Checkout, по определению, должен сбросить ваши файлы до состояния master, но при этом будет потеряно текущее содержимое, а поскольку это содержимое не зафиксировано, будет невозможно вернуться в это состояние позже, поэтому возникает ошибка, поэтому вы потом не расстроится из-за потерянных изменений.
keltar
151

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

git checkout -f branch

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

-f, --force

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

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

KikiYu
источник
7
Когда мой git застрял (никаких локальных изменений, но все же эта ошибка), это решение помогло мне!
lukyer
6
Спасибо, вы спасли мой экран от попадания в него кулака.
Owl
3
Я потерял свои изменения таким образом
Яцек Дзюрджиковски
1
Да, вы потеряете изменения, сделав это, это должно сопровождаться большой оговоркой.
Alexander Mills
Я хочу наоборот. master находится за моей веткой, и я в курсе master, но он все еще не может переключать ветки. Должно быть ошибка git.
jgmjgm
12

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

git checkout -f branch_name
Дипика Патель
источник
1
Это sudoне обязательно, это только нарушит права доступа к файлам. Это та же команда git, которую опубликовал @kiki_yu годом ранее, но она еще хуже.
kenorb
2
Я потерял свои изменения таким образом
Яцек Дзюрджиковски
2
@JacekDziurdzikowski Итак, вы дважды потеряли свои изменения (см. Комментарий к ответу kiki_yu), оба применяя решения, в которых очень явно упоминается, что отмена локальных изменений была самой целью . Мой детектор сарказма сломан или ... ты серьезно?
RomainValeri
@RomainValeri Хм, я думаю, это был мой способ предупредить других, которые только начинают использовать git (они должны быть новичками, если читают этот пост), чтобы они были готовы попрощаться с любыми внесенными изменениями. Я думал, что изменения, сделанные в одной ветке, должны оставаться в этой ветке, пока я не проверю ее снова. Совет новичкам, которые тоже так думают: используйте git stash :)
Яцек Дзюрджиковски
Повторяющийся ответ без причины. В первом ответе еще больше информации.
MAChitgarha
9

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

git checkout -f ветка

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

BeNiza
источник
0

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

Виталий Зданевич
источник
Будет более полезно, если вы дадите больше объяснений по этому поводу.
MAChitgarha
-1

Если вы получили это при попытке проверить другую ветку:

my-mac:myGHProject ~$ git checkout other-branch
error: Your local changes to the following files would be overwritten by checkout:
    src/main/resources/reference.conf

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

my-mac:myGHProject ~$ git branch
  * my-local-branch
  * develop    

my-mac:myGHProject ~$ git status
On branch my-local-branch
   Changes not staged for commit:
   (use "git add <file>..." to update what will be committed)
   (use "git checkout -- <file>..." to discard changes in working directory)
 modified:   src/main/resources/reference.conf

my-mac:myGHProject ~$ git add src/main/resources/reference.conf

my-mac:myGHProject ~$ git commit -m "updates on some config"
  [my-local-branch] updates on some config
  1 file changed, 131 insertions(+), 85 deletions(-)

Теперь, когда вы это сделали, вы можете проверить другую ветку и довольно легко переключаться туда и обратно.

my-mac:myGHProject ~$ git checkout other-branch

my-mac:myGHProject ~$ git status
  On branch other-branch

my-mac:myGHProject ~$ git checkout my-local-branch
  Switched to branch 'my-local-branch'

Просто убедитесь, что вы оба находитесь в правой ветке и нажимаете на правую ветку, когда запускаете команду git push origin $ {branch}. Примечание: если ваш проект подключен непосредственно к Intellij, вы можете увидеть, что вы изменили свою ветку в правом нижнем углу главного окна.

Тони Фрейзер
источник