Как разрешить конфликты слияния в репозитории Git?

Я хочу разрешить конфликты слияния в моем репозитории Git.

Как это сделать ?

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

mwilliams 02.10.2008 15:40

Вы можете настроить инструмент слияния (kdiff3 jebaird.com/2013/07/08/…), а затем использовать git mergetool. Когда вы работаете в больших командах разработчиков, вы всегда будете сталкиваться с конфликтами слияния.

Grady G Cooper 18.04.2015 08:37

Не забывайте, что вы можете смягчить большинство конфликтов слияния, регулярно выполняя последующие слияния!

Ant P 27.07.2015 12:50

Также см. git-tower.com/learn/git/ebook/command-line/tools-services/…

Pacerier 20.10.2015 14:19

Кажется, это подробный учебник - githubtraining.com/fix-merge-conflict-git-using-sourcetree

Rajavanya Subramaniyan 27.12.2015 11:29

Это не относится к данному вопросу, но я должен был где-то сказать, что термин «конфликт» в общем языке для систем контроля версий (VCS) был выбран очень неудачно. То, что мы называем конфликтом в VCS, полностью отличается от того, что мы обычно воспринимаем как конфликт в реальной жизни. Скажем, мы попали в автомобильную аварию. Один водитель говорит: «Ой, я тебя не видел». Другой говорит: «Хорошо, мы можем это исправить». Это вовсе не конфликт. Конфликт может возникнуть после. В VCS все наоборот: простое столкновение называется конфликтом, а модификация, которая сознательно отменяет известную модификацию, даже не может быть конфликтом.

user2066805 23.04.2016 23:51

Реакция на мой предыдущий комментарий могла бы быть такой: «Мы знаем, что когда есть конфликт git, реального конфликта нет», но это еще не все. Когда программисты работают в команде, мнения расходятся. Может случиться так, что программист сознательно отменит то, что сделал другой, и это будет ближе к реальному конфликту, но конфликты git не имеют ничего общего с этим процессом. В любом случае, я думаю, что термин «столкновение» или «авария» вместо «конфликт» был бы ближе к тому, чем он является на самом деле, потому что это происходит, когда обе стороны не видят приближения другой стороны.

user2066805 24.04.2016 21:55

как вы спросите git, какие файлы нужно объединить?

Charlie Parker 16.07.2016 06:57

@CharlieParker git status довольно четко покажет вам, какие файлы находятся в конфликте и должны быть объединены вручную.

Spoike 18.07.2016 11:59

Нишевый связанный с этим вопрос о разрешении конфликта в одном файле из командной строки с использованием трехстороннего слияния с заданной стратегией: stackoverflow.com/q/39126509/245966

jakub.g 25.08.2016 11:48

Захватывающий вопрос: заданный в 2008 году, 100% открытый, без каких-либо намеков на то, о чем он на самом деле (речь идет о графическом интерфейсе? О командах git? О семантике? О выталкивании / вытягивании или просто общих конфликтах?) - совершенно невозможно ответить. 30 ответов, все они (если судить по беглому взгляду) более или менее касаются различных инструментов diff3 и слияния, ни один из них не был принят. В ответе, получившем наибольшее количество голосов, упоминается команда, которая даже не работает из коробки при установке git по умолчанию. Мне удалось попасть на стартовую страницу SE сегодня, в 2017 году, с 1,3 млн просмотров и тысячами голосов в обе стороны. Очаровательный.

AnoE 11.07.2017 19:48

На Github.com есть хороший способ визуализировать проблему. Убедитесь, что вы видите ответ это. (У него также есть способы редактировать и разрешать прямо с сайта, но это просто удобство.)

Honey 19.09.2017 18:02

Выберите правильный ответ на этот вопрос, чтобы он оказался наверху. Я говорю это только потому, что сейчас есть несколько страниц с ответами.

Blake Frederick 16.11.2017 20:34
gist.github.com/karenyyng/f19ff75c60f18b4b8149. This git mergetool tutorial might help.
Ynjxsjmh 11.04.2020 10:08

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

Andrea 15.12.2020 23:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4 974
15
2 911 893
38
Перейти к ответу Данный вопрос помечен как решенный

Ответы 38

  1. Определите, какие файлы конфликтуют (Git должен сообщить вам об этом).

  2. Откройте каждый файл и изучите различия; Git их разграничивает. Надеюсь, будет очевидно, какую версию каждого блока оставить. Возможно, вам придется обсудить это с другими разработчиками, которые передали код.

  3. После того, как вы разрешили конфликт в файле git add the_file.

  4. После того, как вы разрешили конфликты все, выполните git rebase --continue или любую другую команду Git сказал сделать, когда вы закончите.

@Justin Думайте о Git как о отслеживании содержание, а не как о файлах. Тогда легко увидеть, что контент, который вы обновили не в репозитории, необходимо добавить. Такой образ мышления также объясняет, почему Git не отслеживает пустые папки: хотя они технически являются файлами, нет никакого контента для отслеживания.

Gareth 12.10.2010 13:17

контент есть, конфликт возникает из-за того, что существует 2 версии контента. Поэтому "git add" звучит неправильно. И это не сработает (git add, git commit), если вы хотите зафиксировать только этот файл после разрешения конфликта («фатальный: невозможно выполнить частичную фиксацию во время слияния»).

Dainius 14.09.2011 13:19

Да, технически это отвечает на заданный вопрос, но, на мой взгляд, извините. Что точка делает одну ветку такой же, как другую? Конечно, при слиянии будут конфликты.

Thufir 09.08.2012 09:56

Тулфир: кто сказал что-нибудь о том, чтобы сделать одну ветку такой же, как другую? Существуют разные сценарии, в которых вам нужно выполнить слияние, не «делая одну ветку такой же, как другую». Первый - когда вы закончили с веткой разработки и хотите включить ее изменения в главную ветку; после этого ветку разработки можно удалить. Другой - когда вы хотите переустановить свою ветку разработки, чтобы облегчить возможное окончательное слияние с мастером.

Teemu Leisti 21.09.2012 12:50

@JustinGrant git add помещает файлы в индекс; он нет добавляет что-нибудь в репозиторий. git commit добавляет вещи в репозиторий. Такое использование имеет смысл для слияний - слияние автоматически включает все изменения, которые могут быть слиты автоматически; вы обязаны объединить остальные изменения и добавить их в индекс, когда вы закончите.

