Я использовал git pull
и имел конфликт слияния:
unmerged: _widget.html.erb
You are in the middle of a conflicted merge.
Я знаю, что другая версия файла хороша, а моя - плоха, поэтому все мои изменения должны быть отменены. Как я могу это сделать?
git
version-control
git-merge
git-merge-conflict
Гвин Морфей
источник
источник
[rejected] gh-pages -> gh-pages (non-fast-forward)
Ответы:
Так как ваша
pull
неудача была неудачной, тоHEAD
(неHEAD^
) является последним "действительным" коммитом в вашей ветке:Другая часть, которую вы хотите, - позволить их изменениям перевесить ваши изменения.
Более старые версии git позволяли вам использовать «их» стратегию слияния:
Но с тех пор это было удалено, как объяснено в этом сообщении Джунио Хамано (сопровождающий Git). Как отмечено в ссылке , вместо этого вы должны сделать это:
источник
git fetch origin
->git reset origin (soft reset, your changes are still present)
->git checkout file_to_use_their_version_of another_file (steamroll your own changes back to match the origin)
Я больше никогда не использую git pull. Так как в борьбе между моим последним кодом и источником, источник всегда должен побеждать, я всегдаgit fetch
иgit rebase origin
. Это на самом деле делает мои слияния и конфликты немногочисленными.git log ..@{upstream}
илиgit diff ..@{upstream}
). После этого, как и вы, я переоформлю свою работу.git merge -X theirs remote_branch
вместо ,git pull --strategy=theirs remote_branch
какtheirs
выглядит , как вариант изrecursive
git merge --abort
гораздо предпочтительнее.Если ваша версия git> = 1.6.1, вы можете использовать
git reset --merge
.Также, как упоминает @Michael Johnson, если ваша версия git> = 1.7.4, вы также можете использовать
git merge --abort
.Как всегда, убедитесь, что у вас нет незафиксированных изменений перед началом слияния.
Из справочной страницы git merge
git merge --abort
эквивалентно тому,git reset --merge
когдаMERGE_HEAD
присутствует.MERGE_HEAD
присутствует, когда происходит слияние.Также относительно непринятых изменений при запуске слияния:
Если у вас есть изменения, которые вы не хотите фиксировать до начала слияния, просто внесите
git stash
их до слияния иgit stash pop
после завершения слияния или его отмены.источник
<commit>
? #GitMoment: -ogit merge --abort
просто синоним дляgit reset --merge
? Название, безусловно, имеет больше смысла, но имеет ли оно такую же функциональность?http://www.git-scm.com/docs/git-merge
источник
Это так просто.
Сам Git показывает вам решение, когда вы находитесь в такой ситуации и запускаете команду git status.
Надеюсь, это поможет людям.
источник
Я думаю это
git reset
тебе нужно.Имейте в
git revert
виду, что это означает что-то совершенно иное, скажем,svn revert
- в Subversiongit revert
возврат отменит ваши (незафиксированные) изменения, вернув файл в текущую версию из репозитория, тогда как «отменяет» коммит.git reset
должен сделать эквивалентsvn revert
, то есть отменить ваши нежелательные изменения.источник
В этом конкретном случае вы не хотите прерывать слияние, просто разрешите конфликт определенным образом.
Также нет особой необходимости сбрасывать и выполнять слияние с другой стратегией. Git правильно выделил конфликты, и требование принять изменения других сторон относится только к этому файлу.
Для необработанного файла в конфликте git делает доступной общую базовую, локальную и удаленную версии файла в индексе. (Это то место, откуда они читаются для использования в инструменте 3-way diff
git mergetool
.) Вы можете использовать ихgit show
для просмотра.Самый простой способ разрешить конфликт - использовать дословную версию удаленной версии:
Или с git> = 1.6.1:
источник
git 1.6.1
команда имеет много смысла, и это хорошо. Это именно то, что я хотел бы. Я думаю, что решение до 1.6.1 не элегантно и требует знаний о других частях git, которые должны быть отделены от процесса разрешения слияния. Но новая версия отличная!Для сценария, подобного, я сделал,
git fetch
аgit pull
затем понял, что восходящая ветвь не была главной ветвью, что приводило к нежелательным конфликтам.Это вернулось назад без сброса локальных изменений.
источник
Комментарии предполагают, что
git reset --merge
это псевдоним дляgit merge --abort
. Стоит отметить, чтоgit merge --abort
это эквивалентно только тому,git reset --merge
чтоMERGE_HEAD
присутствует. Это можно прочитать в справке git для команды слияния.После неудачного слияния, когда его нет
MERGE_HEAD
, неудачное слияние можно отменитьgit reset --merge
, но не обязательно с помощьюgit merge --abort
. Это не только старый и новый синтаксис для одного и того же .Лично я нахожу
git reset --merge
гораздо более мощным для сценариев, похожих на описанный, и неудачных слияний в целом.источник
git stash apply
вызвал конфликт слияния для меня, ноgit merge --abort
не помог, покаgit reset --merge
сделал.Если вы столкнулись с конфликтом слияния и не имеете ничего для фиксации, но все равно отображается ошибка слияния. После применения всех перечисленных ниже команд,
Пожалуйста, удалите
Файл [вырезать вставить в другое место в случае восстановления], а затем введите любую из следующих команд в зависимости от того, какую версию вы хотите.
Надеюсь, это поможет!!!
источник
Альтернатива, которая сохраняет состояние рабочей копии:
Я обычно советую против этого, потому что это фактически похоже на слияние в Subversion, поскольку оно отбрасывает отношения ветвления в следующем коммите.
источник
Начиная с Git 1.6.1.3
git checkout
можно было оформить заказ с любой стороны слияния:источник
Я обнаружил, что следующее работает для меня (вернуть один файл в состояние перед объединением):
источник
Sourcetree
Поскольку вы не фиксируете свое слияние, просто дважды щелкните по другой ветке (что означает оформить заказ), и когда sourcetree спросит вас об отмене всех изменений, тогда согласитесь :)
источник