2012-06-12 4 views
30

에서 병합했습니다. 이미 3 방향 diff로 커밋 된 병합을 볼 수있는 방법이 있습니까?이미 커밋 된 Git 병합을 외부 3 방향 diff 도구

분기 간의 거대한 병합이 3 주 전에 완료된 경우 외부 diff-tool BeyondCompare3과 같은 방식으로 3 방향 diff를 볼 수 있습니까? 내가 단지 병합 커밋에서 변경된 파일을 찾고 있는데. 보너스. 두 지점 사이의 파일의 전체적인 차이를 보는 대신 충돌과 수동으로 변경된 사항 만 표시하도록하려면 보너스를받습니다.

나는 왼쪽 충돌 마커를 >>>>> < < < < < =====이 있고 오른쪽에는 최선을 다하고 결과였다 경우 2 웨이 DIFF에 대한 정착 상관 없어.

나는 DIFF 트리, DIFF-파일, DIFF, difftool, 보여주고, 다른 사람과 그것을 알아낼 수 없었다보고했습니다. 나는 gitk가 병합 커밋에서 변경 사항을 보여줄 것이라고 알고 있지만 over-under diff보기가 마음에 들지 않으며 변화가 많을 때 이해하기가 매우 어렵습니다.

단지 내가 어떤 해커없이 자식의 세 방향 사랑하는 방법을 모르는 git difftool --cc firstparent..secondparent..result

답변

2

뭔가를 할 수 있다면,하지만이 방법을 내가 meld을 사용하십시오 DIFF. meld은 프로젝트의 세 가지 버전을 체크 아웃하고 디렉토리별로 새로운 diff 작업을 수행하고 "Three Way Compare"옵션을 선택하면 3 방향 diff를 수행 할 수 있습니다.

먼저 커밋

git log | more

찾기 difftool

git config --global diff.tool meld

으로 MELD

sudo apt-get install meld

그런 설정 융합에 설치 열고 커밋

git difftool <old-version>..HEAD

6

업데이트 답 : 아래 사실 $conflicting_files 정말 갈등이 있었다 파일 만이 포함되지 않았다는 점에서 결함 된 스크립트의 내 원래 버전 만 변경된 모든 파일 양쪽 부모 지점에서 (반드시 충돌이있는 것은 아닙니다). 또한 이론적 근거에서 광고 된대로 "구성된 병합 도구"를 사용하지 않고 diffuse입니다. 두 가지 문제를 current version of the script에 모두 설명했습니다.

원래 답 : 이의 우리는 주요 개발이 진행와 "마스터"지점을 가지고 있다고 가정 해 봅시다, 마스터의 일부 (이상) 상태의 상단에 몇 가지 기능을 추가하는 "항목"지점.당신이 병합 커밋에서 변경된 파일만을 찾고 있다고 말하면, 병합 커밋 (충돌 해결 포함)에서 "마스터"로 소개 된 변경 사항 "주제"에만 관심이 있다고 가정합니다. "주제"가 분기 된 이후 "마스터"에서 수행 된 충돌하는 변경 사항. 또한 "마스터"병합의 첫 번째 부모가 커밋 "항목은"두 번째는,이 그것이 의미가 여기 DIFF 3의 방법을 사용하지 않는

git difftool <merge commit>^1 <merge commit> 

참고 달성 할 수 있다고 가정 우리는 에 모든 충돌 해결이 포함 된 상태를보고 있습니다. 이것은 또한 GitHub이 병합 커밋에 대해 보여주는 것입니다. 내가 테스트에 사용한 this merge commit. 힘내 커밋의 첫 번째는 직접 작업 할 수 있기 때문에

내가 Diffuse 대신 Beyond Compare을 사용하고

#!/bin/sh 

if [ $# -ne 1 ]; then 
    echo "Rationale : Show the conflict resolution of a given merge commit in the configured merge tool." 
    echo "Usage : $(basename $0) <merge commit>" 
    exit -1 
fi 

# Test e.g. with https://github.com/git/git/commit/8cde60210dd01f23d89d9eb8b6f08fb9ef3a11b8 
our=$1^1 
their=$1^2 
base=$(git merge-base $our $their) 

conflicting_files=$(git merge-tree $base $our $their | grep -A 3 "changed in both" | grep "base" | grep -Po "[^\s]+$") 
for f in $conflicting_files; do 
    diffuse -r $our -r $base -r $their $f 
done 

이 스크립트를 내놓았다 3 방향은 diff 도구 만 충돌하는 파일 및 해상도를 참조하십시오 로컬 파일이 아니라 인수 순서를 원하는대로 변경하십시오. BC를 사용하려면 일시적인 체크 아웃이 필요할 수 있습니다. 또한 병합을 다시하고, 알려진 해상도를 적용하고, git mergetool이 실행되도록 생각하고있었습니다.하지만이 두 가지 아이디어 모두 작업 트리를 혼란스럽게하지 않고 올바르게 정리하는 데 더 많은 작업이 필요할 것입니다.

+0

확산을 위해 +1, 다른 커밋으로 4 방향 diff를 수행 할 수도 있습니다. – Johan

0

sschuberth처럼 병합 커밋을 변경하는 데 도움이되는 스크립트를 작성했습니다. 이 파일은 vimdiff를 사용하여 한 번에 하나의 파일에서 작동하여 부모 간의 차이점을 보여주고 커밋을 병합합니다.

#! /usr/bin/env ruby 

require 'pp' 
require 'tmpdir' 

merge = ARGV[0] || abort("I need a merge commit as the first argument") 
file = ARGV[1] || abort("I need a path as the second argument") 
cmd = "vimdiff" 

commits = `git log -n 1 #{merge} --format="%H %P"`.split(' ') 
abort "expected three commits" unless commits.size == 3 
commits[0], commits[1] = commits[1], commits[0] 
tmpdir = Dir.mktmpdir 
commits.each do |commit| 
    tfile = "#{tmpdir}/#{commit[0..10]}" 

    puts "git show #{commit}:./#{file} > #{tfile}" 
    `git show #{commit}:./#{file} > #{tfile}` 
    cmd += " #{tfile}" 
end 
puts cmd 
exec(cmd) 

약간 해키지만 나는 그것을 누군가에게 도움이되는 기회에 게시했습니다.

관련 문제