Чтобы выборочно объединить файлы из одной ветви в другую, запустите
git merge --no-ff --no-commit branchX
где branchX
- ветвь, из которой вы хотите объединиться в текущую ветвь.
Опция --no-commit
будет размещать файлы, которые были объединены Git, без их фиксации. Это даст вам возможность модифицировать объединенные файлы так, как вы хотите, а затем зафиксировать их самостоятельно.
В зависимости от того, как вы хотите объединить файлы, существует четыре случая:
1) Вы хотите истинное слияние.
В этом случае вы принимаете объединенные файлы так, как Git автоматически объединяет их, а затем фиксируете их.
2) Некоторые файлы вы не хотите объединять.
Например, вы хотите сохранить версию в текущей ветви и игнорировать версию в ветви, из которой вы объединяете.
Чтобы выбрать версию в текущей ветке, выполните:
git checkout HEAD file1
Эта команда извлечет версию file1
в текущей ветке и перезапишет file1
, автоматически добавленную Git.
3) Если вы хотите версию в BranchX (а не истинное слияние).
Пробег:
git checkout branchX file1
Это позволит получить версию file1
в branchX
и перезаписать file1
, автоматически объединенную с Git.
4) Последний случай, если вы хотите выбрать только определенные слияния в file1
.
В этом случае вы можете отредактировать измененный file1
напрямую, обновить его до того, каким вы хотите, чтобы версия file1
стала, а затем зафиксировать.
Если Git не может объединить файл автоматически, он сообщит о файле как « unmerged » и создаст копию, в которой вам нужно будет разрешить конфликты вручную.
Для дальнейшего объяснения на примере, скажем, вы хотите объединить branchX
с текущей веткой:
git merge --no-ff --no-commit branchX
Затем вы запускаете команду git status
для просмотра состояния измененных файлов.
Например:
git status
# On branch master
# Changes to be committed:
#
# modified: file1
# modified: file2
# modified: file3
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified: file4
#
Где file1
, file2
и file3
- файлы, которые git успешно объединил автоматически.
Это означает, что изменения master
и branchX
для всех этих трех файлов были объединены без каких-либо конфликтов.
Вы можете проверить, как было выполнено слияние, запустив git diff --cached
;
git diff --cached file1
git diff --cached file2
git diff --cached file3
Если вы обнаружите, что слияние нежелательно, вы можете
- редактировать файл напрямую
- сохранение
git commit
Если вы не хотите объединять file1
и хотите сохранить версию в текущей ветке
Run
git checkout HEAD file1
Если вы не хотите объединять file2
и хотите только версию в branchX
Run
git checkout branchX file2
Если вы хотите автоматически объединить file3
, ничего не делайте.
Git уже слил его на этом этапе.
file4
выше - неудачное слияние Git. Это означает, что изменения в обеих ветвях происходят в одной строке. Здесь вам нужно будет разрешить конфликты вручную. Вы можете отказаться от слияния, сделанного, отредактировав файл напрямую или выполнив команду извлечения для версии в ветви, которой вы хотите, чтобы file4
стал.
Наконец, не забудьте git commit
.