Программно отображать все git rerere разрешения, используемые во время слияния - PullRequest
0 голосов
/ 27 сентября 2018

Когда выполняется слияние с включенным rerere, и все конфликты разрешаются с помощью rerere, он просто печатает что-то вроде:

Resolved 'a.c' using previous resolution.
Resolved 'b.c' using previous resolution.
Resolved 'c.c' using previous resolution.

Я хотел бы видеть разность перед (с маркерами конфликта) и после разрешенияразн.Я знаю, что могу сделать:

git checkout -m a.c
git diff
git rerere
git diff
git checkout -m b.c
git diff
git rerere
git diff
...

, чтобы увидеть изображения, которые он использует до / после, для каждого разрешения.Но есть ли какой-нибудь способ получить эту информацию или повторно использовать отпечатки пальцев, не анализируя вручную вывод git merge hash для каждого сообщения Resolved X using previous resolution..

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Постимаж и прообраз хранятся в .git/rr-cache/$hex.После выполнения автоматического слияния у нас есть файл, содержимое которого совпадает с положением изображения.

Вот быстрая и грязная функция bash для печати прообраза X или разницы между версией HEAD ипрообраз.Побочным эффектом является то, что будут созданы висячие капли.

# input: file path
# output: the preimage with conflict markers, 
#         or the diff between HEAD's version and the preimage. 
#         If the file path does not exist in rerere cache, return nothing.
function foo(){
    p=$1
    current=`git hash-object $p`
    for hex in `ls .git/rr-cache`;do
        posthash=`git hash-object .git/rr-cache/$hex/postimage`
        if [ "$posthash" = "$current" ];then
            git diff HEAD:$p $(git hash-object -w .git/rr-cache/$hex/preimage)
            # To print the preimage
            #cat .git/rr-cache/$hex/preimage
            return
        fi
    done
}

foo a.c
0 голосов
/ 27 сентября 2018

Такое ощущение, что вы хотите сравнить наши , их и разрешение здесь кажется, что git diff откажется сравнивать 3 файла.Я исправил пример из этого поста, чтобы предоставить этот пример;

git diff --name-only master feature |\
    xargs -I % bash -c "diff3 <( git show master:% ) <( cat % ) <( git show feature:% )"

Вывод из diff3 более сложный, но это сложная вещь, которую вы делаете.

Шаги репликации

Инициализация репо.

Horba@cake ~ $ git init MergeDiff/
Initialized empty Git repository in /home/Horba/MergeDiff/.git/
Horba@cake ~ $ cd MergeDiff/
Horba@cake ~/MergeDiff $ vim README.md
Horba@cake ~/MergeDiff $ git add README.md 
Horba@cake ~/MergeDiff $ git commit -m "Init."
[master (root-commit) 5250b3f] Init.
 1 file changed, 3 insertions(+)
 create mode 100644 README.md
Horba@cake ~/MergeDiff $ git branch feature
Horba@cake ~/MergeDiff $ git config rerere.enabled true
Horba@cake ~/MergeDiff $ git config rerere.autoupdate true
Horba@cake ~/MergeDiff $ vim README.md 
Horba@cake ~/MergeDiff $ git add README.md
Horba@cake ~/MergeDiff $ git commit -m "Work on master."
[master 8c12c43] Work on master.
 1 file changed, 1 insertion(+), 1 deletion(-)
Horba@cake ~/MergeDiff $ git checkout feature
Switched to branch 'feature'
Horba@cake ~/MergeDiff $ vim README.md
Horba@cake ~/MergeDiff $ git commit -m "Work on feature."
[feature 4b8ad3d] Work on feature.
 1 file changed, 1 insertion(+), 1 deletion(-)
Horba@cake ~/MergeDiff $ git checkout master
Switched to branch 'master'

Выполнение начального слияния.

Horba@cake ~/MergeDiff $ git merge feature 
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Recorded preimage for 'README.md'
Automatic merge failed; fix conflicts and then commit the result.
Horba@cake ~/MergeDiff $ cat README.md
# MergeDiff

<<<<<<< HEAD
Init - master changes
=======
Init - Work on feature
>>>>>>> feature

Сохранение разрешения.

Horba@cake ~/MergeDiff $ vim README.md
Horba@cake ~/MergeDiff $ git rerere
Recorded resolution for 'README.md'.
Horba@cake ~/MergeDiff $ cat README.md
# MergeDiff

Init - Resolved
Horba@cake ~/MergeDiff $ git merge --abort

Слияние с помощью rerere.автообновление.

Horba@cake ~/MergeDiff $ git merge feature 
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Staged 'README.md' using previous resolution.
Automatic merge failed; fix conflicts and then commit the result.
Horba@cake ~/MergeDiff $ cat README.md
# MergeDiff

Init - Resolved
Horba@cake ~/MergeDiff $ git status
On branch master
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

    modified:   README.md

Традиционный diff не помогает.

Horba@cake ~/MergeDiff $ git diff feature master HEAD
diff --cc README.md
index ca2c305,ca2c305..24b898d
--- a/README.md
+++ b/README.md
@@@ -1,3 -1,3 +1,3 @@@
  # MergeDiff

--Init - master changes
++Init - Work on feature

diff3 может это сделать.

Horba@cake ~/MergeDiff $ diff3 <(git show master:README.md) <(git show feature:README.md) <( cat README.md )
====1
1:1,3c
  # MergeDiff

  Init - master changes
2:0a
3:0a
====2
1:6c
3:3c
  Init - Resolved
2:3c
  Init - Work on feature
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...