Выберите стратегию слияния Git для конкретных файлов ("наши", "Мои", " их")



Я нахожусь в середине перебазирования после git pull --rebase. У меня есть несколько файлов, которые имеют конфликты слияния. Как я могу принять" свои "изменения или" мои " изменения для конкретных файлов?



$ git status
# Not currently on any branch.
# You are currently rebasing.
# (fix conflicts and then run "git rebase --continue")
# (use "git rebase --skip" to skip this patch)
# (use "git rebase --abort" to check out the original branch)
#
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: CorrectlyMergedFile
#
# Unmerged paths:
# (use "git reset HEAD <file>..." to unstage)
# (use "git add <file>..." to mark resolution)
#
# both modified: FileWhereIWantToAcceptTheirChanges
# both modified: FileWhereIWantToAcceptMyChanges


обычно я просто открываю файл или инструмент слияния и вручную принимаю все" свои "или" мои " изменения. Однако я подозреваю, что мне не хватает удобной команды git.



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

679   3  

3 ответов:

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

git checkout --ours -- <paths>
# or
git checkout --theirs -- <paths>

С git checkout docs

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...

--ours
--theirs
При проверке путей из индекса, проверьте Этап #2 (ours) или #3 (theirs) для несвязанных путей.

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

хотя на этот вопрос дан ответ, приводя пример того, что означает "их" и "наш" в случае git rebase vs merge. Смотрите этой ссылке

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

# see current branch
$ git branch
... 
* branch-a
# rebase preferring current branch changes during conflicts
$ git rebase -X theirs branch-b

Git Merge
Для слияние смысл theirs и ours обратная. Итак, чтобы получить тот же эффект во время слияние, т. е. сохранить текущие изменения филиал (ours) по удаленной ветви объединяется (theirs).

# assuming branch-a is our current version
$ git merge -X ours branch-b  # <- ours: branch-a, theirs: branch-b

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

если вместо этого вы хотите выполнить трехстороннее слияние в файле и разрешить только противоречие скряга используя --ours|--theirs, в то время как сохраняя неконфликтные куски С обеих сторон в месте, вы можете прибегнуть к git merge-file; подробности см. В ответ.

Comments

    Ничего не найдено.