Computer >> 컴퓨터 >  >> 프로그래밍 >> 프로그래밍

Git 병합 충돌(Merge Conflict) 해결 방법 완벽 가이드

대부분의 경우 Git은 서로 다른 브랜치 간의 차이를 자동으로 해결하고 병합합니다. 개발자들이 보통 서로 다른 줄이나 파일을 수정하기 때문입니다. 하지만 Git이 스스로 병합하지 못하는 경우도 있는데, 이러한 상황을 병합 충돌(merge conflict)이라고 부릅니다.

이 글에서는 병합이 무엇인지, 병합 충돌이 왜 발생하는지, 그리고 Git 병합 충돌을 해결하는 구체적인 방법까지 단계별로 알아보겠습니다.

병합 충돌이란 무엇인가?

병합 충돌이란 Git이 사용자의 도움 없이는 두 브랜치를 병합할 수 없는 상황을 말합니다.

병합은 Git과 같은 버전 관리 시스템의 핵심 기능입니다. 병합을 활용하면 하나의 저장소에서 여러 갈래의 개발 흐름을 동시에 유지할 수 있습니다. 예를 들어 한 개발자가 메인 프로젝트 코드에 영향을 주지 않으면서 별도의 브랜치에서 버그를 수정할 수 있습니다.

병합 충돌은 주로 다음 두 가지 상황에서 발생합니다.

  • 두 브랜치에서 같은 코드 줄을 수정한 경우
  • 한 브랜치에서 파일을 삭제했는데, 다른 브랜치에서 해당 파일을 수정한 경우

병합 충돌이 발생하면 Git은 오류 메시지를 출력하여 브랜치 병합에 실패했음을 알려줍니다.

삭제된 파일 충돌 해결 방법

Git 브랜치는 서로 독립적입니다. 따라서 한 브랜치에서 파일을 삭제해도 그 변경 사항이 다른 브랜치에는 영향을 미치지 않습니다.

그러나 한 브랜치에서 파일을 수정하고, 다른 브랜치에서 같은 파일을 삭제했다면 병합 충돌이 발생할 수 있습니다. Git 입장에서는 파일을 삭제해야 할지 수정해야 할지 판단할 수 없기 때문입니다.

예를 들어 devmaster라는 두 브랜치가 있다고 가정해 보겠습니다. dev 브랜치에서는 README.md 파일을 삭제했고, master 브랜치에서는 새로운 텍스트를 추가했습니다.

다음과 같이 git merge 명령어로 두 브랜치를 병합할 수 있습니다.

git merge dev

이 명령은 현재 브랜치(master)에 dev 브랜치를 병합합니다. 실행 결과 병합 충돌이 발생했습니다.

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

이 충돌을 해결하려면 먼저 결정을 내려야 합니다. 파일을 유지할 것인가, 아니면 삭제할 것인가? 파일을 유지하고 싶다면 git add 명령어로 파일을 다시 저장소에 추가합니다.

git add README.md

반대로 파일을 삭제하기로 했다면 git rm 명령어를 사용합니다.

git rm README.md

rm 명령어는 로컬 저장소에서 파일을 삭제합니다. 실행하기 전에 정말로 해당 파일을 삭제해도 되는지 반드시 한 번 더 확인하세요.

충돌 파일에 대한 처리를 마쳤다면 변경 사항을 커밋하고 브랜치를 병합할 수 있습니다.

git add README.md
git commit -m "feat: Add README.md to repository"
git merge dev

git add는 변경 사항을 스테이징하고, git commit은 새로운 커밋을 생성하며, git merge는 dev와 master 브랜치를 병합합니다. 병합 충돌을 해결했기 때문에 이제 브랜치가 성공적으로 병합됩니다.

파일 변경 충돌 해결 방법

개발자들은 때때로 서로 다른 두 브랜치에서 같은 파일을 수정하기도 합니다. 이 경우 Git은 병합 시 어떤 변경 사항을 유지해야 할지 스스로 판단할 수 없으며, 그 결과 병합 충돌이 발생합니다.

master와 dev라는 두 브랜치가 있는 저장소에서 양쪽 브랜치 모두 README.md 파일을 수정했다고 가정해 보겠습니다. 병합을 시도하면 다음과 같은 충돌이 발생합니다.

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

병합 충돌 해결의 첫 번째 단계는 원인을 파악하는 것입니다. git status 명령어를 사용하면 충돌 상태를 확인할 수 있습니다.

On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

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

    both modified:   README.md

이 메시지를 통해 README.md 파일이 두 브랜치 모두에서 수정되었음을 확인할 수 있습니다. 이제 텍스트 편집기로 README.md 파일을 열어 보겠습니다.

This is a README.md file.
This is in a repository called merge-conflicts.
<<<<<<< HEAD
This file is on the main branch.
=======
This file is on the dev branch.
>>>>>>> dev

Git은 병합 충돌이 존재함을 알려주기 위해 파일에 충돌 마커(conflict marker)를 추가합니다. Git은 부등호와 등호 문자를 사용해 충돌 위치를 표현합니다.

  • 작은 부등호(<): 현재 브랜치(HEAD)에서 이루어진 변경 사항의 시작을 표시
  • 등호(=): 두 변경 사항을 구분하는 경계선 역할
  • 큰 부등호(>): 병합하려는 대상 브랜치에서 이루어진 변경 사항의 끝을 표시

위 예시의 경우 다음과 같이 해석할 수 있습니다.

  • "This file is on the main branch." → master 브랜치(HEAD)의 내용
  • "This file is on the dev branch." → dev 브랜치의 내용

이 병합 충돌을 해결하는 방법은 생각보다 간단합니다. 원하지 않는 텍스트와 충돌 마커를 모두 삭제하면 됩니다. 예를 들어 최종 코드가 "This file is on a branch."라고 표시되기를 원한다면 다음과 같이 수정할 수 있습니다.

This is a README.md file.
This is in a repository called merge-conflicts.
This file is on a branch.

수정을 마쳤다면 최종 병합을 진행할 준비가 된 것입니다. 변경 사항을 스테이징하고, 커밋한 후, dev와 master 브랜치를 병합합니다.

git add .
git commit -m "feat: Resolve merge conflict."
git merge dev

병합 충돌을 해결했으므로 이제 코드가 성공적으로 병합됩니다.

마무리

병합 충돌은 두 브랜치에서 같은 줄의 텍스트를 수정하거나, 한 브랜치에서 파일을 수정하고 다른 브랜치에서 그 파일을 삭제할 때 발생합니다.

이 가이드에서는 두 가지 경우 모두에 대해 병합 충돌을 진단하고 해결하는 방법을 살펴보았습니다. 핵심은 git status로 충돌 원인을 파악하고, 충돌 마커가 표시된 파일을 직접 편집한 뒤, 변경 사항을 커밋하는 것입니다. 이제 여러분도 Git 전문가처럼 병합 충돌을 능숙하게 처리할 수 있을 것입니다.