Git에서 병합 충돌 해결

Azhar Bashir Khan 2021년12월25일
Git에서 병합 충돌 해결

이 튜토리얼에서는 Git에서 두 분기를 병합할 때 발생하는 충돌을 해결하는 방법을 보여줍니다.

일반적으로 협업 팀 환경에서 여러 팀 구성원이 동일한 파일에 대해 작업을 수행하는 경우가 많습니다. 예를 들어, 일부 기능 개발 작업을 하는 한 팀 구성원은 개발된 기능에 대한 정보를 제공하기 위해 README 파일을 편집할 수 있습니다.

버그 수정 작업을 하는 다른 팀원이 동일한 README 파일에 수정된 버그에 대한 정보를 추가할 수 있습니다. 그들은 다른 브랜치에서 작업하고 각각의 브랜치에서 변경 사항을 커밋할 수 있습니다.

때때로 서로 다른 분기를 병합하여 응집력 있는 빌드를 제공해야 합니다. 따라서 이 작업은 동일한 파일이 다른 분기에서 업데이트될 때 병합 충돌을 발생시킵니다.

그런 다음 충돌을 해결하고 변경 사항을 병합해야 합니다. 이제 이를 예를 들어 설명하겠습니다.

git mergetool을 사용하여 두 분기 병합 시 발생하는 충돌 해결

병합 충돌을 해결하기 전에 Git에서 사용하는 diff 도구를 다음과 같이 설정해야 합니다.

$ git config merge.tool meld
$ git config merge.conflictstyle diff3
$ git config mergetool.prompt false

위의 명령은 meld를 기본 diff 도구로 설정합니다. 또한 conflictstylediff3(즉)으로 설정했습니다. 이것은 두 파일의 공통 조상을 표시하도록 diff 도구를 설정합니다(현재 분기와 병합할 분기의 파일).

지원되는 다양한 diff 도구를 보려면 다음 명령을 실행하세요.

$ git mergetool --tool-help

이제 충돌을 해결하는 방법을 보여주기 위해 예제로 시작합니다. 다음과 같이 두 개의 분기가 있다고 가정해 보겠습니다.

$ git branch
* main
  feature1

첫 번째 분기는 main 분기이고 두 번째 분기는 feature1이라는 기능 개발 분기입니다.

main 브랜치에는 다음과 같은 내용의 README.md 파일이 있습니다.

$ cat README.md
# Upwork
Upwork projects

위와 같이 현재 main 브랜치에 있습니다. 그런 다음 feature1 분기로 전환합니다.

$ git checkout feature1
Switched to branch 'feature1'

$ git branch
  main
* feature1

README.md를 업데이트하고 그 내용을 다음과 같이 인쇄합니다.

$ cat README.md
This is conflicting branch line.

이제 main 분기를 feature1 분기와 병합하여 해당 분기의 최신 변경 사항을 가져옵니다.

병합하는 동안 Git은 다음과 같이 병합 충돌을 보여줍니다.

$ git merge main
Auto-merging README.md
CONFLICT (add/add): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

다음과 같이 충돌에 대한 추가 정보를 얻을 수 있습니다.

$ git status
On branch feature1
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

	both added:      README.md

no changes added to commit (use "git add" and/or "git commit -a")

이제 충돌이 있는 README.md 파일의 내용을 인쇄합니다.

$ cat README.md 
<<<<<<< HEAD
This is conflicting branch line.

||||||| merged common ancestors
=======
# Upwork
Upwork projects
>>>>>>> main

이제 파일에 다양한 기호가 표시됩니다.

그리고 <<<<<<< 기호와 HEAD 기호는 현재 분기의 별칭입니다. 이것은 이 섹션 내에서 편집의 시작을 나타냅니다.

======= 기호는 현재 분기 내의 개정 끝과 새 분기 내의 편집 시작을 나타냅니다.

기호 >>>>>>> 다음에 원격 분기 이름이 옵니다. main은 시도된 병합이 발생한 위치를 보여줍니다.

이제 mergetool을 사용하여 충돌을 해결합니다.

$ git mergetool
Merging:
README.md

Normal merge conflict for 'README.md':
  {local}: created file
  {remote}: created file

이것은 meld를 시작합니다(기본 diff 도구로 설정했기 때문에). 아래 이미지를 참조하십시오.

git-mergetool-meld1

왼쪽 창에는 로컬 분기에서 수행된 README.md 파일에 대한 편집 내용이 표시됩니다. 중간 창에는 충돌을 해결하기 위해 수행한 변경 결과가 포함됩니다. 오른쪽 창에는 원격 분기 즉, 편집한 내용이 표시됩니다. main (즉) 병합하려는 분기.

로컬 및 원격 변경 사항 또는 둘 중 하나를 유지하도록 선택할 수 있습니다. 다음과 같이 원격 분기 변경 사항을 유지하도록 선택합니다.

git-mergetool-meld2

그런 다음 meld 도구를 저장하고 종료합니다.

README.md 파일을 인쇄하고 업데이트를 확인합니다.

$ cat README.md
# Upwork
Upwork projects

이제 변경 사항을 Git에 커밋합니다.

$ git commit -m "merged from main"
[feature1 3c39d7b] merged from main

이제 git diff 명령을 실행하여 feature1main 분기 간의 충돌을 확인합니다.

$ git diff feature1 main

feature1 분기의 상태를 확인합니다.

$ git status
On branch feature1

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	README.md.orig

병합하는 동안 mergetool에 의해 생성된 README.md.orig 파일 하나가 표시됩니다.

제거하려면 다음 명령을 실행하십시오.

$ git clean -f

따라서 Git의 mergetool을 사용하여 두 분기를 병합할 때 충돌을 성공적으로 해결했습니다.

관련 문장 - Git Merge