Не совсем ясно, каков ваш желаемый результат, поэтому существует некоторая путаница в отношении «правильного» способа сделать это в ответах и их комментариях. Я пытаюсь дать обзор и увидеть следующие три варианта:
Попробуйте объединить и использовать B для конфликтов
Это не"их версия для git merge -s ours
", а "их версия для git merge -X ours
" (что сокращенно от git merge -s recursive -X ours
):
git checkout branchA
# also uses -s recursive implicitly
git merge -X theirs branchB
Это то, что, например, Ответ Алана У. Смита Да.
Использовать содержимое только из B
Это создает коммит слияния для обеих ветвей, но отменяет все изменения с branchA
и сохраняет только содержимое с branchB
.
# Get the content you want to keep.
# If you want to keep branchB at the current commit, you can add --detached,
# else it will be advanced to the merge commit in the next step.
git checkout branchB
# Do the merge an keep current (our) content from branchB we just checked out.
git merge -s ours branchA
# Set branchA to current commit and check it out.
git checkout -B branchA
Обратите внимание, что слияние совершает первый родительский элемент теперь с branchB
, и только второй с branchA
. Это то, что, например, Gandalf458 ответ делает.
Используйте содержимое только из B и сохраняйте правильный родительский порядок
Это настоящая "их версия для git merge -s ours
". Он имеет то же содержание, что и в предыдущем варианте (т. Е. Только с branchB
), но порядок родителей правильный, то есть первый родитель с branchA
, а второй с branchB
.
git checkout branchA
# Do a merge commit. The content of this commit does not matter,
# so use a strategy that never fails.
# Note: This advances branchA.
git merge -s ours branchB
# Change working tree and index to desired content.
# --detach ensures branchB will not move when doing the reset in the next step.
git checkout --detach branchB
# Move HEAD to branchA without changing contents of working tree and index.
git reset --soft branchA
# 'attach' HEAD to branchA.
# This ensures branchA will move when doing 'commit --amend'.
git checkout branchA
# Change content of merge commit to current index (i.e. content of branchB).
git commit --amend -C HEAD
Это то, что ответ Пола Пладийса делает (не требуя временной ветки).