2016-12-03 16 views
1

Я пытаюсь создать бота для переноса репозитория git из одной формы в другую.Git cherry-pick conflict создает файл тильды

В этом процессе я запускаю git cherry-pick $commit_hash -X theirs --no-edit --keep-redundant-commits для изменения вишневого выделения из промежуточной ветви в мою основную ветвь.

Оба HEAD мастера и выбранная вишня команда добавляют один и тот же файл, но с другим контентом. Я хотел бы, чтобы собранная вишня фиксация была перезаписана, следовательно -X theirs.

Однако, я получаю конфликт, git добавляет второй файл с именем path/to/first_file~[commit hash]...[truncated commit message]. Как я могу обойти это?

ответ

0

Попробуйте это:

$ git status       # copy the conflicted <file path> 
$ git checkout --theirs <file-path> # accept theirs changes 
$ git commit -am 'resolved conflicts' # fixed conflicts 
1

Проблема здесь состоит в том, что -X theirs затрагивает только конфликтов слияния в существующий файл. Merge конфликты могут происходить также:

  • добавить/добавить: с обеих сторон (HEAD и тому, чтобы быть востребовано/слиты фиксации) добавляют один и тот же файл.
  • изменить/удалить: одна сторона вносит изменения в файл, а другая сторона полностью удаляет файл.
  • rename/delete: одна сторона переименовывает файл, а другая сторона полностью удаляет файл.

Вы получаете первый из них, но все три причины Git прекращают работу и требуют внешней помощи для решения проблемы.

... с мерзавцем, добавив второй файл называется path/to/first_file~[commit hash]...[truncated commit message]

Git не делает этого, но различные внешние помощник сливаться инструменты делают.

В любом случае вы должны вручную разрешить конфликт (путем выбора файла, который нужно добавить, или смешивания двух файлов по мере необходимости). Чтобы автоматизировать это, вам нужно будет написать некоторый код - по существу, чтобы написать свой собственный инструмент слияния.


Стоит еще раз подчеркнуть, что это влияет только на слияние конфликты. Например, если одна сторона изменяет color на colour, а другая сторона изменяет orange на fruit, но ни одно из этих изменений не «слишком близко» друг к другу, чтобы вызвать конфликт, вы можете завершить работу с файлом, который описывает ваши объекты как фрукты в цвете. (Обычно такие изменения влияют на же линии, так что они вступают в конфликт, так что -X theirs улавливает только изменение одной из сторон.)

+0

«Git не делает этого, но различные внешние помощник сливаться инструменты делают» Какой хелперов бы это быть? Это происходит как на моей частной установке Ubuntu 16.04, так и на Heroku. Я не знаю, какие внешние помощники установлены. Я заметил, что это происходит и с git merge. –

+0

У вас есть ссылка, подробно описывающая внешние помощники?:) –

+0

Я никогда не использую ни один из других инструментов, но я проверял внутри источника Git, чтобы увидеть, используют ли какие-либо из его собственных распределенных инструментов эти имена файлов (а они нет). По умолчанию Git останавливается с конфликтом слияния, и вы запускаете 'git mergetool' для запуска своего настраиваемого инструмента. Вы также можете определить пользовательские сменные * драйверы * через различные файлы конфигурации и '.gitattributes', и они могут это сделать. – torek