Mark E. Haase 17.10.2012 19:13

как вы спросите git, какие файлы нужно объединить?

Charlie Parker 16.07.2016 06:57

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

Brian Knoblauch 02.08.2016 20:08

Если вы делаете частые небольшие коммиты, начните с просмотра комментариев к коммитам с git log --merge. Тогда git diff покажет вам конфликты.

Для конфликтов, включающих более нескольких строк, легче увидеть, что происходит, во внешнем инструменте с графическим интерфейсом пользователя. Мне нравится opendiff - Git также поддерживает vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff, выход из коробки, и вы можете установить другие: git config merge.tool "your.tool" установит выбранный вами инструмент, а затем git mergetool после неудачного слияния покажет вам различия в контекст.

Каждый раз, когда вы редактируете файл для разрешения конфликта, git add filename будет обновлять индекс, и ваш diff больше не будет его отображать. Когда все конфликты обработаны и их файлы будут обработаны git add, git commit завершит ваше слияние.

Настоящая уловка здесь заключается в использовании "git add". Возможно, вы даже не захотите совершать коммит (возможно, вы хотите спрятать), но вам нужно выполнить «git add», чтобы завершить слияние. Я думаю, что mergetool выполняет добавление за вас (хотя его нет на странице руководства), но если вы выполняете слияние вручную, вам нужно использовать «git add» для его завершения (даже если вы не хотите фиксировать).

Brent Bradburn 25.10.2010 13:37
Ответ принят как подходящий

Попробуйте: git mergetool

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

Согласно комментарию @JoshGlover:

Команда

doesn't necessarily open a GUI unless you install one. Running git mergetool for me resulted in vimdiff being used. You can install one of the following tools to use it instead: meld, opendiff, kdiff3, tkdiff, xxdiff, tortoisemerge, gvimdiff, diffuse, ecmerge, p4merge, araxis, vimdiff, emerge.

Ниже приведен пример процедуры использования vimdiff для разрешения конфликтов слияния. На основе эта ссылка

Шаг 1: Выполните следующие команды в своем терминале

git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false

Это установит vimdiff в качестве инструмента слияния по умолчанию.

Шаг 2: выполните следующую команду в терминале

git mergetool

Шаг 3: вы увидите дисплей vimdiff в следующем формате

  ╔═══════╦══════╦════════╗
  ║       ║      ║        ║
  ║ LOCAL ║ BASE ║ REMOTE ║
  ║       ║      ║        ║
  ╠═══════╩══════╩════════╣
  ║                       ║
  ║        MERGED         ║
  ║                       ║
  ╚═══════════════════════╝

Эти 4 представления являются

LOCAL – this is file from the current branch

BASE – common ancestor, how file looked before both changes

REMOTE – file you are merging into your branch

MERGED – merge result, this is what gets saved in the repo

Вы можете перемещаться между этими представлениями с помощью ctrl + w. Вы можете напрямую перейти к MERGED представлению, используя ctrl + w, за которым следует j.

Подробнее о навигации vimdiff здесь и здесь

Шаг 4. Вы можете отредактировать MERGED вид следующим образом

Если вы хотите получать изменения от REMOTE

:diffg RE  

Если вы хотите получить изменения от BASE

:diffg BA  

Если вы хотите получить изменения от LOCAL

:diffg LO 

Шаг 5. Сохранить, выйти, зафиксировать и очистить

:wqa сохранить и выйти из vi

git commit -m "message"

git clean Удалите лишние файлы (например, * .orig), созданные с помощью инструмента diff.

К вашему сведению, вы можете использовать git mergetool -y, чтобы сэкономить несколько нажатий клавиш, если вы объединяете много файлов одновременно.

davr 18.06.2010 03:32

Ну, это не обязательно открывает графический интерфейс, если вы его не установите. Запуск git mergetool для меня привел к использованию vimdiff. Вместо этого вы можете установить один из следующих инструментов: meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse ecmerge p4merge araxis vimdiff emerge.

Josh Glover 11.05.2011 18:00

Хорошее замечание, Джош. На ubuntu мне больше всего повезло с объединением, его трехстороннее отображение слияния неплохо. В OSX git выбрал хорошее значение по умолчанию.

Peter Burns 24.05.2011 09:08

Это открыло KDiff3. Который я совершенно не понимаю, как использовать.

David Murdoch 10.06.2011 22:46

Вы также можете использовать Beyond Compare 3 сейчас (git mergetool -t bc3).

AzP 30.08.2012 18:59

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

anon58192932 06.03.2013 03:36

Хотя, вероятно, это вина системных администраторов моего университета, я не смог запустить mergetool, потому что bcomp.exe не существует.

2rs2ts 09.04.2013 18:38

@advocate Просто git add исправленные файлы. Это помечает их как решенные.

eikonomega 06.09.2013 21:26

В Windows Winmerge - довольно хороший инструмент для слияния. Пользуюсь уже 5 лет.

RoboAlex 25.09.2013 01:49

Я нахожусь в Windows, и я получил это сообщение при запуске команды git mergetool: Это сообщение отображается, потому что merge.tool не настроен. См. «Git mergetool --tool-help» или «git help config» для получения дополнительных сведений. 'git mergetool' теперь попытается использовать один из следующих инструментов: tortoisemerge emerge vimdiff Известный инструмент слияния недоступен. Я попробую установить Beyond Compare.

Francisco Zarabozo 22.02.2014 21:29

Или вы можете узнать, как использовать vimdiff: rosipov.com/blog/use-vimdiff-as-git-mergetool. На самом деле это намного проще, чем кажется.

Ruslan Osipov 30.05.2014 23:15

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

geneorama 29.03.2016 20:27

Используя приложение FileMerge на Mac, я понял, что если вы выбираете элемент diff'd, вы можете использовать клавиши со стрелками влево / вправо, чтобы выбрать, какой из двух использовать

Gene Bo 16.05.2016 21:59

Следует ли мне использовать объединить для разрешения конфликтов?

hellboy 14.11.2016 12:12

