답변:
중간에있는 것 BASE
입니다.
실제로 BASE
는 공통 조상이 아니라 충돌이 >>>>
및 로 표시되는 반제품 병합 <<<<
입니다.
meld 편집 창 상단에서 파일 이름을 볼 수 있습니다.
BASE
meld 명령을 사용하거나 사용하지 않고 원하는대로 파일을 편집 할 수 있습니다 .
meld를 제거하고 원하는 텍스트 편집기로 파일을 편집 할 수도 있습니다.
<<<< HEAD
및 =====
마커 사이의 코드 는 병합 전에 로컬 파일 중 하나입니다.====
와 사이의 코드 >>>> <branch name>
는 원격 파일 중 하나입니다.HEAD
, <<<<<
및 =====
징후, 그것은 전혀 충돌이 없음을 의미합니다. 이 경우 가운데 창이 비어 있지 않고 병합 결과가 표시되지만 "빨간색"부분은 없습니다.
<<<<<<
, ======
도 >>>>>>
중 가운데 창에서 마커 (기본 버전을 즉); 때로는 aGr이보고 한 것처럼 가운데 창이 비어있을 수도 있습니다. 이 차이는 설정이 다르기 때문일 수 있습니다. 나는 융합 도구를 시작하면 다음과 같은 파일이 저장소에있는 파일의 이름입니다 가정, 존재하지 않을 것이다 X.java
: X.java
, X.java.orig
, X.java.BACKUP.#
, X.java.BASE.#
, X.java.LOCAL.#
, X.java.REMOTE.#
, 어디에서 #
어떤 번호입니다. 병합 결과를 호출하면 BASE 버전이 혼동됩니다. MERGED가 더 좋을 것입니다.
Meld는 4 번째 매개 변수를 전달 하여 숨겨진 3 방향 병합 기능을 활성화했습니다.
meld $LOCAL $BASE $REMOTE $MERGED
오른쪽 및 왼쪽 창은 읽기 전용 모드로 열리므로 실수로 잘못된 방법으로 병합 할 수 없습니다. 가운데 창에는 병합 결과가 표시됩니다. 충돌의 경우 기본 버전이 표시되므로 중간에 원래 텍스트가 있고 양쪽에서 충돌하는 수정 사항이 모두 표시됩니다. 마지막으로, "저장"버튼을 누르면 git에서 예상 한대로 $ MERGED 파일이 작성됩니다.
사용하는 ~ / .gitconfig 파일에는 다음 설정이 포함되어 있습니다.
[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE $MERGED
이것은 병합하려고하는 간단한 diff를 포함하는 3 번째 탭, 1 번째 및 2 번째 탭으로 병합되고 기본적으로 열려있는 3 번째 탭은 3 방향 병합보기를 보여줍니다.
이제 기능이 숨겨지는 이유는 아직 충분히 연마되지 않았기 때문입니다. 지금처럼 매우 유용하지만, 저자 인 Kai Willadsen은 다림질이 필요한 주름을 거의 언급하지 않았습니다. 예를 들어, 3 방향 병합 모드를 시작하기위한 GUI가없고, 명령 행 구문은 다소 간결합니다. 파이썬을 말하고 손에 시간이 있다면 무엇을해야할지 알고 있습니다.
편집 : Meld의 최신 버전에서는 synax가 약간 변경되었습니다. 이것은 의견에 있지만 답변에 속합니다.
meld 명령은 이제 --output 옵션을 사용하므로 위의 스 니펫에서 마지막 행은 다음과 같아야합니다.
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
--output option
. 시작 스크립트에서 다음 행을 참조하십시오."$merge_tool_path" --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
cmd = meld $LOCAL $BASE $REMOTE --auto-merge --output $MERGED
. 따라서 이렇게하면 3 개의 탭 (오래된 좋은 방법)이 열리고 충돌하지 않는 병합은 가운데로 병합되며 가운데는 $ MERGED이며 충돌 해결 출력으로 사용됩니다.
--output=<file>
또는 -o <file>
일 수 있습니다.meld --help
다음과 같은 4 개의 파일이 있습니다.
$LOCAL
병합하려는 지점의 파일입니다. 당신에게 보여 질 때 병합 과정에 의해 손길이 닿지 않은
$REMOTE
병합하려는 지점의 파일입니다. 당신에게 보여 질 때 병합 과정에 의해 손대지 않은
$BASE
$ LOCAL과 $ REMOTE의 공통 조상, 즉 두 지점이 고려 된 파일을 전환하기 시작한 지점; 당신에게 보여 질 때 병합 과정에 의해 손대지 않은
$MERGED
부분적으로 병합 된 파일이며 충돌이 있습니다. 이것은 병합 프로세스에 의해 만지는 유일한 파일이며 실제로는meld
$MERGED
파일은 포함 하나 <<<<<<
, >>>>>>
, =====
(그리고 아마도 ||||||
) 마커 (즉를 단락 충돌). 이 편집하는 파일 을 수동으로 올바른 충돌.
수동 충돌 편집 및 시각적 충돌 편집은 다른 파일에서 수행되며 다른 정보를 제공합니다.
mergetool (가정 meld
)을 사용할 때 여기에 표시되는 파일은 다음과 같습니다 $LOCAL
. $BASE
,, $REMOTE
. 이 $MERGED
파일 meld
은 편집 결과를 기록 하기 위해 숨겨진 매개 변수로 전달되지만 파일 은 표시되지 않습니다 .
다시 말해,에서 meld
파일 중간, 파일을 편집 $BASE
중이며 모든 변경 사항을 왼쪽 또는 오른쪽에서 수동으로 선택 합니다. 병합 프로세스가 건드리지 않은 깨끗한 파일입니다. 유일한 결함은 저장할 때, 당신은에 저장하지 않고, 그 인 $BASE
파일 만의 네 번째 숨겨진 매개 변수 meld
는 IS, $MERGED
(당신도 보지 않는) 파일을. $BASE
파일은 않습니다 하지 때문에 충돌 또는 부분 성공 병합을 포함 는없는 $MERGED
파일 .
시각적 편집에서시에 제시 $BASE
(대신의 파일 $MERGED
파일)git
병합 할 기본적으로 폐기 모든 시도를 (그 시도는 당신이 원하는 경우, 볼 수있는 $ 병합 된 파일에) 당신이 할 수 있습니다 완전히 병합을 처음부터 .
결론은 수동 및 시각적 병합 충돌에서 동일한 파일을보고 있지 않지만 최종 결과는 동일한 파일 (즉, $MERGED
파일)에 기록된다는 것입니다 .
갈등의 수동 보정을 수행 $MERGED
하기 때문에 git
아무런 의미가 없다 는 세 개의 파일의 정보를 (찌그러 트려 있도록, 당신에게 세 개의 파일을 제시 $LOCAL
,$BASE
, $REMOTE
는 점에서) $MERGED
파일을.
그러나 시각적 도구 에는 세 개의 파일을 표시 할 수 있는 수단 이 있습니다. 파일 $LOCAL
에는 $BASE
,, $REMOTE
파일이 표시됩니다. $LOCAL
및 $REMOTE
파일 에서 변경 사항을 선택 하고 해당 파일을 파일로 가져와 $BASE
파일을 병합하지 못한 시도를 완전히 다시 작성하고 덮어 씁니다 $MERGED
.
$LOCAL
, $REMOTE
, $BASE
출력은 처음에 동일 $BASE
하지만, 다른 어떤 $MERGED
이의 파일과 충돌 마커 등을 병합하는 자식의 시도를하지 않는다는 점에서. 실제로, 그것은 LOCAL / REMOTE / BASE + OUTPUT의 3 패널 접근법과 가장 유사한 도구를 사용하는 방법 일 것입니다. 네 번째 창에서는베이스와 출력을 분리 할 수 있습니다.
Cosmin의 솔루션은 작동하지만 $ MERGED가 아닌 $ BASE 파일이 업데이트됩니다 . $ MERGED 파일 이 업데이트 됩니다 :
용융 : v1.8.4
[merge]
conflictstyle = diff3
tool = mymeld
[mergetool "mymeld"]
cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE --diff $BASE $LOCAL --diff $BASE $REMOTE
cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
--diff $BASE $LOCAL --diff $BASE $REMOTE
마지막에 필요 할까요? 1.8.4에서 나를 위해, 이것은 잘 작동합니다 (내가 볼 수있는 한) :cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
와 융합 1.7 메크에 의한 솔루션은 더 이상 작동하지 않습니다 묻어.
기본 설정은 나를 만족하지 않았다 :
대신 Meld> = 1.7 의 경우 두 가지 다른 솔루션 중 하나를 제안합니다.
첫 번째 해결책 :
meld $LOCAL $BASE $REMOTE --auto-merge
두 번째 해결책 :
meld $LOCAL $MERGED $REMOTE
.gitconfig
.gitconfig
위의 설명에 따라 솔루션을 얻으 려면 파일 에 복사하여 붙여 넣으십시오 .
[merge]
tool = meld16
[mergetool "meld17"]
# use this for Meld >=1.7
# see http://stackoverflow.com/a/22911793/859591
# second solution:
cmd = meld $LOCAL $MERGED $REMOTE
# first solution:
#cmd = meld $LOCAL $BASE $REMOTE --auto-merge
[mergetool "meld16"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
[include]
# requires git v1.7.10+
path = .gitconfig.local
.gitconfig.local
여러 머신에서 .gitconfig를 사용하는 경우이 머신에 대해서만 meld17 또는 meld16을 설정하려면 이를 파일 에 복사하여 붙여 넣으 십시오.
# This is a host specific config file!
# Note that git 1.7.10+ is needed
# http://stackoverflow.com/a/9733277/859591
[merge]
tool = meld17
cmd = meld $LOCAL $BASE $REMOTE --auto-merge
하면 중간 분할 창이 $ BASE가되고 실제로는 충돌 해결의 출력으로 사용되는 $ MERGE가 아닙니다.
표시된 기본 파일이 저장되지 않았 음을 발견했습니다. MELD을 보여주는데 $LOCAL
, $REMOTE
그리고 $BASE
기본적으로. 그것이 작동하게하려면, $MERGED
대신에 meld show를 만들어야했습니다 $BASE
. 이것을 내 ~/.gitconfig
고정에 넣는 것은 나를 위해 :
[merge]
tool = mymeld
[mergetool "mymeld"]
cmd = meld "$LOCAL" "$MERGED" "$REMOTE"
아치를 사용하고 있습니다.
$ git --version
git version 1.8.2
$ meld --version
meld 1.7.1
어떤 이유로 최신 버전의 meld는 충돌에 추가 된 마커 라인을 표시하지 않습니다 (<<<<<<<, =======, >>>>>>>). 해당 행을 보려면 meld v 1.3.3 이하를 설치해야합니다.
merge.conflictstyle
구성 옵션diff3
이 기본값 대신 설정되어 있으면 자동 병합에 실패한 파일에서 충돌하는 청크에 대해 더 잘 이해하는 사람들이merge
있습니다.