Как заставить слияние добиться успеха, когда есть конфликты?

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

# Step 1: From your project repository, check out a new branch and test the changes.
git checkout -b droark-master master
git pull https://github.com/droark/cryptopp.git master

# Step 2: Merge the changes and update on GitHub.
git checkout master
git merge --no-ff droark-master
git push origin master

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

Как мне сделать Git выполнить слияние, убедитесь, что человек, предоставивший запрос на pull, получает к нему кредит, и прекратите разбивать файлы индекса?


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

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


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

$ git pull https://github.com/droark/cryptopp.git master
From https://github.com/droark/cryptopp
 * branch            master     -> FETCH_HEAD
Auto-merging validate.h
Auto-merging validat2.cpp
Auto-merging validat1.cpp
Auto-merging test.cpp
CONFLICT (content): Merge conflict in test.cpp
Auto-merging pubkey.h
Automatic merge failed; fix conflicts and then commit the result.

Ответ 1

Невозможно слиться без разрешения конфликтов. В противном случае, как git знать, что слить? Однако вы можете проверить версию из любой ветки, которую вы объединяете, используя git checkout --ours <filepath> или git checkout --theirs <filepath>. Вот пример:

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

git checkout master
git merge staging

И git показывает кучу конфликтов:

...
CONFLICT: Readme.md
...

Если вы хотите сохранить версию Readme.md на главном, тогда вы будете запускать:

git checkout --ours Readme.md

Обратите внимание, что поскольку вы находитесь на главном --ours, ссылается на ветвь "this", то есть на главную.

Теперь вы можете просто добавить его в индекс, чтобы пометить его как разрешенный:

git add Readme.md

Это фактически игнорирует любые изменения Readme.md на ветке staging.

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

git commit -m "whatever..."

Ответ 2

Невозможно разрешить конфликты, как работает контроль версий (если Алиса говорит "a", а Боб говорит "b", как Git знать, какая из них правильная, если вы не скажете об этом?). Все, что вы можете сделать, это прямой git, чтобы разрешить их самостоятельно при слиянии в одном из нескольких возможных способов, например

git merge -s recursive -X theirs <branch>

(-s recursive по умолчанию используется только один <branch>, поэтому вы можете опустить его здесь)

Теперь, когда у вас уже есть конфликт в вашем дереве, вы либо

  • выполните маршрут вручную.
    • отредактируйте файл по своему желанию.
    • git add it (add в Git удваивается как разметка файла)
    • git commit завершить слияние; или
  • восстановить состояние предварительного слияния с помощью git merge --abort и повторить слияние с вышеупомянутыми параметрами автоматического разрешения

Ответ 3

Разрешение конфликта - это как дело с любой другой незавершенной работой. Все изменения должны быть поставлены (git add), а затем зафиксированы. Файлы, которые успешно сгенерированы автоматически, уже поставлены. Конфликтные файлы не являются.

Отредактируйте конфликтующие файлы к вашему удовлетворению, скомпонуйте их (git add), и когда все будет сделано, git commit.

В вашем случае специально...

  • Изменить test.cpp, чтобы исправить конфликты (у них есть метки <<<<)
  • git add test.cpp
  • Запустите тесты, чтобы убедиться, что все в порядке.
  • git commit

Ответ 4

Нажать развитие в мастер

git push --force origin branchA:branchB

Это приведет к слиянию, а затем нажмите