Как разрешить конфликты в EGit
Я использую EGit на Eclipse v4.3 (Kepler). Я хочу зафиксировать и подтолкнуть мои изменения. Сначала я выполняю извлечение, и один файл конфликтует. После ручного разрешения конфликта (локальный и удаленный теперь совпадают), я все еще сталкиваюсь с проблемами.
Вот сообщения об ошибках для каждого действия:
Нажмите вверх по течению
master: master [отклонено - не ускоренная перемотка вперед]
Тянуть
Невозможно загрузить хранилище с состоянием: MERGING_RESOLVED
Пометить как слитый
Не удалось добавить ресурс в индекс Не удалось добавить ресурс в индекс Исключение, обнаруженное при выполнении команды добавления
Аппаратный сброс
Внутренняя ошибка произошла во время: "Сброс до refs/heads/master". Исключительная ситуация при выполнении команды сброса. {0}
Как я могу удалить конфликт и подтолкнуть мои изменения? Что я делаю неправильно?
Ответы
Ответ 1
Используете ли вы представление Team Synchronize? Если так, то проблема. Разрешение конфликтов в представлении Team Synchronize не работает с EGit. Вместо этого вам нужно использовать представление Git Repository.
Откройте перспективу Git. В представлении Git Repository перейдите в раздел "Филиалы" → "Локальные" → "Основные" и щелкните правой кнопкой мыши → Объединить
Следует автоматически выбрать Remote Tracking → origin/master
. Нажмите Merge.
Это должно показать result:conflict
.
Откройте конфликтующие файлы. У них должен быть старый sk000l >>>> ===== <<<< конфликт слияния стиля в файлах. Отредактируйте файл, чтобы разрешить конфликт, и сохраните.
Теперь в представлении "Git Staging" он должен показать измененный файл в "Unstaged Changes". Щелкните правой кнопкой мыши и " Добавить в индекс "
![Enter image description here]()
Повторите для всех оставшихся файлов.
Теперь из представления "git staging" сделайте коммит и нажмите. Поскольку Git/Eclipse теперь знает, что вы слили изменения удаленного источника в ваш мастер, вам следует избегать ошибки, не связанной с перемоткой вперед.
Ответ 2
Я также сбиваю с толку разрешение конфликтов слияния в EGit. Когда я готов внести некоторые изменения в общий репозиторий, шаги, которые я узнал, следующие:
- Щелкните правой кнопкой мыши по проекту и выберите команду: Commit....
- Просмотрите мои изменения, чтобы проверить, что я не совершаю никаких изменений. Я сделал случайно или несвязанные изменения, о которых я забыл. Запишите сообщение фиксации во время просмотра изменений.
- Я настроен оптимистично, поэтому начинаю с нажатия кнопки Commit и Push. Если никто другой не внес каких-либо изменений, я закончу. Если у кого-то есть, то фиксация завершается успешно, а нажатие отклоняется.
- Щелкните правой кнопкой мыши по проекту и выберите команду: Pull. Если конфликтов нет, выберите команду "Нажать вверх", и я закончил.
- Если есть конфликты, просмотрите проводник пакетов, чтобы увидеть, какие файлы конфликтуют. Щелкните правой кнопкой мыши по каждому конфликтующему файлу и выберите команду "Команда: инструмент слияния". Он отобразит все изменения в обеих версиях файла, при этом любые конфликты будут показаны красным цветом. Нажмите на кнопку, чтобы объединить все неконфликтные изменения, а затем отредактировать любые красные секции вручную. Также есть кнопка, показывающая трехстороннее слияние, включающее общий предок.
- Сохраните изменения в файле. Если вы хотите, вы можете сравнить его с HEAD, чтобы узнать, какие изменения вы делаете поверх изменений, которые вы только что вытащили.
- Щелкните правой кнопкой мыши файл и выберите команду: Добавить в индекс, чтобы сообщить EGit, что вы закончили слияние этого файла. Для меня это наименее интуитивный шаг, но в командной строке git также используется команда add, чтобы показать, что слияние завершено.
- Повторите для любых других конфликтующих файлов.
- Когда все файлы объединены, щелкните правой кнопкой мыши по проекту и выберите команду: Rebase: Continue Rebase. Если есть более противоречивые коммиты, вернитесь к конфликтам.
- Когда переполнение будет завершено, запустите свои тесты, чтобы убедиться, что rebase ничего не сломал.
- Щелкните правой кнопкой мыши проект и выберите команду "Нажать вверх".
Ответ 3
Это руководство было полезно для меня http://wiki.eclipse.org/EGit/User_Guide#Resolving_a_merge_conflict.
ОБНОВЛЕНО Просто примечание о моей процедуре, вот как я продолжаю:
- Передать Мое изменение
- Fetch (Синхронизировать рабочее пространство)
- Тянуть
- Управление конфликтами с помощью инструмента слияния (Team-> Инструмент слияния) и сохранения
- Добавить каждый файл на сцену (Команда → Добавить в индекс)
- Теперь сообщение коммита в окне рабочей области предварительно заполнено "Объединено XXX". Вы можете оставить как есть или изменить сообщение коммита
- Совершить и нажать
В некоторых случаях это опасно, но очень полезно избегать использования внешних инструментов, таких как Git Extension или Source Tree
Ответ 4
Я знаю, что это более старая статья, но я просто попал с подобной проблемой и смог ее разрешить, поэтому я решил поделиться ею.
( Обновление. Как отмечено в комментариях ниже, этот ответ был до включения функции e2 для "git stash" ).
Что я сделал:
- Скопируйте локальную копию конфликтующего файла, который может или не может иметь никаких изменений в версии на восходящем потоке.
- Внутри Eclipse "Вернуть" файл в версию прямо перед конфликтом.
- Запустите "Pull" из удаленного репозитория, позволяя всем изменениям синхронизироваться с локальным рабочим каталогом. Это должно очистить обновления, поступающие в вашу файловую систему, оставив только то, что вам осталось нажать.
- Проверьте текущую версию конфликтующего файла в рабочем каталоге с копией, которую вы скопировали. Если есть какие-либо различия, выполните правильное слияние файлов и зафиксируйте эту версию файла в рабочем каталоге.
- Теперь "Нажимайте" свои изменения.
Надеюсь, что это поможет.
Ответ 5
Просто щелкните правой кнопкой мыши конфликтующий файл и добавьте его в индекс после разрешения конфликтов.
Ответ 6
Чтобы разрешить конфликты, используйте Git stash, чтобы сохранить ваши незафиксированные изменения; затем разверните набор изменений удаленного репозитория; затем откройте свой локальный тайник, чтобы повторно применить незафиксированные изменения.
В Eclipse v4.5 (Mars) для сохранения изменений (относительно недавнего добавления, не было в предыдущем EGit) я делаю это: щелкните правой кнопкой мыши по проекту Eclipse верхнего уровня, который в Git control, выберите Team, выберите Stashes, выберите Шкатулка Изменений; Откроется диалоговое окно для запроса сообщения коммита тайника.
Вы должны использовать контекстное меню в проекте верхнего уровня! Если я щелкну правой кнопкой мыши по каталогу или файлу в проекте, контролируемом Git, у меня не появится соответствующее контекстное меню.
Ответ 7
Этот подход аналогичен решению "stash", но я думаю, что это может быть более понятно:
- Ваш текущий локальный филиал является "мастером", и у вас есть локальные изменения.
- После синхронизации появляются входящие изменения, и некоторые файлы необходимо объединить.
- Итак, первым шагом является переход на новую локальную ветвь (например, my_changes):
- Команда → Switch To → Новая ветка
- Имя ветки: my_changes (например)
- После переключения на новую ветку все незавершенные локальные изменения все еще существуют. Итак, скопируйте все свои локальные незафиксированные изменения в новую ветку my_changes:
- Вернитесь к локальной ветке "master" :
- Команда → Switch To → master
- Теперь, когда вы выбираете Team → Synchronize Workspace, не ожидается появления файлов слияния.
- Выберите команду → Pull
- Теперь локальная ветвь "master" обновлена относительно удаленной ветки "master" .
- Теперь есть два варианта:
- Вариант 1:
- Выберите команду → Объединить, чтобы объединить исходные локальные изменения с локальной ветвью "my_changes" в локальную ветвь "master" .
- Теперь скопируйте входящие изменения с предыдущего шага в локальную ветвь "master" и нажмите их на удаленную ветвь "master" .
- Вариант 2:
- Переключитесь снова на локальную ветвь my_changes.
- Объединить обновления из локальной ветки "master" в ветку "my_changes".
- Продолжить текущую задачу в ветке my_changes.
- Когда задача выполнена, используйте параметр 1 выше, чтобы обновить как локальную "ведущую" ветвь, так и удаленную.
Ответ 8
Поскольку это проблема, с которой мы сталкиваемся более часто, ниже приведены шаги по ее решению.
-
Откройте перспективу Git. В представлении Git Repository перейдите в раздел "Филиалы" → "Локальные" → "Основные" и щелкните правой кнопкой мыши → Объединить
-
Следует автоматически выбрать Удаленное отслеживание → * origin/master. Нажмите Merge.
-
Запустить сцену в Eclipse.
-
Дважды щелкните файлы, которые изначально показывали конфликт
-
В представлении слияния конфликтов, выбрав стрелку влево для всех изменений без конфликтов + конфликт слева направо, вы можете разрешить все конфликты.
-
Сохраните объединенный файл.
-
Сделать команду → вытащить из Затмения снова.
У вас все настроено :)
Ответ 9
Более ранний процесс разрешения конфликтов (через промежуточное представление) в Eclipse казался намного более интуитивным несколько лет назад, поэтому либо инструмент больше не функционирует так, как я привык, либо я вспоминаю процесс разрешения конфликтов слияния в SVN хранилища. Несмотря на это, при щелчке правой кнопкой мыши по конфликтующему файлу появилась изящная опция меню "Пометить как объединенное".
Перейдя к 2019 году, я использую представление " Git Staging " в Eclipse (v4.11). На самом деле я использую STS (Spring Tool Suite 3.9.8), но я думаю, что представление Git Staging - это стандартный плагин Eclipse для работы с проектами на основе Java/Spring. Я разделяю следующий подход на случай, если он кому-нибудь поможет, и потому что я устаю или разрешаю конфликты слияний из командной строки GIT. ;-)
Поскольку функция, которую я помню, теперь утрачена (или, возможно, сделана по-другому с текущей версией GIT и Eclipse), вот текущие шаги, которые я сейчас следую, чтобы разрешить конфликты слияния через Eclipse с помощью репозитория GIT. Это кажется наиболее интуитивным для меня. Очевидно, из числа полученных ответов ясно, что существует много способов разрешения конфликтов слияния. Возможно, мне просто нужно переключиться на JetBrains IntelliJ с их трехсторонним инструментом слияния.
- Дважды щелкните по файлу-нарушителю.
- Появится интерфейс "Сравнение текста" с параллельными представлениями конфликтующих коммитов.
- Определите, какое представление является локальным состоянием файла или самой последней фиксацией.
- Внесите изменения в локальное окно, добавив или отредактировав изменения из оскорбительного коммита.
- Когда требуемый набор изменений будет рассмотрен и обновлен, щелкните правой кнопкой мыши на файле без метки.
- Нажмите кнопку "Добавить в индекс", и ваш файл будет добавлен в промежуточные изменения.
- Это также удаляет конфликтующий файл из списка без тегов, что указывает на то, что он был "помечен как объединенный".
- Продолжайте этот процесс с каждым дополнительным файлом в конфликте.
- После повторного просмотра всех конфликтующих файлов убедитесь, что все нужные файлы (включая дополнительные изменения) находятся в стадии подготовки.
- Добавьте соответствующее сообщение коммита.
- Зафиксируйте и отправьте "объединенные" файлы в исходный репозиторий, и это официально помечает ваши файлы как объединенные.
ПРИМЕЧАНИЕ. Поскольку пункты меню не являются интуитивно понятными, некоторые вещи могут вводить в заблуждение. Например, если вы сохранили какие-либо обновления локально и попытаетесь повторно открыть конфликтующий файл, чтобы подтвердить, что сделанные вами изменения сохранились, это может привести к путанице, поскольку исходное состояние конфликта открыто... а не ваши изменения.
Но как только вы добавите файл в индекс, вы увидите ваши изменения там.
Я также рекомендую при внесении изменений, которые приводят к конфликту слияний, сначала "прятать" локальные изменения, а затем снова вносить изменения. По крайней мере, с GIT, как защита, вам не разрешат извлекать внешние изменения, пока вы не отмените свои изменения или не сохраните их. Откажитесь и вернитесь в состояние HEAD, если изменения не важны, но сохраните их в противном случае.
Наконец, если у вас изменяется только один или два файла, рассмотрите возможность их перетаскивания в отдельные текстовые файлы в качестве ссылки, затем вернитесь к HEAD и затем вручную обновите файл (-ы) при переносе изменений.
Ответ 10
GIT имеет самый раздражающий способ разрешения конфликтов (в отличие от svn, где вы можете просто сравнить и внести изменения). Я чувствую, что у Git сложный процесс разрешения конфликтов. Если бы я решил, я бы просто взял другой код из GIT как свежий, добавил свои изменения и зафиксировал их. Это просто и не очень ориентировано на процесс.