Я столкнулся с конфликтом слияния. Как я могу прервать слияние?
Я использовал git pull
и имел конфликт слияния:
unmerged: _widget.html.erb
You are in the middle of a conflicted merge.
Я знаю, что другая версия файла хороша и моя шахматная, поэтому все мои изменения должны быть отменены. Как я могу это сделать?
Ответы
Ответ 1
Поскольку ваш pull
был неудачным, тогда HEAD
(not HEAD^
) является последним "действительным" фиксацией в вашей ветке:
git reset --hard HEAD
Другая часть, которую вы хотите, должна позволить своим изменениям превышать ваши изменения.
Старые версии git позволили вам использовать стратегию слияния "их":
git pull --strategy=theirs remote_branch
Но это с тех пор было удалено, как описано в это сообщение Юнио Хамано (сопровождающий git). Как указано в ссылка, вместо этого вы сделаете следующее:
git fetch origin
git reset --hard origin
Ответ 2
Если ваша версия git равнa > 1.6.1, вы можете использовать git reset --merge
.
Кроме того, как упоминает @Michael Johnson, если ваша версия git равнa > 1.7.4, вы также можете использовать git merge --abort
.
Как всегда, перед запуском слияния убедитесь, что у вас нет незафиксированных изменений.
На странице git merge man
git merge --abort
эквивалентен git reset --merge
, когда присутствует MERGE_HEAD
.
MERGE_HEAD
присутствует, когда выполняется слияние.
Кроме того, в отношении незафиксированных изменений при запуске слияния:
Если у вас есть изменения, которые вы не хотите совершать до начала слияния, просто git stash
их перед слиянием и git stash pop
после завершения слияния или отмены его.
Ответ 3
git merge --abort
Прервать текущий процесс разрешения конфликтов и попытаться восстановить состояние предварительного объединения.
Если были неработающие изменения рабочей ситуации, присутствующие при слиянии началось, git merge --abort
в некоторых случаях не сможет восстановите эти изменения. Поэтому рекомендуется всегда зафиксируйте или запишите свои изменения перед запуском git merge.
git merge --abort
эквивалентно git reset --merge
, когда MERGE_HEAD
.
http://www.git-scm.com/docs/git-merge
Ответ 4
Это так просто.
git merge --abort
Git сам покажет вам решение, когда вы находитесь в такой ситуации, и запустите команду git status.
git status
Надеюсь, это поможет людям.
Ответ 5
Я думаю, что вам нужно git reset
.
Остерегайтесь того, что git revert
означает что-то очень отличное от, скажем, svn revert
- в Subversion возврат будет отбрасывать ваши (незафиксированные) изменения, возвращая файл в текущую версию из репозитория, тогда как git revert
"отменяет" фиксация.
git reset
должен делать эквивалент svn revert
, то есть отбрасывать нежелательные изменения.
Ответ 6
В этом конкретном случае использования вы действительно не хотите прервать слияние, просто разрешите конфликт определенным образом.
Нет особой необходимости в reset и выполнять слияние с другой стратегией. Конфликты были правильно выделены с помощью git, и требование принять изменения сторонних сторон - только для этого одного файла.
Для несвязанного файла в конфликте git предоставляет доступную общую базу, локальную и удаленную версии файла в индексе. (Здесь они считываются для использования в трехстороннем инструменте diff с помощью git mergetool
.) Вы можете использовать git show
для их просмотра.
# common base:
git show :1:_widget.html.erb
# 'ours'
git show :2:_widget.html.erb
# 'theirs'
git show :3:_widget.html.erb
Самый простой способ разрешить конфликт для использования удаленной версии дословно:
git show :3:_widget.html.erb >_widget.html.erb
git add _widget.html.erb
Или, с git >= 1.6.1:
git checkout --theirs _widget.html.erb
Ответ 7
Поскольку комментарии предполагают, что git reset --merge
является псевдонимом для git merge --abort
, стоит заметить, что git merge --abort
эквивалентен только git reset --merge
, если присутствует a MERGE_HEAD
. Это можно прочитать в справке git для команды merge.
git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.
После неудачного слияния, когда нет MERGE_HEAD
, сбойное слияние может быть отменено с помощью git reset --merge
, но необязательно с git merge --abort
, , поэтому они не только старый и новый синтаксис для одной и той же вещи.
Лично я нахожу git reset --merge
гораздо более мощным для сценариев, подобных описанному, и неудачных слияний вообще.
Ответ 8
И если вы закончите конфликт слиянием и не имеете каких-либо вещей для фиксации, но все же ошибка слияния отображается после применения всех указанных ниже команд,
git reset --hard HEAD
git pull --strategy=theirs remote_branch
git fetch origin
git reset --hard origin
удалите
.git\index.lock
файл [вырезать пасту в другое место в случае восстановления], а затем ввести любую из нижеуказанных команд в зависимости от того, какую версию вы хотите.
git reset --hard HEAD
git reset --hard origin
Надеюсь, это поможет!!!
Ответ 9
Так как Git 1.6.1.3 git checkout
удалось проверить с обеих сторон слияния:
git checkout --theirs _widget.html.erb
Ответ 10
Альтернативой, сохраняющей состояние рабочей копии, является:
git stash
git merge --abort
git stash pop
Я вообще советую против этого, потому что это эффективно, как слияние в Subversion, поскольку оно отбрасывает отношения ветвления в следующем commit.
Ответ 11
Для такого сценария я сделал git fetch
и git pull
, а затем понял, что восходящая ветвь не была главной ветвью, что приводило к нежелательным конфликтам.
git reset --merge
Это вернулось назад без сброса локальных изменений.
Ответ 12
Я нашел, что для меня работало (верните один файл в состояние предварительного объединения):
git reset *currentBranchIntoWhichYouMerged* -- *fileToBeReset*