Git 충돌을 해결하는 14가지의 팁과 도구

Git은 코드의 병합에 매우 편리하다고 여겨지고 있습니다. 병합은 로컬에서 속도, 그리고 유연성을 제공합니다. 당연한 일이지만, 다른 브랜치에서 누군가가 내용을 병합 할 때 충돌이 발생합니다. 충돌을 해결하려면 주요 변경 사항을 파악하고 파악해야합니다. 
충돌의 해결은 때로는 많은 작업이 필요합니다.

개발자는 자신들이 선호하는 충돌 해결 방법이 있습니다. 따라서 동료 작가 댄 스티븐스가 이전 Questions for Confluence 를 사용하여 사내의 사람에게 질문하였습니다.


돌아온 답변과 통찰력은 Atlassian 직원뿐만 아니라 더 많은 사람에게 도움이 될 것이었습니다. 그래서 우리가 Git 충돌을 해결하는 다양한 방법을 다음에 자세하게 주석과 함께 소개합니다. 
여러분의 매일의 코딩 작업에 도움이 되는 아이디어와 방법이 여기에서 얻을 수 있기를 바랍니다.

일반적인 설정 팁

그러면 Git을 적절하게 설정하여 병합 할 수 있도록 기본 설정부터 시작해 보겠습니다.
1. 설정 팁

충돌이 발생한 경우 명령 줄에 " git mergetool "라고 입력하거나 시각적 도구를 사용하여 병합 세션을 시작할 수 있습니다. 
좋아하는 충돌 해결 소프트에서 Git 설정하려면 " .gitconfig "에서 "merge.tool "변수를 사용하십시오. 예를 들어, KDiff3 를 사용하는 사용자는 " .gitconfig " merge섹션에 다음과 같이 기술하면 좋습니다

[merge]
tool="kdiff3"

이것은 다음 명령 줄을 입력하는 것과 같습니다.

git config --global merge.tool kdiff3

2. 충돌 마커에서 common ancestor 보이기

common ancestor를 볼 수 있도록 충돌 markers를 개선하는 다음의 설정을 합니다 (로빈 스토커와 휴 기든스께 감사).

git config --global merge.conflictstyle diff3

이 설정에서 마커 ||||||| 을 가진 새로운 섹션을 추가하여 충돌에 주석을 붙이고 있습니다. 이렇게하면 문제의 2 분기 common ancestor 인 커밋을 충돌하고있는 행이 어떻게 참조하는지 알 수 있습니다.

3. 병합 시 "patience" 알고리즘 사용


XML 파일과 같은 긴 내용의 파일에 충돌이 있거나 두 가지 버전이 분기하는 경우 등에는 다시 다음과 같은 병합을 시도합니다.
git merge --strategy-option=patience

patience 알고리즘을 사용하면 함수와 태그의 잘못된 괄호를 조정하는 데 도움이됩니다. 이 알고리즘의 자세한 내용은 Stack Overflow의 답변 에서 참조하실 수 있습니다.

4.  단일 파일의내용에 대한 히스토리 정보가 필요한 경우


파일에 일어난 확인하기 위해 SourceTree 같은 시각적 도구를 사용하는 것 외에도 다음을 사용할 수 있습니다.

git log --merge --decorate --source -p path/to/file/you/care/about

충돌을 수동으로 해결


병합에 대한 작업에서 두개의 형태가 존재합니다. 낮은 수준 프로세스를 사용하여 충돌 마커를 수동으로 조작하는 개발자, 그리고 시각적 도구를 즐겨 사용하는 개발자 입니다. 둘 다 매우 효과적입니다.

5. 샘플 프로세스


동료 몇 사람이 수동으로 처리하는 절차를 공유하고 있었습니다. 예로 제이슨 힌치가 다음 작업을 알려주었습니다.

  • 먼저 수동으로 직접 병합한다:
    git merge the/other/branch
    git status
  • 파일이 어떻게 충돌하는지 확인한다:
  • 충돌하는 각 파일에 대해 다음을 수행한다:
    • 좋아하는 편집기 (IntelliJ 또는 vim 등)에서 파일을 연다.
    • 충돌 마커로 둘러싸여있는 각 블록 ( " >>>> "와 " <<<< ")를 확인한다.
    • 그것이 적절한 여부가 작성한 사람의 의도가 무엇인지를 확인하고 가능한 경우 해결한다.
    • 충돌 마커를 이해하면 (파일의 변경이 많은 경우에는 자주) 다음을 실행한다.

      git diff HEAD...the/other/branch -- path/to/conflicting/file
      git diff the/other/branch...HEAD -- path/to/conflicting/file

