병합 충돌 해결

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Visual Studio 2019 | Visual Studio 2022

병합하거나 다시 기반으로 하는 경우 한 분기의 변경 내용을 다른 분기의 변경 내용과 통합하도록 Git에 알려야 합니다. Git에서 사용자의 도움 없이 병합을 완료하거나 자동으로 다시베이스하는 경우가 많습니다. 그러나 Git에서 한 분기의 변경 내용이 다른 분기의 변경 내용과 충돌하는 것을 발견하면 충돌을 해결하라는 메시지가 표시됩니다. 병합된 분기가 동일한 파일 줄을 다르게 편집하거나 한 분기가 파일을 수정하고 다른 분기에서 파일을 삭제할 때 병합 충돌 발생할 수 있습니다. 병합 충돌 확인하는 프로세스는 Git 병합 및 다시베이스 모두에 적용할 수 있습니다.

Visual Studio에서 또는 명령줄 및 텍스트 편집기를 사용하여 병합 충돌 해결할 수 있습니다.

Git 워크플로에 대한 개요는 Azure Repos Git 자습서를 참조하세요.

이 문서에서는 다음 작업에 대한 절차를 제공합니다.

  • 병합 충돌의 이해
  • 병합 충돌 해결

병합 충돌의 이해

Git 병합 또는 다시베이스는 원본 분기의 커밋을 현재 로컬 분기(대상 분기)에 통합합니다. Git 병합은 빠른 전달 또는 빠른 전달 없는 병합을 수행합니다. 빠른 전달 없는 병합을 3방향 병합 또는 true 병합이라고도 합니다. Git rebase 는 병합의 또 다른 유형입니다. 이러한 병합 형식은 다음 다이어그램에 나와 있습니다.

Git 병합 및 Git 리베이스를 사용할 때 커밋 전후를 보여 주는 다이어그램.

Git 병합의 경우 대상 분기의 팁이 원본 분기 내에 있는 경우 기본 병합 형식은 빠른 전달 병합이 됩니다. 그렇지 않으면 기본 병합 형식은 빠른 전달 없는 병합이 됩니다.

대상 분기의 팁이 원본 분기에서 분기된 경우 Git에서 빠른 전달 병합을 적용하지 않으므로 빠른 전달 병합에는 병합 충돌 수 없습니다. 기본적으로 Git은 가능하면 빠른 전달 병합을 사용합니다. 예를 들어 Git은 원격 대응 분기에서 끌어서 업데이트하는 로컬 분기에 빠른 전달 병합을 적용합니다.

빠른 전달 없는 병합은 원본 분기 변경 내용을 대상 분기 변경 내용과 통합하는 새 대상 분기 "병합 커밋"을 생성합니다. 적용 가능한 변경 내용은 두 분기 모두에 공통적인 마지막 커밋 후에 적용된 변경 내용입니다. 위의 다이어그램에서 커밋 C는 두 분기에서 마지막으로 공통된 커밋입니다. 원본 분기 변경 내용이 대상 분기 변경과 충돌하는 경우 Git에서 병합 충돌 해결하라는 메시지를 표시합니다. 병합 커밋(L)에는 통합된 원본 분기 및 대상 분기 변경 내용이 포함됩니다. 원본 및 대상 분기 팁(K 및 E)은 병합 커밋의 부모입니다. 분기의 커밋 기록에서 병합 커밋은 병합 작업에 유용한 표식이며 병합된 분기를 명확하게 표시합니다.

Git 은 대상 분기의 커밋 기록을 다시 지정 하여 모든 원본 분기 커밋을 포함하고 마지막 공통 커밋 이후 모든 대상 분기 커밋을 포함합니다. 위의 다이어그램에서 커밋 C는 두 분기에서 마지막으로 공통된 커밋입니다. 이를 보는 또 다른 방법은 다시베이스가 원본 분기 기록 위에 있는 대상 분기의 변경 내용을 재생하는 것입니다. 원본 분기 변경 내용이 대상 분기 변경과 충돌하는 경우 Git에서 병합 충돌 해결하라는 메시지를 표시합니다. 빠른 전달 병합과 마찬가지로 재베이스는 병합 커밋을 만들지 않습니다. 특히 재베이스는 기존 대상 분기 커밋의 시퀀스를 변경합니다. 이는 다른 병합 전략의 경우와는 다른 경우입니다. 위의 다이어그램에서 commit K'는 K와 동일한 변경 내용을 포함하지만 C 대신 다시 커밋 E에 연결되므로 새 커밋 ID 있습니다.

