본문 바로가기

GIT

GIT CLI - Conflict, 3 way merge, p4merge

반응형
SMALL

이 글은 생활코딩의 GIT CLI - Branch & Conflict 수업을 듣고 작성한 글 입니다.

git은 3way merge라는 것을 이용해서 충돌(conflict)를 처리한다.

3way merge라는 것을 실습을 통해 알아보고, p4merge라는 외부 도구를 활용해서 gui를 통해 conflict를 해결해보자

conflict라는 branch와 branch를 merge할 때 일어난다.

협업을 할 때에도 branch를 사용하는 것이기 때문에 conflict가 일어나게 된다.

이 문제를 해결하려면 conflict를 잘 이해해야 할 필요가 있다.

git은 3 way merge라는 것을 이용해서 병합처리한다.

3 way merge

master branch에 A, B, C, D 가 담겨 있는 상태에서,

here와 there라는 branch를 만들고 위 표와 같이 각 각의 데이터를 수정하였다.

  1. here와 there를 병합하려고 할 때, 2 way merge라면 A를 제외하고 결정하지 못해서 Conflict가 일어나게 된다.
  2. git은 3 way merge를 이용하여 병합을 진행하는데, 이 때 원래의 commit 이였던 A,B,C,D가 들어있는 것을 base라고 한다.
  3. base를 기준으로 수정된 부분들을 확인 했을 때를 생각해보자
    1. A는 base를 기준으로 모두 같기 때문에 A가 된다.
    2. D는 둘 다 수정되었기 때문에 Conflict가 일어난다.
    3. B는 here만 수정되었기 때문에 H가 된다
    4. C는 there만 수정되었기 떄문에 T가 된다.
  4. 수정 된 부분으로 결과를 바꿔준다고 생각하면 된다.

3 way merge의 자동 merge 결

5. 3 way merge를 이용하면 2 way merge에 비해서 자동으로 수정해주는 부분이 늘어나게 된다.

[실습]

  1. 윗 부분을 참고해서 실습 환경을 만들어보자
    • 영상의 실습환경을 비슷하게 구현하였다.
    • git init 3way; cd 3way
    • nano work.txt
      • ABCD
    • git add work.txt
    • git commit -m "ABCD"
    • git branch here
    • git checkout here
    • nano work.txt
      • AHCH
    • git commit -am "AHCH"
    • git checkout master
      • here branch에서 there branch를 만들지 않도록 주의하자
    • git branch there
    • git checkout there
    • nano work.txt
      • ABTT
    • git commit -am "ABTT"
    • git checkout master
    • git log --all --oneline --graph

이미지 참고

2. here에서 there를 merge 해보자

    • git checkout here
    • git merge there
      • Conflict가 일어나게 된다.
    • 이론 부분과 동일하게 3 way merge를 통해 마지막 부분을 제외하고는 자동 병합을 해주는 것을 확인할 수 있다.
    • 이 때, 직접 수정을 하는 것도 방법이지만 git mergetool 이라고 명령어를 치게 되면 외부 도구를 사용할 수 있다.
      • 미리 다운로드 해놓아야 한다.

3 way merge가 된 상태

    • p4merge - perforce(무료로 사용할 수 있다.)
      • google에 검색하면 다운로드할 수 있다.
      • 그냥 next 계속해서 설치하면 된다.
      • 영상에서는 MacOS 기준으로 설명 후 windows는 검색해서 알아보라고 하는데 아래 링크를 참조하면 쉽게 사용할 수 있다.
        • diff tool 도 같이 설정하는 방법이 나오는데 필요한 부분만 사용하면 된다.
      • 설정을 완료하게되면 설정 내용을 확인해보자
        • cat ~/.gitconfig
        • merge와 mergetool에 대한 설정이 필자와 동일해야 한다.
          • 설치 위치를 변경했으면 그에 맞춰야한다.
          • 설정하다 이상하면 nano editor를 이용해서 지우고 다시해보자
      • git에서 실행을 해보자
        • git mergetool
      • 가운데 BASE를 기준으로
      • 내가 있던 위치인 here가 오른쪽에 LOCAL로
      • there가 왼쪾에 REMOTE로 있는 것을 확인할 수 있다.
      • 아랫부분의 D,T,H를 원하는대로 수정하고 저장버튼을 누른 후 프로그램을 끄면
      • 대기하고 있던 git bash가 끝난다
      • git status를 해보면
        • git이 자동으로 add까지 해주고, work.txt.orig를 남긴다.
          • 이전 상태를 백업
          • 확실한 상태라면 orig파일을 지우면 된다.
          • rm work.txt.orig
      • 여기서 cat 명령어를 통해 확인해보고
      • git commit 명령어를 입력하면, 자동으로 어떤일이 있었는데 commit message를 불러온다.

다양한 merge tool이 존재한다고 한다.

필요에 따라 검색해서 자신에게 맞는 툴을 사용해볼 수 있도록 하자

반응형
LIST