이제 두 변경 사항 중 적은쪽이 어느쪽인지 확인할 수있다.


    • 때때로 사용하는 명령: 
      git log -p HEAD..the/other/branch -- path/to/conflicting/file
      git log -p the/other/branch..HEAD -- path/to/conflicting/file

이러한 정보를 사용하여 각각의 변경 사항이 밝혀 질 경우가 많다.

    • 변화의 가장 많은 파일로 되돌린다.
      git checkout the/other/branch -- path/to/conflicting/file
(혹은 git checkout --theirs 또는 --ours 을 사용해도된다)



    • 수동으로 확인하고 변경 사항을 다른 파일에 반영한다.

      git add path/to/conflicting/file


    • 모든 변경 사항을 수정 한 후 프로젝트를 빌드하여 최소한 컴파일을한다. 쉽게 테스트 할 수 있는 경우 테스트도 실시한다.
      git commit


조금 복잡하게 보일지도 모르지만, 제이슨은 그의 작업 절차에서 일부 나쁜 병합이 있음을 알게 되었습니다.
충돌을 수동으로 해결하는 방법을 단계적으로 설명하고있는 기초 동영상 최신 Git Power Routines 과정에서 참조하십시오.

 

수많은 병합 도구


복잡한 병합과 충돌 해결을 위한 시각적 도구가 많이 있습니다. 내 동료들이 다양한 도구를 (완전히 망라하고있는 것은 아니지만) 언급 하였습니다.

6. IntelliJ IDEA 충돌 해결 도구


IntelliJ IDEA는 Atlassian 의 많은 직원들이 이용하고있는 IDE입니다. 충돌을 해결하기 위해 많은 사람들이 내장 IntelliJ IDEA 충돌 해결 도구를 사용하고 있습니다.  이 도구는 분석을 위해 로컬, 원격 병합 결과 3 개의 창을 준비하고 있습니다.


7. KDiff3


KDiff3 는 KDE 제품 스위트의 하나로, 우리의 조사에서 몇 번 언급되었습니다.


8. P4Merge


Steve Streeting - original author of SourceTree - and several other colleagues uses P4Merge for merges.P4Merge is a free visual tool and has four panes instead of the three other tools provide. The panes show the "base", "local", "remote" and "merge result".
SourceTree 의 첫 번째 저자 Steve Streeting과 몇 명의 동료는 P4Merge을 병합에 사용하고 있습니다. P4Merge 무료 비주얼 도구로 다른 도구는 3 개의 창을 보여주는데 반해 이 도구는 4 개의 창을 제공합니다.
이 창에서는 표시되는 것은 「base」 「local」 「remote」 「merge resutl "입니다.


9. meld


meld 은 GTK +와 Python으로 개발 된 도구로 오랫동안 사용되어, 몇 명이 이 도구를 언급 하였습니다.


10. tig for status + diff


터미널을 좋아하는 사람들은 tig  (우리는 이전 tig 관한 훌륭한 소개 기사 를 썼습니다) 과 표준 터미널 git diff 를 사용하고 있습니다.

11. OS X FileMerge aka opendiff


많은 제안의 글에서 몇 명의 개발자가 OS X의 기본 도구 " opendiff "또는 "FileMerge"라는 도구를 언급 하였습니다.

12. diffmerge


나는 diffmerge 대해 잘 몰랐는데, 이것도 제안에 있었습니다.

13. Araxis Merge (상업용)


나는이 Araxis Merge 라는 이름을 보면 훨씬 이전에 locked down Windows 시스템에서 작업하던 시절이 기억납니다. 대량의 XML 파일의 홍수에서  살아남으려고 하면서 이 도구가 유용하다는 것을 알았습니다. 이것은 상용 도구입니다.


14. vimdiff3


몇 명의 동료는 vimdiff 를 사용하여 충돌을 해결하고 있습니다. 이것은 vim 병합 / diff 도구입니다. 다음과 같이 입력하여 설정합니다.

git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false

또는 .gitconfig 파일을 위와 같이 직접 수정합니다.

결론


당신은 충돌을 어떻게 해결하고 있습니까? 여기서 언급 된 도구와 다른 도구를 사용하고 있습니까?
당신의 테크닉을 가르쳐주세요. @durdn 또는 우리의 훌륭한 팀 @atlassiandev 로 연락 주시기 바랍니다.

댓글

이 블로그의 인기 게시물

시스템에 숨어있는 "윤초" 버그에 대해 준비하십시요

Confluence 내의 스프레드 시트 기능이 필요하시다면 애드온을 활용해 보십시요

Confluence 페이지의 분류와 관련된 잘 몰랐던 기능 3가지를 확인해 보십시요