Git 병합 및 다시베이스는 대상 분기(원본 분기가 변경되지 않은 기본 수정)만 수정합니다. 하나 이상의 병합 충돌 발생하면 병합을 완료하거나 다시베이스하도록 해결해야 합니다. 또는 병합/다시베이스 작업을 취소하고 대상 분기를 이전 상태로 반환할 수 있습니다.

병합 옵션 및 전략에 대한 자세한 내용은 Git 참조 설명서Git 병합 전략을 참조하세요.

병합 충돌 해결하는 경우

Git 병합 및 Git 리베이스는 Git 워크플로에서 광범위하게 사용됩니다. 로컬 기능 또는 버그픽스 분기에서 작업하는 경우 다음을 수행하는 것이 일반적입니다.

  1. 원격 커밋을 가져오고 병합하기 위해 주기적으로 끌어와서 로컬 main 분기를 해당 원격 분기와 최신 상태로 유지합니다.
  2. 리베이스 또는 병합을 사용하여 로컬 main 기능 분기 로컬 분기 업데이트를 통합합니다.
  3. 해당 원격 분기에 푸시하여 로컬 기능 분기 작업을 백업합니다.
  4. 기능이 완료되면 원격 기능 분기 원격 main 분기에 병합하는 끌어오기 요청을 만듭니다.

원격 변경 내용을 로컬 리포지토리에 자주 통합하면 다른 사용자의 최근 작업을 파악하고 발생하는 병합 충돌 즉시 해결할 수 있습니다.

병합 충돌 해결

병합 충돌 확인하는 프로세스는 Git 병합 및 Git 리베이스 모두에 적용할 수 있습니다. 다음 단계에서는 병합 중에 병합 충돌 해결하는 방법을 설명하지만, 재베이스 중에 병합 충돌 마찬가지로 해결할 수 있습니다.

원본 분기가 원격 추적 분기인 경우 병합 전에 Git 인출 을 실행하여 분기가 최신 상태인지 확인합니다. 또는 Git 가져오기를 Git 병합과 결합하는 Git 끌어오 기 명령을 실행합니다.

Visual Studio 2022는 Git 메뉴, Git 변경 내용 및 솔루션 탐색기 상황에 맞는 메뉴를 사용하여 Git 버전 제어 환경을 제공합니다. Visual Studio 2019 버전 16.8은 팀 탐색기 Git 사용자 인터페이스도 제공합니다. 자세한 내용은 Visual Studio 2019 - 팀 탐색기 탭을 참조하세요.

  1. Git 리포지토리 창의 분기 창에서 대상 분기 전체에서 검사. 그런 다음 원본 분기를 마우스 오른쪽 단추로 클릭하고 원본 분기를 대상 분기>>로 <병합<을 선택합니다.

    Visual Studio의 Git 리포지토리 창에 있는 분기 상황에 맞는 메뉴의 병합 옵션 스크린샷

  2. Visual Studio는 Git이 충돌로 인해 병합을 중지했는지 알려 줍니다. 이 경우 충돌을 해결하거나 병합을 취소하고 병합 전 상태로 돌아갈 수 있습니다. Git 변경 내용 창의 변경되지 않은 변경 내용 섹션에는 병합 충돌 파일이 나열됩니다. 콘텐츠에 병합 충돌 있는 파일의 경우 파일을 두 번 클릭하여 병합 편집기에서 엽니다.

    Visual Studio의 Git 변경 내용 창에 병합 충돌 있는 파일의 스크린샷

  3. 병합 편집기 에서 들어오는 창에 원본 분기 파일 버전이 표시되고, 현재 창에 대상 분기 파일 버전이 표시되고 , 결과 창에 결과 병합 파일이 표시됩니다. 특정 원본 또는 대상 분기 변경 내용을 적용하려면 유지하려는 충돌하는 줄 옆에 있는 검사 상자를 선택합니다. 결과 창에서 병합 파일을 직접 편집할 수도 있습니다. 현재 파일의 모든 병합 충돌 확인한 후 병합 수락을 선택합니다. 콘텐츠 충돌이 있는 각 파일에 대해 이 단계를 반복합니다.

    Visual Studio의 병합 편집기 스크린샷

  4. 한 분기에서 편집되고 다른 분기에서 삭제된 파일의 경우 파일을 마우스 오른쪽 단추로 클릭하고 원하는 분기 작업을 선택합니다.

    Visual Studio의 Git 변경 내용 창에서 충돌하는 파일에 대한 상황에 맞는 메뉴의 스크린샷

  5. Git 변경 내용 창에서 커밋 메시지 입력하고 스테이징된 커밋을 선택하여 모든 파일에 대한 모든 병합 충돌 확인한 후 병합을 완료합니다.

    Visual Studio의 Git 변경 내용 창에 있는 커밋 메시지 및 커밋 스테이징 단추의 스크린샷

다음 단계