Выберите стратегию слияния 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.
кроме того, обратите внимание, что я смогу выбрать стратегию слияния для каждого файла, когда увижу, какие файлы попадают в конфликты возможно, что это за конфликты.
3 ответов:
для каждого конфликтного файла, который вы получаете, вы можете указать
git checkout --ours -- <paths> # or git checkout --theirs -- <paths>
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-bGit 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