Я настоятельно рекомендую использовать инструмент «слияние». Это кроссплатформенный инструмент сравнения, который упрощает слияние, чем использование vim. Если вы пользователь Vim, то есть плагин fugitive.vim vimcasts.org/episodes/….

icc97 27.06.2017 07:45

Это потрясающе, большое спасибо. Я даже не подозревал, что это было установлено. Для меня meld открывается по умолчанию, что идентично диспетчеру конфигурации PyCharm, который я использовал.

Anonymous 06.02.2018 23:51

На windows с VsCode?

Legends 10.06.2018 14:13

Для шага 4, если вы хотите принять все изменения вместо текущего буфера из удаленного / локального / базового, вы можете вместо этого использовать %diffg (% - это спецификация диапазона, vimdoc.sourceforge.net/htmldoc/cmdline.html#[диапазон]), например :%diffg BA или :%diffg LO или :%diffg RE

Balraj Bains 02.08.2018 09:58

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

Ashish 14.05.2019 23:15

E93: More than one match for RE Думаю, я просто сначала установлю Beyond Compare 3, а затем попробую еще раз.

Someone Somewhere 12.07.2019 01:14

«Это сделает vimdiff инструментом слияния по умолчанию». Git игнорирует мой выбор инструмента и просто использует тот, который по умолчанию запрашивает: «Использовать (c) созданный или (d) выбранный файл, или (a) bort?»

Unknow0059 10.01.2021 20:25

Ознакомьтесь с ответами на вопрос о переполнении стека Прерывание слияния в Git, особенно Ответ Чарльза Бейли, который показывает, как просматривать различные версии файла с проблемами, например,

# Common base version of the file.
git show :1:some_file.cpp

# 'Ours' version of the file.
git show :2:some_file.cpp

# 'Theirs' version of the file.
git show :3:some_file.cpp

Также проверьте параметр «-m» для «git checkout -m» - он позволяет извлекать различные мухи обратно в рабочее пространство.

qneill 06.02.2015 01:06

Это меня спасло. Просмотр каждого файла по отдельности позволил мне вспомнить, что я собирался делать в каждой ветке. Тогда я мог принять решение о выборе.

Rohmer 15.05.2016 00:59

Вот вероятный вариант использования сверху:

Вы собираетесь внести некоторые изменения, но, к сожалению, вы не в курсе:

git fetch origin
git pull origin master

From ssh://[email protected]:22/projectname
 * branch            master     -> FETCH_HEAD
Updating a030c3a..ee25213
error: Entry 'filename.c' not uptodate. Cannot merge.

Итак, вы обновляетесь и пытаетесь снова, но у вас конфликт:

git add filename.c
git commit -m "made some wild and crazy changes"
git pull origin master

From ssh://[email protected]:22/projectname
 * branch            master     -> FETCH_HEAD
Auto-merging filename.c
CONFLICT (content): Merge conflict in filename.c
Automatic merge failed; fix conflicts and then commit the result.

Итак, вы решили взглянуть на изменения:

git mergetool

Ой, боже мой, апстрим кое-что изменил, но просто чтобы использовать мои изменения ... нет ... их изменения ...

git checkout --ours filename.c
git checkout --theirs filename.c
git add filename.c
git commit -m "using theirs"

А потом мы попробуем в последний раз

git pull origin master

From ssh://[email protected]:22/projectname
 * branch            master     -> FETCH_HEAD
Already up-to-date.

Та-да!

Это было очень полезно, потому что у меня было много ошибок слияния с двоичными файлами (художественными активами), и их слияние, кажется, всегда терпит неудачу, поэтому мне нужно всегда перезаписывать его новым файлом, а не «объединять»

petrocket 08.06.2011 21:39

Это действительно было то, что я искал! Почему, ну почему, "git checkout - filename.c" здесь тоже не работает ... Думаю, это было бы слишком последовательно.

Zds 27.03.2012 12:23

Осторожный! Смысл слов - наши и - их противоположен. --ours == пульт. --theirs == местные. См. git merge --help

mmell 05.03.2013 02:56

Если вам нужно сделать это со многими файлами: git checkout --theirs * .java

Jorge Nunez Newton 13.03.2013 22:37

Спасибо большое. Мне нужно подтвердить, что: --theirs == server, remote. --ours == местный

Thanh 08.05.2013 07:51

В моем случае я подтверждаю, что --theirs = удаленный репозиторий, --ours = мой собственный локальный репозиторий. Это противоположно комментариям @mmell.

Aryo 22.06.2013 16:59

Если вы используете git stash pop и столкнетесь с конфликтом, --ours будет HEAD, а --theirs будет сохраненными изменениями.

Matt Briançon 17.10.2013 01:37

@mmell Только на ребазе, видимо. См. this question

Navin 10.11.2013 10:19

мы должны сделать 'git commit -m "using theirs"? В прошлый раз я только «добавил» разрешенный файл, и этого было достаточно, чтобы продолжить операцию слияния.

Yura 08.04.2014 17:45
Ребята, "наши" и "их" зависит от того, объединяетесь вы или нет. If you're слияние, then "ours" means the branch you're merging into, and "theirs" is the branch you're merging in. When you're перебазирование, then "ours" means the commits you're rebasing onto, while "theirs" refers to the commits that you want to rebase.
user456814 26.05.2014 08:27

Если вместо жесткого выполнения git checkout --ours file.txt вы хотите выполнить автоматическое трехстороннее слияние для этого файла с использованием стратегии --ours, вы можете использовать git merge-file для этого, см. stackoverflow.com/q/39126509/245966

jakub.g 25.08.2016 11:52

Зачем нужно брать до того, как тянуть? Разве он не всегда загружается, когда вы тянете автоматически?

TankorSmash 25.08.2016 23:25

@ Script47 Ваша правка изменила приемлемая идиома и ничего больше. Если бы я просматривал его, я бы отклонил ваше изменение.

Michael 11.06.2019 18:23

@Michael Я не знал, это выглядело как орфографическая ошибка.

Script47 11.06.2019 19:39

Я вообще не чувствую себя ta da, это так тяжело. А также страшно

Aadam 02.04.2020 15:52

Я считаю, что инструменты слияния редко помогают мне разобраться в конфликте или разрешении. Обычно я более успешно смотрю на маркеры конфликтов в текстовом редакторе и использую git log в качестве дополнения.

Вот несколько советов:

Совет первый

Лучшее, что я нашел, - это использовать стиль конфликта слияния "diff3":

git config merge.conflictstyle diff3

Это создает такие маркеры конфликта:

<<<<<<<
Changes made on the branch that is being merged into. In most cases,
this is the branch that I have currently checked out (i.e. HEAD).
|||||||
The common ancestor version.
=======
Changes made on the branch that is being merged in. This is often a 
feature/topic branch.
>>>>>>>

Средняя часть - это то, как выглядел общий предок. Это полезно, потому что вы можете сравнить его с верхней и нижней версиями, чтобы лучше понять, что было изменено в каждой ветке, что дает вам лучшее представление о цели каждого изменения.

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

Если конфликт будет более продолжительным, я вырежу и вставлю каждый из трех разделов в три отдельных файла, таких как «мой», «общий» и «их».

Затем я могу запустить следующие команды, чтобы увидеть два блока различий, вызвавших конфликт:

diff common mine
diff common theirs

Это не то же самое, что использовать инструмент слияния, поскольку инструмент слияния также будет включать все неконфликтующие блоки различий. Я считаю, что это отвлекает.

Совет второй

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

git log --merge -p <name of file>

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

Совет третий

Проверяйте свои изменения с помощью автоматических инструментов.

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

Совет четвертый

Планируйте заранее; общаться с коллегами.

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

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

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

Если вы не можете работать последовательно (возможно, из-за нехватки времени), то сообщение об ожидаемых конфликтах слияния, по крайней мере, поможет вам решить проблемы раньше, пока детали еще свежи в памяти. Например, если ваш коллега выполняет серию разрушительных коммитов в течение недельного периода, вы можете выбрать объединение / перебазирование в этой ветке коллег один или два раза в день в течение этой недели. Таким образом, если вы обнаружите конфликты слияния / перебазирования, вы сможете решить их быстрее, чем если вы подождете несколько недель, чтобы объединить все вместе в один большой кусок.

Совет пятый

Если вы не уверены в слиянии, не форсируйте его.

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

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

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

alxndr 02.05.2014 02:15

После попытки переустановки, которая привела к конфликту слияния: $ git log --merge -p build.xml output: fatal: --merge without MERGE_HEAD?

Ed Randall 17.06.2016 12:15

что, если у меня есть изменения в одном файле из ветки 1 и удаление этого файла из ветки 2. Как я могу решить этот конфликт слияния? Есть ли способ использовать git, где я могу объединить их, сохранив изменения одной ветки?

Honey 21.01.2017 17:48

git config merge.conflictstyle diff3 - спасибо, сэр. Это удивительный, и он избавил меня от попыток найти (и заплатить $$) за хороший графический интерфейс с трехсторонним слиянием. IMO это лучше, потому что он показывает общего предка, а также локальный / удаленный, и показывает последние строки журнала фиксации, которых (AFAIK) не делает графический интерфейс. Коммиты определенно помогают определить, какой код какой ветви принадлежит.

ffxsam 04.04.2017 19:00

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

Dave Abrahams 02.07.2017 06:31

Большой +1 за рекомендацию diff3. Конфликтный стиль по умолчанию делает некоторые конфликты буквально невозможными для разрешения. Для получения дополнительной информации см. stackoverflow.com/questions/27417656/….

Tom Ellis 24.09.2020 14:14

Для пользователей Emacs, которые хотят разрешать конфликты слияния полуручно:

git diff --name-status --diff-filter=U

показывает все файлы, требующие разрешения конфликтов.

Откройте каждый из этих файлов один за другим или все сразу:

emacs $(git diff --name-only --diff-filter=U)

При посещении буфера, требующего редактирования в Emacs, введите

ALT+x vc-resolve-conflicts

Это откроет три буфера (мой, их и выходной буфер). Для навигации нажмите «n» (следующий регион), «p» (регион предварительного видения). Нажмите «a» и «b», чтобы скопировать мою или их регион в выходной буфер соответственно. И / или редактировать выходной буфер напрямую.

Когда закончите: нажмите «q». Emacs спросит вас, хотите ли вы сохранить этот буфер: да. После завершения буфера пометьте его как разрешенное, запустив от терминала:

git add FILENAME

Когда закончите со всеми типами буферов

git commit

чтобы завершить слияние.

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

Я думаю, что главное знать, как происходят изменения в локальных и удаленных репозиториях. Ключ к этому - понимание ветвей отслеживания. Я обнаружил, что считаю ветвь отслеживания «недостающим звеном посередине» между моим локальным, фактическим каталогом файлов и удаленным, определенным как источник.

Я лично привык к двум вещам, которые помогут этого избежать.

Вместо:

git add .
git commit -m"some msg"

У которого есть два недостатка -

a) Добавляются все новые / измененные файлы, которые могут включать некоторые нежелательные изменения. б) Вы не можете предварительно просмотреть список файлов.

