Как автоматически разрешить конфликт Git, взяв версию в текущей ветке?
Предположим, что я получаю конфликт слияния на foo/bar.txt
при выполнении этого:
$ git checkout A
$ git merge B
Я хотел бы автоматически разрешить конфликт, взяв foo/bar.txt
из ветки A. (Я знаю, что делаю, и мне это нужно. Версия в ветке B неверна, и мне все равно о потере изменений в рабочем дереве в этом случае.) Кажется, что я могу сделать это, выполнив следующие команды:
$ git reset foo/bar.txt
$ git checkout foo/bar.txt
Есть ли более простое решение с одной командой?
К сожалению, эти команды меняют foo/bar.txt
, даже если конфликт отсутствует, и я не хочу этого. Если нет конфликта, я хочу сохранить foo/bar.txt
в любом состоянии git merge B
.
Итак, мне нужна команда оболочки Unix, которая обнаруживает, есть ли конфликт в foo/bar.txt
, и если есть, он разрешит конфликт, взяв версию foo/bar.txt
из текущей ветки. Он не будет делать ничего другого, то есть не будет изменять другие файлы, он не будет фиксировать изменения, и он не изменит foo/bar.txt
, если в этом файле нет конфликта.
Ответы
Ответ 1
Если вы хотите сделать это как одноразовое, однолинейная команда:
$ git checkout --ours foo/bar.txt # <-- resets it only if the merge found conflicts in this file
$ git checkout HEAD -- foo/bar.txt # <-- resets it to that specific version no matter what
Чтобы настроить git merge, чтобы навсегда игнорировать все восходящие изменения в локально измененном файле:
$ git config merge.pin.driver true
$ echo foo/bar.txt merge=pin >> .git/info/attributes
(true
выше - это просто команда unix true
, ее успех говорит о том, что локальная версия выглядела правильно, в этом случае ничего не делая для этого. Конечно, вы можете быть более сложными с вашими командами слияния.)
Я думаю, что вы не хотите merge --strategy=ours
или --strategy-option=ours
, это относится ко всем слияниям.
Ответ 2
Вы можете указать стратегию слияния ours
в стратегию слияния recursive
(по умолчанию). Он будет выполнять нормальное слияние, но в случае возникновения конфликтов ханки выберет версию текущей ветки.
git checkout A
git merge -Xours B