Запустить git алгоритм слияния на двух отдельных файлах

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

folder/
    file1
    file2

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

git merge-files file1 file2 > merge_of_file1_file2

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

Ответ 1

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

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

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

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

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

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

git diff --no-index file1 file2

Ответ 2

За что вы пытаетесь сделать:

touch file3  #empty
git merge-file file1 file3 file2

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

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

touch file3
cp file1 merge_of_file1_file2
git merge-file merge_of_file1_file2 file3 file2

Ответ 3

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

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\"."
}

Ответ 4

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

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

И слить :)

http://kdiff3.sourceforge.net/