Вместо этого я делаю:

git add file,file2,file3...
git commit # Then type the files in the editor and save-quit.

Таким образом, вы более осознанно выбираете, какие файлы нужно добавить, а также можете просмотреть список и немного подумать, используя редактор для сообщения. Я считаю, что это также улучшает мои сообщения о фиксации, когда я использую полноэкранный редактор вместо опции -m.

[Обновление - по прошествии времени я переключился на:

git status # Make sure I know whats going on
git add .
git commit # Then use the editor

]

Также (и это более актуально для вашей ситуации) я стараюсь избегать:

git pull

или же

git pull origin master.

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

Вместо этого я пытаюсь сделать

git checkout master
git fetch   
git rebase --hard origin/master # or whatever branch I want.

Вы также можете найти это полезным:

git branch, fork, fetch, merge, rebase и clone, в чем различия?

Эй, я вроде понял твой ответ. Но поскольку я новичок в конфликтах слияния github, я думаю, что чего-то не хватает. Что происходит с вашими локальными модификациями, когда вы делаете git checkout master, git fetch и git rebase --hard origin/master

Suhaib 08.08.2017 20:43

Я считаю, что вам следует добавить больше подробностей о том, что делать. Другой пример, который меня сбивает с толку, вы упомянули в своем ответе: мы делаем git add ., сохранит ли он наши локальные модификации, чтобы мы могли продолжить работу с git checkout master? или это два разных сценария?

