Можно ли изначально получить все версии файла, участвующего в конфликте слияния, в одну строку? - PullRequest
0 голосов
/ 27 мая 2018

https://git -scm.com / book / ru / v2 / Git-Tools-Advanced-Merging предлагает сделать следующее, чтобы получить три файла, участвующих в трехстороннем слиянии:

$ git show :1:hello.rb > hello.common.rb
$ git show :2:hello.rb > hello.ours.rb
$ git show :3:hello.rb > hello.theirs.rb

Есть ли в Git что-нибудь встроенное для этого?https://stackoverflow.com/a/44755386/2687324 предлагает git merge-tool сделать это перед запуском инструмента, поэтому я подозреваю, что должен быть способ.

Примечание - это должно быть возможно с псевдонимами:

mergefiles = "!f() { git show :1:$1 > $1.common; git show :2:$1 > $2.common; git show :3:$1 > $3.common; }; f"

Но я не хочу настраивать это для крайних случаев (например, если HEAD и MERGE_HEAD добавили новый файл, это не удастся, потому что общий предок не имеет файла):

fatal: Path '<path>' is in the index, but not at stage 1.
Did you mean ':2:<path>'?

1 Ответ

0 голосов
/ 27 мая 2018

git-mergetool делает много, вы можете прочитать источник, чтобы узнать, что он делает .Это всего лишь сценарий оболочки, и вы потенциально можете воспроизвести то, что он делает.Но гораздо проще воспользоваться всей этой работой и написать свой собственный mergetool.

Из документации git-mergetool ...

Вместо запускаgit mergetool, одну из известных программ инструментов слияния, можно настроить для запуска альтернативной программы, указав командную строку для вызова в переменной конфигурации mergetool..cmd.

Когда git mergetool вызывается с помощью этого инструмента (либочерез опцию -t или --tool или переменную конфигурации merge.tool) сконфигурированная командная строка будет вызываться с $ BASE, установленным на имя временного файла, содержащего общую базу для слияния, если доступно;$ LOCAL - имя временного файла, содержащего содержимое файла в текущей ветви;Для $ REMOTE задано имя временного файла, содержащего содержимое файла, который должен быть объединен, а для $ MERGED задано имя файла, в который инструмент слияния должен записать результат разрешения слияния.

Напишите небольшой сценарий оболочки, поместите его в переменную PATH и сделайте его исполняемым.Обязательно выйдите с ненулевым значением, чтобы указать, что объединение «не удалось».

$ cat ~/bin/show-git-mergefiles 
#!/bin/sh

echo Base: $1
echo Local: $2
echo Remote: $3
echo Merged: $4

exit 1

Затем добавьте его в .gitconfig и передайте переменные среды.

[mergetool "show-git-mergefiles"]
        cmd = show-git-mergefiles $BASE $LOCAL $REMOTE $MERGED
        trustExitCode = true

ИБоб - брат твоих родителей.

$ git mergetool -t show-git-mergefiles
Merging:
file2

Normal merge conflict for 'file2':
  {local}: modified file
  {remote}: modified file
Base: ./file2_BASE_84551
Local: ./file2_LOCAL_84551
Remote: ./file2_REMOTE_84551
Merged: file2
merge of file2 failed
Continue merging other unresolved paths [y/n]?

Перед тобой подумай, если существующий инструмент слияния делает то, что ты хочешь.Например, vimdiff .

aldsfkalkd           |  aldsfkalkd           |  aldsfkalkd
ldfkjlj              |  ldfkjlj              |  ldfkjlj
another line         |                       |  feature line          
---------------------|  ---------------------|  ----------------------
---------------------|  ---------------------|  ----------------------
---------------------|  ---------------------|  ----------------------
---------------------|  ---------------------|  ----------------------
~                    |  ~                    |  ~                     
~                    |  ~                    |  ~                     
~                    |  ~                    |  ~                     
./file2_LOCAL_82335     ./file2_BASE_82335      ./file2_REMOTE_82335  
aldsfka
ldfk
<<<<<<< HEAD                                                          
another line                                                          
=======                                                               
feature line                                                          
>>>>>>> feature                                                       
~                                                                     
~                                                                     
~                                                                     
~                                                                     
file2                                            
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...