병합 충돌

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

병합 충돌은 병합 요청의 두 브랜치(소스 및 타깃) 각각이 다른 변경 사항을 가지고 있을 때 발생합니다. 어떤 변경 사항을 받아들일지 결정해야 합니다. 병합 요청에서 Git은 파일의 두 버전을 라인 단위로 비교합니다. 대부분의 경우, GitLab은 변경 사항을 함께 병합할 수 있습니다. 그러나 두 브랜치가 동일한 라인을 변경하는 경우, GitLab은 병합을 막고 어떤 변경 사항을 유지할지 선택해야 합니다:

병합 충돌로 막힌 병합 요청

충돌이 있는 병합 요청은 아래 중 하나를 수행하기 전까지는 병합할 수 없습니다:

  • 병합 커밋 생성.
  • 리베이스를 통해 충돌 해결.

GitLab은 충돌을 해결하기 위해 소스 브랜치에 병합 커밋을 생성하지만 타깃 브랜치로 병합은 수행하지 않습니다. 그런 후에 병합 커밋을 검토하고 테스트할 수 있습니다. 의도하지 않은 변경사항이 없는지 확인하고 빌드를 망가뜨리지 않는지 확인하세요.

충돌 블록 이해

Git이 결정이 필요한 충돌을 감지하면 충돌 블록의 시작과 끝을 충돌 표시로 표시합니다:

  • <<<<<<< HEAD는 충돌 블록의 시작을 표시합니다.
  • 여러분의 변경 사항이 표시됩니다.
  • =======는 여러분의 변경사항의 끝을 표시합니다.
  • 타깃 브랜치의 최근 변경사항이 표시됩니다.
  • >>>>>>>는 충돌의 끝을 표시합니다.

충돌을 해결할 때, 다음을 삭제합니다:

  1. 유지하고 싶지 않은 충돌된 라인의 버전.
  2. 충돌 표시의 버전(시작, 끝 및 두 버전 사이의 ======= 줄).

사용자 인터페이스에서 해결할 수 있는 충돌

병합 충돌이 아래의 모든 조건을 충족하면 GitLab 사용자 인터페이스에서 병합 충돌을 해결할 수 있습니다:

  • 파일이 텍스트이고 이진이 아닙니다.
  • 파일이 UTF-8 호환 인코딩입니다.
  • 파일에 이미 충돌 표시가 포함되지 않습니다.
  • 충돌 표시가 추가된 파일이 200 KB 미만입니다.
  • 파일이 두 브랜치 모두 같은 경로에 있습니다.

병합 요청의 파일 중 어떤 파일이 충돌을 포함하더라도 이러한 기준을 충족하지 못하면 충돌을 수동으로 해결해야 합니다.

충돌 해결 방법

GitLab에서 해결 가능한 충돌을 사용자 인터페이스에서 확인하고 명령줄로도 충돌을 해결할 수 있습니다:

  • 대화형 모드: 편집 없이 라인의 버전을 선택하기만 하면 되는 충돌에 대한 최적의 UI 방법입니다.
  • 인라인 편집기: 라인을 직접 편집하고 변경사항을 수동으로 혼합해야 하는 복잡한 충돌에 대한 최적의 UI 방법입니다.
  • 명령줄: 가장 복잡한 충돌에 대해 완전한 제어를 제공합니다.

대화형 모드에서

GitLab 사용자 인터페이스에서 덜 복잡한 충돌을 해결하기 위해:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾으세요.
  2. Code > 병합 요청을 선택하고 병합 요청을 찾으세요.
  3. 개요를 선택하고 병합 요청 보고서 섹션까지 스크롤하세요.
  4. 충돌 메시지를 찾고 충돌 해결을 선택하세요. GitLab은 충돌이 있는 파일 목록을 표시합니다. 충돌하는 라인은 강조 표시됩니다:

    충돌 섹션

  5. 각 충돌에 대해 저희 버전 사용 또는 그들의 버전 사용을 선택하여 받아들일 충돌 버전을 표시합니다. 이 결정은 “충돌 해결”이라고 합니다.
  6. 모든 충돌을 해결한 후에 커밋 메시지를 입력하세요.
  7. 소스 브랜치에 커밋을 선택하세요.

충돌 해결은 병합 요청의 타깃 브랜치를 소스 브랜치로 병합하여 여러분이 선택한 텍스트 버전을 사용합니다. 소스 브랜치가 feature이고 타깃 브랜치가 main인 경우, 이러한 작업은 로컬에서 git switch feature; git merge main을 실행하는 것과 유사합니다.

인라인 편집기에서

일부 병합 충돌은 더 복잡하며, 수동으로 라인을 편집해야 해결할 수 있습니다. 병합 충돌 해결 편집기에서는 GitLab 인터페이스에서 이러한 복잡한 충돌을 해결하는 데 도움이 됩니다:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾으세요.
  2. Code > 병합 요청을 선택하고 병합 요청을 찾으세요.
  3. 개요를 선택하고 병합 요청 보고서 섹션까지 스크롤하세요.
  4. 충돌 메시지를 찾고 충돌 해결을 선택하세요. GitLab은 충돌이 있는 파일 목록을 표시합니다.
  5. 수동으로 편집할 파일을 찾고 충돌 블록까지 스크롤하세요.
  6. 해당 파일의 헤더에서 인라인으로 편집을 선택하여 편집기를 엽니다. 이 예시에서 충돌 블록은 1350행에서 시작하여 1356행에 끝납니다:

    병합 충돌 편집기

  7. 충돌을 해결한 후에 커밋 메시지를 입력하세요.
  8. 소스 브랜치에 커밋을 선택하세요.

명령줄에서

대부분의 충돌은 GitLab 사용자 인터페이스를 통해 해결할 수 있지만, 일부 충돌은 너무 복잡하여 가장 복잡한 변경에 대해 가장 많은 제어를 제공하기 위해 명령줄에서 로컬로 수정하는 것이 더 좋습니다.

전제 조건:

  • 브랜치에 강제 푸시할 수 있는 권한이 있어야 합니다.
  1. 터미널을 열고 기능 브랜치를 확인하세요. 예: my-feature-branch:

    git switch my-feature-branch
    
  2. (여기서 main) 대상 브랜치에 대해 브랜치 다시설정을 수행하여 Git이 충돌을 알려주도록 하세요:

    git fetch
    git rebase origin/main
    
  3. 선호하는 코드 편집기에서 충돌하는 파일을 열어보세요.
  4. 충돌 블록을 찾으세요.
  5. 파일을 편집하세요:
    1. 유지할 버전(======= 이전 또는 이후)을 선택하세요.
    2. 유지하지 않을 버전을 삭제하세요.
    3. 충돌 표시를 삭제하세요.
  6. 파일을 저장하세요.
  7. 각 파일에 대해 위의 프로세스를 반복하세요.
  8. Git에서 변경 사항을 스테이징하세요:

    git add .
    
  9. 변경 사항을 커밋하세요:

    git commit -m "병합 충돌 해결"
    
  10. 다시설정을 계속하세요:

    git rebase --continue
    

    경고: 여기까지 진행했다면, git rebase --abort를 실행하여 프로세스를 중지할 수 있습니다. Git은 재설정을 중단하고 git rebase를 실행하기 전 상태로 브랜치를 롤백합니다. git rebase --continue를 실행한 후에는 재설정을 중지할 수 없습니다.

  11. 변경 사항을 원격 브랜치에 강제 푸시하세요.

관련 주제