Suhaib 08.08.2017 20:47

@MichaelDurrant $ git rebase --hard origin/master b5a30cc159ba8dd error: unknown option hard 'использование: git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] [<upstream>] [<branch>] или: git rebase [-i] [ параметры] [--exec <cmd>] [--onto <newbase>] --root [<branch>] или: git rebase --continue | --abort | - пропустить | --edit-todo `

likejudo 23.05.2020 23:23

См. Как представлены конфликты или, в Git, документацию git merge, чтобы понять, что такое маркеры конфликта слияния.

Также в разделе Как разрешать конфликты объясняется, как разрешить конфликты:

After seeing a conflict, you can do two things:

  • Decide not to merge. The only clean-ups you need are to reset the index file to the HEAD commit to reverse 2. and to clean up working tree changes made by 2. and 3.; git merge --abort can be used for this.

  • Resolve the conflicts. Git will mark the conflicts in the working tree. Edit the files into shape and git add them to the index. Use git commit to seal the deal.

You can work through the conflict with a number of tools:

  • Use a mergetool. git mergetool to launch a graphical mergetool which will work you through the merge.

  • Look at the diffs. git diff will show a three-way diff, highlighting changes from both the HEAD and MERGE_HEAD versions.

  • Look at the diffs from each branch. git log --merge -p <path> will show diffs first for the HEAD version and then the MERGE_HEAD version.

  • Look at the originals. git show :1:filename shows the common ancestor, git show :2:filename shows the HEAD version, and git show :3:filename shows the MERGE_HEAD version.

Вы также можете прочитать о маркерах конфликтов слияния и о том, как их разрешить, в разделе книги Pro GitОсновные конфликты слияния.

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

(Code not in Conflict)
>>>>>>>>>>>
(first alternative for conflict starts here)
Multiple code lines here
===========
(second alternative for conflict starts here)
Multiple code lines here too    
<<<<<<<<<<<
(Code not in conflict here)

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

git commit -a -m "commit message"
git push origin master

Если вы не используете инструмент для слияния, сначала скопируйте свой код за пределы:

- `checkout master`
- `git pull` / get new commit
- `git checkout` to your branch
- `git rebase master`

Это разрешает конфликт, и вы можете скопировать свой код.

Всегда ли помогает эта последовательность? Пожалуйста, объясните, что и как он делает и как этот код отвечает на вопрос.

Oleg Estekhin 10.06.2014 12:32

Если вы хотите выполнить слияние из ветки test в master, вы можете выполнить следующие действия:

Шаг 1: зайти в ветку

git checkout test

Шаг 2:

git pull --rebase origin master

Шаг 3: Если есть какие-то конфликты, перейдите к этим файлам, чтобы изменить их.

Шаг 4: добавить эти изменения

git add #your_changes_files

Шаг 5:

git rebase --continue

ШАГ 6: Если конфликт все еще существует, вернитесь к шагу 3 еще раз. Если конфликта нет, сделайте следующее:

git push origin +test

Шаг 7.: И тогда нет конфликта между тестом и мастером. Вы можете использовать слияние напрямую.

git log --merge -p [[--] path]

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

Чтобы обойти эту проблему, я открываю две командные строки и за один запуск

git log ..$MERGED_IN_BRANCH --pretty=full -p [path]

а в другом

git log $MERGED_IN_BRANCH.. --pretty=full -p [path]

Замена $MERGED_IN_BRANCH веткой, которую я объединил, и [path] конфликтующим файлом. Эта команда будет регистрировать все коммиты в форме патча между (..) двумя коммитами. Если вы оставите одну сторону пустой, как в приведенных выше командах, git автоматически будет использовать HEAD (ветвь, в которую вы в данном случае сливаетесь).

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

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

  • git checkout master (зайдите в главную ветку)
  • git pull (обновите свой мастер, чтобы получить последний код)
  • git checkout -b mybranch (оформить новую ветку a и начать работу над этой веткой, чтобы ваш мастер всегда оставался наверху ствола.)
  • git add. И git commit И git push (в вашей локальной ветке после ваших изменений)
  • git checkout master (вернитесь к своему мастеру.)

Теперь вы можете делать то же самое и поддерживать столько локальных веток, сколько хотите, и работать одновременно, просто выполняя проверку git для вашей ветки, когда это когда-либо необходимо.

Чтобы исправить конфликты слияния в Git, выполните следующие действия:

  1. Проверьте статус Git: git статус

  2. Получите патчсет: git fetch (проверьте правильный патч из вашего коммита Git)

  3. Оформить заказ в локальном филиале (temp1 в моем примере здесь): git checkout -b temp1

  4. Получите последнее содержимое от мастера: git pull --rebase origin master

  5. Запустите mergetool и проверьте конфликты и исправьте их ... и проверьте изменения в удаленной ветке с вашей текущей веткой: git mergetool

  6. Еще раз проверьте статус: git статус

  7. Удалите ненужные файлы, локально созданные с помощью mergetool, обычно mergetool создает дополнительный файл с расширением * .orig. Пожалуйста, удалите этот файл, так как это всего лишь дубликат, исправьте изменения локально и добавьте правильную версию ваших файлов. git add #your_changed_correct_files

  8. Еще раз проверьте статус: git статус

  9. Зафиксируйте изменения с тем же идентификатором фиксации (это позволяет избежать нового отдельного набора патчей): git commit --amend

  10. Отправьте в главную ветку: git push (в ваш репозиторий Git)

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

git CLI

Вот простые шаги, что делать, когда вы попадаете в конфликтное состояние:

  1. Обратите внимание на список конфликтующих файлов: git status (в разделе Unmerged paths).
  2. Разрешите конфликты отдельно для каждого файла одним из следующих способов:

    • Используйте графический интерфейс для разрешения конфликтов: git mergetool (самый простой способ).

    • Чтобы принять удаленную / другую версию, используйте: git checkout --theirs path/file. Это отклонит любые локальные изменения, которые вы сделали для этого файла.

    • Чтобы принять локальную / нашу версию, используйте: git checkout --ours path/file

      However you've to be careful, as remote changes that conflicts were done for some reason.

      Связанный: Каково точное значение «наших» и «их» в git?

    • Отредактируйте конфликтующие файлы вручную и найдите блок кода между <<<<< / >>>>>, затем выберите версию выше или ниже =====. См .: Как представлены конфликты.

    • Конфликты путей и имен файлов могут быть разрешены с помощью git add / git rm.

  3. Наконец, просмотрите файлы, готовые к фиксации, используя: git status.

    Если у вас все еще есть какие-либо файлы в Unmerged paths, и вы разрешили конфликт вручную, сообщите Git, что вы разрешили его с помощью: git add path/file.

  4. Если все конфликты были успешно разрешены, зафиксируйте изменения с помощью: git commit -a и отправьте на удаленное управление как обычно.

