병합 충돌
병합 충돌은 병합 요청의 두 브랜치(소스 및 타깃) 각각이 다른 변경 사항을 가지고 있을 때 발생합니다. 어떤 변경 사항을 받아들일지 결정해야 합니다. 병합 요청에서 Git은 파일의 두 버전을 라인 단위로 비교합니다. 대부분의 경우, GitLab은 변경 사항을 함께 병합할 수 있습니다. 그러나 두 브랜치가 동일한 라인을 변경하는 경우, GitLab은 병합을 막고 어떤 변경 사항을 유지할지 선택해야 합니다:
충돌이 있는 병합 요청은 아래 중 하나를 수행하기 전까지는 병합할 수 없습니다:
- 병합 커밋 생성.
- 리베이스를 통해 충돌 해결.
GitLab은 충돌을 해결하기 위해 소스 브랜치에 병합 커밋을 생성하지만 타깃 브랜치로 병합은 수행하지 않습니다. 그런 후에 병합 커밋을 검토하고 테스트할 수 있습니다. 의도하지 않은 변경사항이 없는지 확인하고 빌드를 망가뜨리지 않는지 확인하세요.
충돌 블록 이해
Git이 결정이 필요한 충돌을 감지하면 충돌 블록의 시작과 끝을 충돌 표시로 표시합니다:
-
<<<<<<< HEAD
는 충돌 블록의 시작을 표시합니다. - 여러분의 변경 사항이 표시됩니다.
-
=======
는 여러분의 변경사항의 끝을 표시합니다. - 타깃 브랜치의 최근 변경사항이 표시됩니다.
-
>>>>>>>
는 충돌의 끝을 표시합니다.
충돌을 해결할 때, 다음을 삭제합니다:
- 유지하고 싶지 않은 충돌된 라인의 버전.
- 충돌 표시의 버전(시작, 끝 및 두 버전 사이의
=======
줄).
사용자 인터페이스에서 해결할 수 있는 충돌
병합 충돌이 아래의 모든 조건을 충족하면 GitLab 사용자 인터페이스에서 병합 충돌을 해결할 수 있습니다:
- 파일이 텍스트이고 이진이 아닙니다.
- 파일이 UTF-8 호환 인코딩입니다.
- 파일에 이미 충돌 표시가 포함되지 않습니다.
- 충돌 표시가 추가된 파일이 200 KB 미만입니다.
- 파일이 두 브랜치 모두 같은 경로에 있습니다.
병합 요청의 파일 중 어떤 파일이 충돌을 포함하더라도 이러한 기준을 충족하지 못하면 충돌을 수동으로 해결해야 합니다.
충돌 해결 방법
GitLab에서 해결 가능한 충돌을 사용자 인터페이스에서 확인하고 명령줄로도 충돌을 해결할 수 있습니다:
- 대화형 모드: 편집 없이 라인의 버전을 선택하기만 하면 되는 충돌에 대한 최적의 UI 방법입니다.
- 인라인 편집기: 라인을 직접 편집하고 변경사항을 수동으로 혼합해야 하는 복잡한 충돌에 대한 최적의 UI 방법입니다.
- 명령줄: 가장 복잡한 충돌에 대해 완전한 제어를 제공합니다.
대화형 모드에서
GitLab 사용자 인터페이스에서 덜 복잡한 충돌을 해결하기 위해:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾으세요.
- Code > 병합 요청을 선택하고 병합 요청을 찾으세요.
- 개요를 선택하고 병합 요청 보고서 섹션까지 스크롤하세요.
-
충돌 메시지를 찾고 충돌 해결을 선택하세요. GitLab은 충돌이 있는 파일 목록을 표시합니다. 충돌하는 라인은 강조 표시됩니다:
- 각 충돌에 대해 저희 버전 사용 또는 그들의 버전 사용을 선택하여 받아들일 충돌 버전을 표시합니다. 이 결정은 “충돌 해결”이라고 합니다.
- 모든 충돌을 해결한 후에 커밋 메시지를 입력하세요.
- 소스 브랜치에 커밋을 선택하세요.
충돌 해결은 병합 요청의 타깃 브랜치를 소스 브랜치로 병합하여 여러분이 선택한 텍스트 버전을 사용합니다. 소스 브랜치가 feature
이고 타깃 브랜치가 main
인 경우, 이러한 작업은 로컬에서 git switch feature; git merge main
을 실행하는 것과 유사합니다.
인라인 편집기에서
일부 병합 충돌은 더 복잡하며, 수동으로 라인을 편집해야 해결할 수 있습니다. 병합 충돌 해결 편집기에서는 GitLab 인터페이스에서 이러한 복잡한 충돌을 해결하는 데 도움이 됩니다:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾으세요.
- Code > 병합 요청을 선택하고 병합 요청을 찾으세요.
- 개요를 선택하고 병합 요청 보고서 섹션까지 스크롤하세요.
- 충돌 메시지를 찾고 충돌 해결을 선택하세요. GitLab은 충돌이 있는 파일 목록을 표시합니다.
- 수동으로 편집할 파일을 찾고 충돌 블록까지 스크롤하세요.
-
해당 파일의 헤더에서 인라인으로 편집을 선택하여 편집기를 엽니다. 이 예시에서 충돌 블록은 1350행에서 시작하여 1356행에 끝납니다:
- 충돌을 해결한 후에 커밋 메시지를 입력하세요.
- 소스 브랜치에 커밋을 선택하세요.
명령줄에서
대부분의 충돌은 GitLab 사용자 인터페이스를 통해 해결할 수 있지만, 일부 충돌은 너무 복잡하여 가장 복잡한 변경에 대해 가장 많은 제어를 제공하기 위해 명령줄에서 로컬로 수정하는 것이 더 좋습니다.
전제 조건:
- 브랜치에 강제 푸시할 수 있는 권한이 있어야 합니다.
-
터미널을 열고 기능 브랜치를 확인하세요. 예:
my-feature-branch
:git switch my-feature-branch
-
(여기서
main
) 대상 브랜치에 대해 브랜치 다시설정을 수행하여 Git이 충돌을 알려주도록 하세요:git fetch git rebase origin/main
- 선호하는 코드 편집기에서 충돌하는 파일을 열어보세요.
- 충돌 블록을 찾으세요.
- 파일을 편집하세요:
- 유지할 버전(
=======
이전 또는 이후)을 선택하세요. - 유지하지 않을 버전을 삭제하세요.
- 충돌 표시를 삭제하세요.
- 유지할 버전(
- 파일을 저장하세요.
- 각 파일에 대해 위의 프로세스를 반복하세요.
-
Git에서 변경 사항을 스테이징하세요:
git add .
-
변경 사항을 커밋하세요:
git commit -m "병합 충돌 해결"
-
다시설정을 계속하세요:
git rebase --continue
경고: 여기까지 진행했다면,
git rebase --abort
를 실행하여 프로세스를 중지할 수 있습니다. Git은 재설정을 중단하고git rebase
를 실행하기 전 상태로 브랜치를 롤백합니다.git rebase --continue
를 실행한 후에는 재설정을 중지할 수 없습니다. - 변경 사항을 원격 브랜치에 강제 푸시하세요.