Я столкнулся с конфликтом слияния. Как я могу прервать слияние?

Я использовал git pull и имел конфликт слияния:

  unmerged: _widget.html.erbВы находитесь в середине  конфликтующее слияние.  

Я знаю, что другая версия файла хороша, а моя плохая, поэтому от всех моих изменений следует отказаться. Как я могу это сделать?


Поскольку ваше pull было неудачным, то HEAD (а не HEAD ^ ) — это последний «действительный» коммит в вашей ветке:

  git  reset --hard HEAD  

Другая часть, которую вы хотите, — позволить их изменениям отменять ваши изменения.

Более старые версии git позволяли использовать стратегию слияния «их»:

  git pull --strategy = их удаленная_ветвь   

Но с тех пор это было удалено, как объясняет в этом сообщении Джунио Хамано (сопровождающий Git). Как указано в ссылке, вместо этого вы должны сделать следующее:

  git fetch origingit reset --hard origin  

12


Если ваша версия git> = 1.6.1, вы можете использовать git reset --merge .

Кроме того, как упоминает @Michael Johnson, если ваша версия git> = 1.7.4, вы также можете использовать git merge --abort .

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

Из команды git merge man page

git merge --abort эквивалентно git reset --merge , когда MERGE_HEAD присутствует.

MERGE_HEAD присутствует, когда выполняется слияние.

Кроме того, что касается незафиксированных изменений при запуске merge:

Если у вас есть изменения, которые вы не хотите фиксировать перед началом слияния, просто git stash их перед m erge и git stash pop после завершения слияния или его прерывания.

9


  git merge --abort  

Прервать текущий процесс разрешения конфликтов и попытайтесь восстановить состояние до слияния.

Если при запуске слияния присутствовали незафиксированные изменения рабочего дерева, git merge --abort будет в некоторых случаях невозможно восстановить эти изменения. Поэтому рекомендуется всегда фиксировать или хранить ваши изменения перед запуском git merge.

git merge --abort эквивалентно git reset - -merge , если присутствует MERGE_HEAD .

http://www.git-scm.com/docs/git-merge

1


Я думаю, что это git reset вам нужно.

Помните, что git revert означает нечто совсем иное, чем, скажем, svn revert — в Subversion при возврате будут отброшены ваши ( незафиксированные) изменения, возвращая файл в текущую версию из репозитория, тогда как git revert «отменяет» фиксацию.

git reset должен выполнять эквивалент svn revert , то есть отбрасывать ваши нежелательные изменения.

0


В этом конкретном варианте использования вы действительно не хотите прерывать слияние, просто разрешите конфликт определенным образом .

Нет особой необходимости сбрасывать и выполнять слияние с другой стратегией. Конфликты были правильно выделены git, и требование принять изменения других сторон относится только к этому одному файлу.

Для неслитого файла в конфликте git делает доступным общую базу, локальную и удаленную. версии файла в index. (Здесь они считываются для использования в инструменте трехстороннего сравнения с помощью 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.erbgit add _widget.html.erb  

Или с git> = 1.6.1:

  git checkout --theirs _widget.html.erb  

3


Комментарии предполагают, что git reset --merge является псевдонимом для git merge --abort код>. Стоит отметить, что git merge --abort эквивалентен только git reset --merge при условии, что MERGE_HEAD настоящее. Это можно прочитать в справке git для команды слияния.

git merge —abort эквивалентен git reset —merge, когда присутствует MERGE_HEAD.

После неудачного слияния, когда нет MERGE_HEAD , неудачное слияние можно отменить с помощью git reset --merge , но не обязательно с помощью git merge --abort . Это не только старый и новый синтаксис для одного и того же .

Лично я нахожу git reset --merge очень более мощный для сценариев, аналогичных описанному, и в целом неудачных слияний.

2


Для git> = 1.6. 1:

  git merge --abort  

Для более старых версий git это подойдет:

  git reset --merge  

или

  git reset --hard код> 


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

  git reset --hard HEADgit pull --strategy = theirs remote_branchgit fetch origingit reset --hard origin  

Удалите

.gitindex.lock

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

  git  reset --hard HEADgit reset --hard origin  

Надеюсь, что это поможет !!!


Альтернативный вариант, который сохраняет состояние рабочей копии:

  git stashgit merge --abortgit stash pop  

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

4


Начиная с Git 1.6.1.3 git checkout может оформлять заказ с любой стороны слияния:

  git checkout --theirs _widget.html.erb  


Вы можете прервать этап слияния:

  git merge --abort   

иначе вы можете сохранить свои изменения (в какой ветке вы находитесь)

  git checkout --ours file1 file2 ...   

в противном случае вы можете сохранить другие изменения ветки

  git checkout --theirs file1 file2 ...  


Я обнаружил, что у меня сработало следующее (вернуть отдельный файл в состояние до слияния):

  git reset * curr  entBranchIntoWhichYouMerged * - * fileToBeReset *  



Прервать слияние Git

Я работаю над проектом, использующим Git в качестве VCS. У меня есть ветка xyz , вырезанная из основной ветки мастера. Поработав какое-то время, я зафиксировал свой код и потянул ветку mainline.

Вытяжка прошла нормально. Затем я объединил код с мастером. После слияния в некоторых файлах возникли проблемы. Я не фиксировал код после слияния. Может ли кто-нибудь рассказать, как я могу прервать это слияние и привести мою ветку, в которой я работаю в настоящее время, в состояние, в котором она была до того, как я ее слил?


, если вы не зафиксировал, вы можете ввести

  git merge --abort  

, как было предложено в командной строке.


Если вы выполняете «git status» при конфликте слияния, первое, что git показывает вам, это как отменить слияние.

1


По правде говоря, существует очень много ресурсов, объясняющих, как это сделать, уже в Интернете:

Git: как выполнить обратное слияние фиксации?

Git: как выполнить обратное слияние фиксации?

Отмена слияния, из блога Git (получено с Wayback Machine на archive.org)

Думаю, я просто резюмирую некоторые из них:

  1. git revert
    Это создает дополнительную фиксацию «отката», в которой говорится, что вы отменили слияние

  2. git reset --hard
    Это сброс истории до того, как вы выполнили слияние. Если у вас есть коммиты после слияния, вам нужно будет выбрать их потом.

Но, честно говоря, это руководство здесь лучше всего, что я могу объяснить, с диаграммами! 🙂

2

Оцените статью
clickpad.ru
Добавить комментарий