См. Также: Разрешение конфликта слияния из командной строки на GitHub

Для практического руководства проверьте: Сценарий 5 - Исправление конфликтов слияния с помощью Katacoda.

DiffMerge

Я успешно использовал DiffMerge, который может визуально сравнивать и объединять файлы в Windows, macOS и Linux / Unix.

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

DiffMerge

Image source: DiffMerge (Linux screenshot)

Просто скачайте его и запустите в репо как:

git mergetool -t diffmerge .

macOS

В macOS вы можете установить через:

brew install caskroom/cask/brew-cask
brew cask install diffmerge

И, вероятно (если не указан), вам понадобится следующая дополнительная простая оболочка, помещенная в ваш PATH (например, /usr/bin):

#!/bin/sh
DIFFMERGE_PATH=/Applications/DiffMerge.app
DIFFMERGE_EXE=${DIFFMERGE_PATH}/Contents/MacOS/DiffMerge
exec ${DIFFMERGE_EXE} --nosplash "$@"

Затем вы можете использовать следующие сочетания клавиш:

  • -Alt-Up / Down для перехода к предыдущим / следующим изменениям.
  • -Alt-Left / Right для принятия изменений слева или справа

В качестве альтернативы вы можете использовать opendiff (часть Xcode Tools), который позволяет объединить два файла или каталога вместе для создания третьего файла или каталога.

Бонус:

Говоря о pull / fetch / merge в приведенных выше ответах, я хотел бы поделиться интересным и продуктивным трюком,

git pull --rebase

Эта команда выше - самая полезная команда в моей жизни с git, которая сэкономила много времени.

Прежде чем отправлять недавно зафиксированное изменение на удаленный сервер, попробуйте git pull --rebase, а не git pull, и ручной merge, и он автоматически синхронизирует последние изменения удаленного сервера (с помощью fetch + merge) и поместит вашу последнюю локальную фиксацию вверху в журнал git. Не нужно беспокоиться о ручном извлечении / слиянии.

В случае конфликта просто используйте

git mergetool
git add conflict_file
git rebase --continue

Подробности на сайте: http://gitolite.com/git-pull--rebase

Просто, если вы хорошо знаете, что изменения в одном из репозиториев не важны, и хотите разрешить все изменения в пользу другого, используйте:

git checkout . --ours

принять изменения в пользу ваш репозиторий, или

git checkout . --theirs

разрешить изменения в пользу другой или основной репозиторий.

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

git mergetool -t p4merge

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

git checkout. - их resolved my problem thanks
Ramesh Chand 10.03.2016 09:53

если вы предпочитаете разрешать конфликты вручную, попробуйте открыть папку в Visual Studio Code, она помечает файлы с конфликтами и окрашивает строки конфликтов внутри каждого из них.

Mohamed Selim 03.07.2016 11:31

Конфликты слияния могут возникать в разных ситуациях:

  • При запуске git fetch, а затем git merge
  • При запуске git fetch, а затем git rebase
  • При запуске git pull (что фактически соответствует одному из вышеупомянутых условий)
  • При запуске git stash pop
  • Когда вы применяете патчи git (коммиты, которые экспортируются в файлы для передачи, например, по электронной почте)

Вам необходимо установить инструмент слияния, совместимый с Git, для разрешения конфликтов. Я лично использую KDiff3, и мне он показался приятным и удобным. Вы можете скачать его версию для Windows здесь:

https://sourceforge.net/projects/kdiff3/files/

Кстати, если вы устанавливаете Git Extensions, в его мастере установки есть опция для установки Kdiff3.

Затем настройте конфигурацию git, чтобы использовать Kdiff в качестве инструмента слияния:

$ git config --global --add merge.tool kdiff3
$ git config --global --add mergetool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
$ git config --global --add mergetool.kdiff3.trustExitCode false

$ git config --global --add diff.guitool kdiff3
$ git config --global --add difftool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
$ git config --global --add difftool.kdiff3.trustExitCode false

(Не забудьте заменить путь фактическим путем к исполняемому файлу Kdiff.)

Затем каждый раз, когда вы сталкиваетесь с конфликтом слияния, вам просто нужно запускать эту команду:

$ git mergetool

Затем он открывает Kdiff3 и сначала пытается автоматически разрешить конфликты слияния. Большинство конфликтов будут разрешены спонтанно, а остальные нужно исправить вручную.

Вот как выглядит Kdiff3:

Enter image description here

Затем, как только вы закончите, сохраните файл, и он перейдет к следующему файлу с конфликтом, и вы сделаете то же самое снова, пока все конфликты не будут разрешены.

Чтобы проверить, все ли успешно слито, просто запустите команду mergetool еще раз, вы должны получить следующий результат:

$ git mergetool
No files need merging

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

Полностью принимаю мою или их версию:

Примите мою версию (местную, нашу):

git checkout --ours -- <filename>
git add <filename>              # Marks conflict as resolved
git commit -m "merged bla bla"  # An "empty" commit

Примите их версию (удаленную, их):

git checkout --theirs -- <filename>
git add <filename>
git commit -m "merged bla bla"

Если вы хотите запустить для всех конфликтных файлов:

git merge --strategy-option ours

или же

git merge --strategy-option theirs

Просмотрите все изменения и примите их индивидуально

  1. git mergetool
  2. Просмотрите изменения и примите любую версию для каждого из них.
  3. git add <filename>
  4. git commit -m "merged bla bla"

По умолчанию mergetool работает в командная строка. Как использовать mergetool из командной строки - это отдельный вопрос.

