LOCAL, BASE 또는 REMOTE 중 어떤 버전의 git 파일이 최종적으로 사용됩니까?


174

에 콜리슨이 있으면 Meldgit merge 라는 mergetool을 엽니 다 . LOCAL, BASE 및 REMOTE의 세 파일이 열립니다. LOCAL은 로컬 브랜치이므로 BASE는 공통 조상이며 REMOTE는 병합 할 브랜치입니다.

이제 내 질문에 : 파일의 어떤 버전이 최종적으로 사용됩니까? 원격인가요? 그렇다면 예를 들어 BASE 브랜치에 관계없이 원하는대로 편집 할 수 있습니까?

답변:


142

중간에있는 것 BASE입니다.

실제로 BASE는 공통 조상이 아니라 충돌이 >>>>및 로 표시되는 반제품 병합 <<<<입니다.

meld 편집 창 상단에서 파일 이름을 볼 수 있습니다.

스크린 샷보기

멜트베이스

BASEmeld 명령을 사용하거나 사용하지 않고 원하는대로 파일을 편집 할 수 있습니다 .
meld를 제거하고 원하는 텍스트 편집기로 파일을 편집 할 수도 있습니다.

  • <<<< HEAD=====마커 사이의 코드 는 병합 전에 로컬 파일 중 하나입니다.
  • ====와 사이의 코드 >>>> <branch name>는 원격 파일 중 하나입니다.

3
merge.conflictstyle구성 옵션 diff3이 기본값 대신 설정되어 있으면 자동 병합에 실패한 파일에서 충돌하는 청크에 대해 더 잘 이해하는 사람들이 merge있습니다.
kostix

3
실제로 HEAD, <<< 및 ===가 표시되지 않습니다. 제공 한 경우 가운데 창이 비어 있습니다. 그러나 그것은 다른 사람들을위한 참고 사항입니다.
tsusanka

당신이 표시되지 않는 경우 HEAD, <<<<<=====징후, 그것은 전혀 충돌이 없음을 의미합니다. 이 경우 가운데 창이 비어 있지 않고 병합 결과가 표시되지만 "빨간색"부분은 없습니다.
Fabien Quatravaux

10
내가 융합과 병합을하고있을 때, 나는 어떤을 보지 않는다 <<<<<<, ======>>>>>>중 가운데 창에서 마커 (기본 버전을 즉); 때로는 aGr이보고 한 것처럼 가운데 창이 비어있을 수도 있습니다. 이 차이는 설정이 다르기 때문일 수 있습니다. 나는 융합 도구를 시작하면 다음과 같은 파일이 저장소에있는 파일의 이름입니다 가정, 존재하지 않을 것이다 X.java: X.java, X.java.orig, X.java.BACKUP.#, X.java.BASE.#, X.java.LOCAL.#, X.java.REMOTE.#, 어디에서 #어떤 번호입니다. 병합 결과를 호출하면 BASE 버전이 혼동됩니다. MERGED가 더 좋을 것입니다.
Teemu Leisti

3
BASE는 사실 공통 조상이며, MERGED는 부분 병합 정보가 포함 된 파일의 이름입니다. 내 질문과 답변 Meld를 ​​git difftool 및 mergetool로 설정하고 사용하여 정확하게 작동하는 방법을 설명하십시오. HTH.
mattst

107

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

7
@Jesse, @lumbric, 최신 버전의 meld --output는 $ MERGED 결과에 플래그 를 사용하는 것으로 보입니다 . 내 버전의 git과 함께 제공되는 meld 실행 스크립트를 보면서이
Johann

1
@lumbric Meld 1.7.x +의 경우 --output option. 시작 스크립트에서 다음 행을 참조하십시오."$merge_tool_path" --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
Johann

12
최신 meld (버전> 1.8.4)에서는 --auto-merge 옵션을 사용해야합니다. cmd = meld --diff $ BASE $ LOCAL --diff $ BASE $ REMOTE-자동 병합 $ LOCAL $ BASE $ REMOTE --output $ MERGED
RoboAlex

