Как заставить слияние добиться успеха, когда есть конфликты?
Я пытаюсь объединить запрос на перенос, который имеет один конфликт в одном файле (см. ниже). Инструкции по слиянию запроса на перенос предоставленные 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
Это приведет к слиянию, а затем нажмите