Вы также можете установить для этого визуальный инструмент, например meld и запустите

git mergetool -t meld

Он откроет локальную версию (нашу), «базовую» или «объединенную» версию (текущий результат слияния) и удаленную версию (их). По завершении сохраните объединенную версию, снова запустите git mergetool -t meld, пока не получите сообщение «Файлы не нужно объединять», затем переходите к шагам 3 и 4.

Эта команда: git checkout --theirs - <filename> изменила ВСЕ файлы на свои, а не только <filename>

Donato 26.06.2018 04:00

На самом деле я ошибался. Это обновляет только указанный файл.

Donato 26.06.2018 04:23

Использование patience

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

Если вы, например, измените отступ своей программы, стратегия слияния Git по умолчанию иногда совпадает с одиночными фигурными скобками {, которые принадлежат разным функциям. Этого можно избежать с помощью patience:

git merge -s recursive -X patience other-branch

Из документации:

With this option, merge-recursive spends a little extra time to avoid 
mismerges that sometimes occur due to unimportant matching lines 
(e.g., braces from distinct functions). Use this when the branches to 
be merged have diverged wildly.

Сравнение с общим предком

Если у вас есть конфликт слияния и вы хотите увидеть, что другие имели в виду, изменяя свою ветку, иногда проще сравнить их ветку напрямую с общим предком (вместо нашей). Для этого вы можете использовать merge-base:

git diff $(git merge-base <our-branch> <their-branch>) <their-branch>

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

git diff $(git merge-base <our-branch> <their-branch>) <their-branch> <file>

В моем случае это плохо решало конфликты слияния, поскольку по какой-то причине в проектах C# сохранялись повторяющиеся строки конфигурации. Хотя это было более дружелюбно, чем ВЕСЬ ФАЙЛ ДРУГОЙ, который у меня был раньше

Mathijs Segers 08.09.2017 10:55

Более безопасный способ разрешения конфликтов - использовать мерзавец (общие решения, предлагаемые здесь, весьма подвержены ошибкам, imho).

См. эта почта для быстрого ознакомления с тем, как его использовать.

С 12 декабря 2016 г. вы можете объединять ветки и разрешать конфликты на github.com

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

Это сообщение в блоге объясняет подробно, но основы таковы, что после «слияния» двух ветвей через пользовательский интерфейс вы увидите опцию «разрешить конфликты», которая приведет вас к редактору, позволяющему справиться с этими конфликтами слияния.

это не вопрос о github, поэтому я проголосовал за то, что считаю очень плохим ответом.

mschuett 25.01.2017 08:06

@mschuett прав, вопрос в том, «как разрешать конфликты в git», а не «как разрешать конфликты в github». Есть разница, и уже слишком много людей думают, что git и github - это одно и то же, поэтому все, что распространяет это чувство, неправильно.

Patrick Mevzek 05.04.2018 19:21

Есть 3 шага:

  1. Найдите файлы, вызывающие конфликты, по команде

    git status
    
  2. Проверьте файлы, в которых вы обнаружите конфликты, помеченные как

    <<<<<<<<head
    blablabla
    
  3. Измените его так, как вы хотите, затем зафиксируйте с помощью команд

    git add solved_conflicts_files
    git commit -m 'merge msg'
    

Сработало у меня! Спасибо!

Nuwan Jayawardene 18.09.2017 07:00

Вы должны обратить внимание, если сделаете это во время перебазирования. Вы должны использовать git rebase - продолжить вместо git commit

Samuel Dauzon 29.10.2018 16:37

git fetch <br>
git checkout **your branch**<br>
git rebase master<br>

На этом шаге вы попытаетесь исправить конфликт, используя предпочитаемую вами IDE.

Вы можете следить за эта ссылка, чтобы проверить, как исправить конфликт в файле

git add<br>
git rebase --continue<br>
git commit --amend<br>
git push origin HEAD:refs/drafts/master  (push like a drafts)<br>

Теперь все в порядке, и вы найдете свой коммит в gerrit
.

Я надеюсь, что это поможет всем, кто имеет отношение к этому вопросу.

Для тех, кто использует Visual Studio (в моем случае 2015)

  1. Закройте свой проект в VS. VS особенно в больших проектах, как правило, нервничает при слиянии с использованием пользовательского интерфейса.

  2. Выполните слияние в командной строке.

    git checkout target_branch

    git merge source_branch

  3. Затем откройте проект в VS и перейдите в Team Explorer -> Branch. Теперь появляется сообщение о том, что слияние ожидает, а конфликтующие файлы перечислены прямо под сообщением.

  4. Щелкните конфликтующий файл, и у вас будет возможность объединить, сравнить, взять источник, взять цель. Инструмент слияния в VS очень прост в использовании.

Я использую VS Code 2017 в очень большом проекте, и мне не нужно закрывать проект. Он неплохо справляется с этим :)

protoEvangelion 10.08.2017 19:22

Если вы используете intelliJ как IDE Попробуйте объединить родителя с вашей веткой с помощью

git checkout <localbranch>
git merge origin/<remotebranch>

Он покажет все подобные конфликты

A_MBPro:test anu$ git merge origin/ Auto-merging src/test/java/com/.../TestClass.java CONFLICT (content): Merge conflict in src/test/java/com/.../TestClass.java

Теперь обратите внимание, что файл TestClass.java отображается красным цветом в intelliJ. Также будет отображаться статус git

Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified:   src/test/java/com/.../TestClass.java

Откройте файл в intelliJ, в нем будут разделы с

  <<<<<<< HEAD
    public void testMethod() {
    }
    =======
    public void testMethod() { ...
    }
    >>>>>>> origin/<remotebranch>

где HEAD - это изменения в вашей локальной ветке, а origin / - это изменения из удаленной ветки. Здесь сохраните то, что вам нужно, и удалите ненужное. После этого следует выполнить обычные действия. То есть

   git add TestClass.java
   git commit -m "commit message"
   git push

git checkout branch1

git fetch origin

git rebase -p origin/mainbranch

Если есть конфликты слияния, исправьте их. Затем продолжите процесс перебазирования, запустив: git rebase –-continue

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

git push origin branch1

Я следую приведенному ниже процессу.