7
Meld 1.8.4를 사용하는 @pingpongboss와 같은 문제가있었습니다. Meld는 세 번째 탭을 여는 대신 별도의 창에서 물건을 열었습니다. 마지막으로 잘 작동 한 명령은 다음과 같습니다 cmd = meld $LOCAL $BASE $REMOTE --auto-merge --output $MERGED. 따라서 이렇게하면 3 개의 탭 (오래된 좋은 방법)이 열리고 충돌하지 않는 병합은 가운데로 병합되며 가운데는 $ MERGED이며 충돌 해결 출력으로 사용됩니다.
farmir

2
출력 구문은 --output=<file>또는 -o <file>일 수 있습니다.meld --help
levsa

57

다음과 같은 4 개의 파일이 있습니다.

  1. $LOCAL병합하려는 지점의 파일입니다. 당신에게 보여 질 때 병합 과정에 의해 손길이 닿지 않은

  2. $REMOTE병합하려는 지점의 파일입니다. 당신에게 보여 질 때 병합 과정에 의해 손대지 않은

  3. $BASE$ LOCAL과 $ REMOTE의 공통 조상, 즉 두 지점이 고려 된 파일을 전환하기 시작한 지점; 당신에게 보여 질 때 병합 과정에 의해 손대지 않은

  4. $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.


난 그냥 4 개 파일을 보여 않습니다 (예를 들어 비교 이상) 도구가 있음을 원
yoniLavi

@yoniYalovitsky : 예 또는 p4merge
user1284631

ClearCase 패키지의 병합 도구를 사용했습니다
mishmashru

@yoniLavi-이 도구는 4 개의 창을 표시 하지만이 답변에 설명 된 4 개의 파일이 모두 필요한 것은 아닙니다. 특히, 당신을 보여주기 위해이 4 창 도구를 설정할 수 있습니다 $LOCAL, $REMOTE, $BASE출력은 처음에 동일 $BASE하지만, 다른 어떤 $MERGED이의 파일과 충돌 마커 등을 병합하는 자식의 시도를하지 않는다는 점에서. 실제로, 그것은 LOCAL / REMOTE / BASE + OUTPUT의 3 패널 접근법과 가장 유사한 도구를 사용하는 방법 일 것입니다. 네 번째 창에서는베이스와 출력을 분리 할 수 ​​있습니다.
BeeOnRope 1

16

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

Sabun의 솔루션은 우분투에서 작동합니다. 원래 질문에 관한 한 이것은 현재 정답입니다.
cosmin

3
내 버전의 meld-3.11에서이 명령은 훌륭하게 작동합니다.cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
MartinM

--diff $BASE $LOCAL --diff $BASE $REMOTE마지막에 필요 할까요? 1.8.4에서 나를 위해, 이것은 잘 작동합니다 (내가 볼 수있는 한) :cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
farmir

1
@farmir : 필요하지 않습니다. 멜트에서 두 개의 탭이 더 열리므로 개별적으로 BASE와 비교하여 LOCAL 및 REMOTE를 볼 수 있습니다.
Sam Kauffman

1
이러한 인수로 어떤 순서로 시도하든 3 방향 탭은 항상 세 번째 탭이고 첫 번째 탭은 항상 기본적으로 선택됩니다. 기본적으로 3 방향 탭을 선택하는 방법이 있습니까?
Sam Kauffman

13

융합 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

Meld 1.8.4에서는 작동하지 않습니다. 를 실행 cmd = meld $LOCAL $BASE $REMOTE --auto-merge하면 중간 분할 창이 $ BASE가되고 실제로는 충돌 해결의 출력으로 사용되는 $ MERGE가 아닙니다.
farmir

1
@farmir 두 번째 탭으로 $ BASE를 선택했습니다.
Alex78191

11

표시된 기본 파일이 저장되지 않았 음을 발견했습니다. 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

실례합니다.이 구성은 inux와 호환됩니까?
MadMad666


2

정답은 Saad의 답변을 참조하십시오.

우분투에서 meld 1.8.1을 사용하면

--diff에 잘못된 수의 인수가 제공되었습니다.

그리고 $ MERGED 전에 --output을 추가하면 나를 위해 고쳤습니다.

[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.