Я нахожусь в середине перебазирования после 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.
Также обратите внимание, что я смогу выбрать стратегию слияния для каждого файла только тогда, когда увижу, какие файлы попадают в конфликты и, возможно, конфликты.
git
git-rebase
git-merge-conflict
Стивен Векслер
источник
источник
Ответы:
Для каждого конфликтующего файла вы можете указать
Из
git checkout
документовисточник
git rebase -s recursive -X <ours/theirs>
илиgit merge -s recursive -X <ours/theirs>
. Имейте в виду, что для ребазинга «наши» и «их» полностью противоположны тому, что они есть во время слияния. Возможно, вы могли бы просто использовать глобус файла / оболочки, напримерgit checkout --theirs -- *.txt
.ours/theirs
с rebase сводило меня с ума !! (Теперь имеет смысл подумать о том, как на самом деле работает ребаз, но совсем не интуитивно.)git checkout --outs -- "**/*.csproj"
будет делать то, что вы имеете в виду. То же самое верно, например, дляgit lfs track "*.jpg"
. Если у вас есть несколько jpg-файлов в вашем CWD без кавычек, отслеживаются только они.Несмотря на то, что на этот вопрос дан ответ, приведем пример того, что означает «их» и «наш» в случае git rebase vs merge. Смотрите эту ссылку
Git Rebase
theirs
- это текущая ветка в случае rebase . Таким образом, приведенный ниже набор команд фактически принимает ваши текущие изменения ветки через удаленную ветку.Git Merge
Для слияния , смысл
theirs
иours
обратный. Таким образом, чтобы получить тот же эффект во время слияния , т. Е. Сохранить текущие изменения ветви (ours
) над удаленной ветвью слияния (theirs
).источник
Обратите внимание , что
git checkout --ours|--theirs
будет перезаписывать файлы целиком , выбирая либоtheirs
илиours
вариант, который может быть или не может быть то , что вы хотите сделать (если у вас есть какие - либо не-конфликтующие изменения , приходящие с другой стороны, они будут потеряны).Если вместо этого вы хотите выполнить трехстороннее объединение файла и разрешить только конфликтующие блоки, используя
--ours|--theirs
, оставив при этом бесконфликтные блоки с обеих сторон, вы можете прибегнуть к помощиgit merge-file
; подробности смотрите в этом ответе .источник
example.txt
вours
версии есть два измененных фрагмента (части) , один конфликтует (также изменен вtheirs
редакции), другой не конфликтует. Если вы это сделаетеgit checkout --theirs example.txt
, он будет просто вслепую читать весь файл приtheirs
ревизии, и несогласованная часть различий будет потеряна.git checkout --merge <path>
.