Процесс устранения конфликта слияния:

  1. Сначала извлеките последнюю версию из целевой ветки, с которой вы хотите объединить git pull origin develop.

  2. Поскольку вы получаете последнюю информацию из пункта назначения, теперь разрешите конфликт вручную в IDE, удалив эти лишние символы.

  3. Сделайте git add, чтобы добавить эти отредактированные файлы в очередь git, чтобы они могли быть commit и push в той же ветке, над которой вы работаете.

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

  5. Теперь внесите изменения в вашу рабочую ветку с помощью git push origin HEAD.

Вот и все, и вы увидите, что это разрешено в вашем запросе на перенос, если вы используете Bitbucket или GitHub.

Эти ответы предназначены для добавления альтернативы тем пользователям VIM, как я, которые предпочитают делать все в редакторе.


TL; DR


Tpope придумал замечательный плагин для VIM под названием беглец. После установки вы можете запустить :Gstatus, чтобы проверить файлы, у которых есть конфликты, и :Gdiff, чтобы открыть Git тремя способами слияния.

После трехстороннего слияния беглец позволит вам получить изменения любой из ветвей, которые вы сливаете, следующим образом:

  • :diffget //2, получите изменения из исходной (ГОЛОВА) ветки:
  • :diffget //3, получите изменения из ветки слияния:

Когда вы закончите объединение файла, введите :Gwrite в объединенный буфер. Vimcasts выпустили отличный видео, подробно объясняющий эти шаги.

Попробуйте редактировать Visual Studio Code, если вы еще этого не сделали. Что он делает, так это после попытки слияния (и попадания в конфликт слияния) .VS-код автоматически обнаруживает конфликты слияния.

Он может вам очень помочь, показывая, какие изменения были внесены в исходный, и следует ли вам принимать incoming или

current change (имеется в виду исходный до слияния) '?.

Это помогло мне, и это может сработать и для вас!

PS: Это будет работать, только если вы настроили git с помощью своего кода и кода Visual Studio.

Gitlense для VS Code

Вы можете попробовать Гитленсе для VS Code, их ключевые особенности:

3. Легко разрешайте конфликты.

Мне уже нравится эта функция:

2. Авторство текущей линии.

3. Виноват в желобе

4. Виноват в строке состояния

И есть много функций, которые вы можете проверить на них здесь.

Один из лучших инструментов, который я когда-либо использовал, и я до сих пор использую его во всех своих проектах!

DrumM 06.01.2021 14:05

Я использую Microsoft Visual Code для разрешения конфликтов. Его очень просто использовать. Я оставляю свой проект открытым в рабочей области. Он обнаруживает и выделяет конфликты, кроме того, предоставляет параметры графического интерфейса для выбора любых изменений, которые я хочу сохранить от HEAD или входящих.

Если вы просто хотите восстановить удаленный мастер, тогда

git reset --hard origin/master

ПРЕДУПРЕЖДЕНИЕ: Все локальные изменения будут потеряны, см. https://stackoverflow.com/a/8476004/11769765.

Это НЕ то, что означает разрешение конфликтов слияния!

Pedro Lamarão 29.09.2020 20:51

Но это преодолевает сообщение об ошибке. Новички могут просто отменить свои изменения, чтобы «разрешить конфликты слияния». Предупреждение выделено жирным шрифтом. Опытные пользователи могут возиться с фиксацией, отправкой, извлечением, добавлением, редактированием, объединением, созданием веток.

Friedrich 30.09.2020 11:23

Мне нравится использовать WinMerge (бесплатный инструмент), который выполняет как полное сравнение / слияние всего дерева каталогов, так и сравнение / слияние отдельных файлов (ов) для сравнения полного дерева каталогов.

До сих пор никто не упоминал WinMerge в этом следе, поэтому я упоминаю здесь.

Конфликт слияния Git сообщает вам, что ваш пул реквест отменит / потеряет / перезапишет изменения сотрудника, как правило, из-за того, что ваша копия контента была недостаточно свежей.

Шаги по разрешению могут быть следующими:

  • Возьмите еще один новый клон исходного кода в папку с новым именем,
  • Используйте WinMerge для сравнения вашего контента и самого последнего контента, чтобы понять конфликт,
  • Для файлов, измененных вами и вашим коллегой, которые вызывают конфликт Git Merge, посмотрите на строки, которые ваш коллега добавил / изменил / удалил, по сравнению со строками кода, которые вы добавили / изменено / удалено.
  • Используйте стрелки перемещения раздела кода winmerge влево / вправо, чтобы убедиться, что работа ваших коллег находится в вашей копии файла, и вы не засоряете их работу.

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

Я так думаю.

Примечание: WinMerge создает файлы .bak ... и вы не хотите, чтобы они копировались в систему управления версиями AzOps / TFS и т. д., Поэтому, если вы уверены, что выполнили редактирование правильно, удалите файлы .bak.

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

Однако ответ на ваш вопрос прост и разочаровывает. Конфликты слияния почти всегда решаются вручную вручную. Если вы используете такой инструмент, как, например, GitLab, графический интерфейс может помочь вам найти различия в двух версиях кода, но в конце концов вы должны решить, какую строку следует сохранить, а какую удалить.

Простой пример: программист A и программист B отправляют один и тот же - по-разному измененный - файл в удаленный репозиторий. Программист A открывает запрос на слияние, и GitLab выделяет несколько строк кода, в которых возникают конфликты между двумя версиями. Теперь программисты А и Б должны решить, кто лучше написал код в этих конкретных строках. Им нужно идти на компромиссы.

Я понял, что такое конфликт слияния, но когда я увидел результат git diff, мне сначала это показалось бессмысленным:

git diff
++<<<<<<< HEAD 
 + display full last name boolean in star table 
++=======
+ users viewer.id/star.id, and conversation uses user.id
+ 
++>>>>>>> feat/rspec-tests-for-cancancan

Но мне помог здесь:

  • Все между <<<<<<< и ======= - это то, что было в одном файле и

  • Все между ======= и >>>>>>> - это то, что было в другом файле

  • Таким образом, буквально все, что вам нужно сделать, это удалить эти строки из любой ветки (или просто сделать их одинаковыми), и merge немедленно добьется успеха. Проблема решена!

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

Добавить / зафиксировать / нажать, и все хорошо.

Другие вопросы по теме