запустить алгоритм git merge для двух отдельных файлов - PullRequest
42 голосов
/ 03 февраля 2012

Я хочу воспользоваться алгоритмом git-merge для двух произвольных файлов в git-репо. Вот мой рабочий каталог:

folder/
    file1
    file2

file1 и file2 похожи, но я хочу посмотреть, как git объединит их, как если бы это были разные версии одного и того же файла. Другими словами, я хочу что-то вроде этого:

git merge-files file1 file2 > merge_of_file1_file2

Есть ли способ сделать это?

Ответы [ 4 ]

49 голосов
/ 03 февраля 2012

Это на самом деле не имеет смысла, потому что вы не предоставляете общего предка. Однако, если он у вас есть, вы можете использовать:

git merge-file <current-version> <common-ancestor> <other-version>

Это помещает результаты в файл текущей версии; если вы хотите их в другом месте, используйте:

git merge-file -p <current> <common> <other> > <dest>

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

Без этого все, что вы действительно можете сделать, это посмотреть на различия:

git diff --no-index file1 file2
37 голосов
/ 03 февраля 2012

Для того, что вы пытаетесь сделать:

touch file3  #empty
git merge-file file1 file3 file2

Это выполнит трехстороннее слияние файла1 и файла2 с файлом3 (пустым файлом) в качестве базы.

Обратите внимание, чтоэто пишет в файл1.Конечно, вы можете сделать следующее, если это нежелательно:

touch file3
cp file1 merge_of_file1_file2
git merge-file merge_of_file1_file2 file3 file2
3 голосов
/ 08 июля 2018

Просто чтобы добавить ответ manojlds, вот хорошая, полная функция, которую вы можете добавить к своему .bashrc, который выполняет эту работу. Преимущество состоит в том, чтобы правильно идентифицировать имена двух ваших файлов в блоках «конфликта слияния».

function merge() {
  local ext
  [ $# -ne 2 ] && echo "Error: Need exactly two args." && return 1
  [[ ! -r $1 || ! -r $2 ]] && echo "Error: One of the files is not readable." && return 1
  if [[ ${1##*/} =~ '.' || ${2##*/} =~ '.' ]]; then
    [ ${1##*.} != ${2##*.} ] && echo "Error: Files must have same extension." && return 1
     ext=.${1##*.}
  fi
  touch tmp$ext # use empty file as the 'root' of the merge
  cp $1 backup$ext
  git merge-file $1 tmp$ext $2 # will write to file 1
  mv $1 merge$ext
  mv backup$ext $1
  rm tmp$ext
  echo "Files merged into \"merge$ext\"."
}
1 голос
/ 03 сентября 2018

Вы также можете использовать KDiff3 для этого.

  • Выбрать файл один
  • Выбрать файл два

И объединить:)

http://kdiff3.sourceforge.net/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...