병합 방법

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

프로젝트에 선택한 병합 방법은 병합 요청의 변경 사항이 기존 브랜치에 어떻게 병합되는지를 결정합니다.

이 페이지의 예제는 커밋 A, C, E가 있는 main 브랜치와 커밋 B, D가 있는 feature 브랜치를 가정합니다:

%%{init: { "fontFamily": "GitLab Sans" }}%% gitGraph accTitle: 병합 다이어그램 accDescr: 두 브랜치에서 다섯 개의 커밋을 보여주는 Git 그래프, 이 페이지의 다른 그래프에서 확장됩니다. commit id: "A" branch feature commit id: "B" commit id: "D" checkout main commit id: "C" commit id: "E"

프로젝트의 병합 방법 구성

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.

  2. 설정 > 병합 요청을 선택합니다.

  3. 다음 옵션 중에서 원하는 병합 방법을 선택합니다:
    • 병합 커밋
    • 반 직선 히스토리를 가진 병합 커밋
    • 빨리 감기 병합
  4. 병합 시 커밋 압축에서 커밋 처리에 대한 기본 동작을 선택합니다:
    • 허용하지 않음: 압축이 수행되지 않으며, 사용자는 동작을 변경할 수 없습니다.
    • 허용: 기본적으로 압축이 꺼져 있지만, 사용자가 동작을 변경할 수 있습니다.
    • 권장: 기본적으로 압축이 켜져 있지만, 사용자가 동작을 변경할 수 있습니다.
    • 필수: 항상 압축이 수행되며, 사용자는 동작을 변경할 수 없습니다.
  5. 변경 사항 저장을 선택합니다.

병합 커밋

기본적으로 GitLab은 브랜치가 main에 병합될 때 병합 커밋을 생성합니다.
커밋이 병합 시 압축되었는지 여부에 관계없이 항상 별도의 병합 커밋이 생성됩니다.
이 전략은 main 브랜치에 압축 커밋과 병합 커밋이 모두 추가될 수 있습니다.

이 다이어그램은 feature 브랜치가 병합 커밋 전략을 사용할 때 main에 어떻게 병합되는지를 보여줍니다.
이것은 git merge --no-ff <feature> 명령과 동일하며, GitLab UI에서 병합 방법으로 Merge commit을 선택하는 것과 같습니다:

  • 기능 브랜치가 병합 커밋 방법으로 병합된 후, main 브랜치는 다음과 같이 보입니다:

    %%{init: { 'gitGraph': {'logLevel': 'debug', 'showBranches': true, 'showCommitLabel':true,'mainBranchName': 'main', 'fontFamily': 'GitLab Sans'}} }%% gitGraph accTitle: 병합 커밋 다이어그램 accDescr: 기능 브랜치가 병합될 때 GitLab에서 병합 커밋이 생성되는 방법을 보여주는 Git 그래프. commit id: "A" branch feature commit id: "B" commit id: "D" checkout main commit id: "C" commit id: "E" merge feature
  • 반면에 압축 병합feature 브랜치의 모든 커밋에 대한 가상의 복사본인 압축 커밋을 생성합니다.
    원래 커밋(B 및 D)은 feature 브랜치에서 변경되지 않으며, 병합된 압축 브랜치를 병합하기 위해 main 브랜치에 병합 커밋이 생성됩니다:

    %%{init: { 'gitGraph': {'showBranches': true, 'showCommitLabel':true,'mainBranchName': 'main', 'fontFamily': 'GitLab Sans'}} }%% gitGraph accTitle: 압축 병합 다이어그램 accDescr: 압축 커밋이 메인 브랜치에 추가된 후의 저장소 및 브랜치 구조를 보여주는 Git 그래프. commit id:"A" branch feature checkout main commit id:"C" checkout feature commit id:"B" commit id:"D" checkout main commit id:"E" branch "B+D" commit id: "B+D" checkout main merge "B+D"

압축 병합 그래프는 GitLab UI에서 다음 설정과 동등합니다:

  • 병합 방법: 병합 커밋.
  • 병합 시 커밋 압축은 다음 중 하나로 설정되어야 합니다:
    • 필수.
    • 허용 또는 권장 중 하나이며, 병합 요청에서 압축이 선택되어야 합니다.

압축 병합 그래프는 또한 다음 명령과 동등합니다:

  git checkout `git merge-base feature main`
  git merge --squash feature
  git commit --no-edit
  SOURCE_SHA=`git rev-parse HEAD`
  git checkout main
  git merge --no-ff $SOURCE_SHA

반선형 히스토리를 가진 병합 커밋

병합 시마다 병합 커밋이 생성되지만, 빠른 병합(빠른 전달)이 가능할 경우에만 브랜치가 병합됩니다.

이는 병합 요청 빌드가 성공했을 때, 병합 후에도 대상 브랜치 빌드가 성공하는 것을 보장합니다.

이 병합 방법을 사용하여 생성된 커밋 그래프 예시:

%%{init: { "fontFamily": "GitLab Sans" }}%% gitGraph accTitle: 병합 커밋 다이어그램 accDescr: 브랜치가 병합 커밋과 병합될 때의 커밋 흐름을 보여줍니다. commit id: "Init" branch mr-branch-1 commit commit checkout main merge mr-branch-1 branch mr-branch-2 commit commit checkout main merge mr-branch-2 commit branch squash-mr commit id: "Squashed commits" checkout main merge squash-mr

반선형 히스토리를 가진 병합 커밋 방법이 선택된 병합 요청 페이지를 방문할 때, 빠른 병합이 가능한 경우에만 수락할 수 있습니다.

빠른 병합이 불가능한 경우, 사용자는 리베이스를 선택할 수 있으며, 리베이스에 대한 정보를 참조하시기 바랍니다.

이 방법은 병합 커밋 방법과 동일한 Git 명령과 같습니다. 그러나, 소스 브랜치가 대상 브랜치(예: main)의 구버전을 기반으로 하는 경우, 소스 브랜치를 리베이스해야 합니다.

이 병합 방법은 깔끔한 커밋 이력을 생성하면서도 모든 브랜치가 어디서 시작되고 병합되었는지를 확인할 수 있게 해줍니다.

빠른 병합

때때로 워크플로우 정책에 따라 병합 커밋 없이 깔끔한 커밋 이력이 요구될 수 있습니다. 이러한 경우, 빠른 병합이 적합합니다.

빠른 병합 요청을 통해, 병합 커밋을 생성하지 않고도 선형 Git 이력을 유지하고 병합 요청을 수락할 수 있습니다. 이 병합 방법을 사용하여 생성된 커밋 그래프 예시:

%%{init: { "fontFamily": "GitLab Sans" }}%% gitGraph accTitle: 빠른 병합 다이어그램 accDescr: 빠른 병합 요청이 선형 Git 이력을 유지하는 방법을 보여주지만, 병합 커밋을 추가하지 않습니다. commit id: "Init" commit id: "Merge mr-branch-1" commit id: "Merge mr-branch-2" commit id: "Commit on main" commit id: "Merge squash-mr"

이 방법은 다음과 같습니다:

  • 일반적인 병합의 경우: git merge --ff <source-branch>
  • 스쿼시 병합의 경우: git merge --squash <source-branch> 다음에 git commit

빠른 병합을 위한 설정(--ff-only)이 활성화되면, 병합 커밋이 만들어지지 않고 모든 병합이 빠른 병합으로 진행됩니다.

브랜치를 빠른 병합할 수 있을 경우에만 병합이 허용됩니다. 빠른 병합이 불가능한 경우, 사용자는 리베이스를 선택할 수 있으며, 리베이스에 대한 정보를 참조하시기 바랍니다.

빠른 병합 방법이 선택된 병합 요청 페이지를 방문할 때, 빠른 병합이 가능한 경우에만 수락할 수 있습니다.

(반)선형 병합 방법에서의 리베이스

이러한 병합 방법에서는 소스 브랜치가 대상 브랜치와 최신 상태인 경우에만 병합할 수 있습니다:

  • 반선형 히스토리를 가진 병합 커밋.
  • 빠른 병합.

빠른 병합이 불가능하지만 충돌 없는 리베이스가 가능한 경우, GitLab은 다음을 제공합니다:

소스 브랜치를 빠른 병합하기 전에, 다음 두 조건이 모두 참일 경우 소스 브랜치를 로컬에서 리베이스해야 합니다:

  • 대상 브랜치가 소스 브랜치보다 앞서 있습니다.
  • 충돌 없는 리베이스가 불가능합니다.

스쿼시 이전에 리베이스가 필요할 수 있으며, 스쿼시는 자체적으로도 리베이스와 동등한 것으로 간주될 수 있습니다.

CI/CD 파이프라인 없이 리베이스

  • GitLab 15.3에서 일반 가용성으로 변경됨. 기능 플래그 rebase_without_ci_ui가 제거되었습니다.

CI/CD 파이프라인을 트리거하지 않고 병합 요청의 브랜치를 리베이스하려면, 병합 요청 보고서 섹션에서 파이프라인 없이 리베이스를 선택하세요.

이 옵션은:

  • 패스트-포워드 병합이 불가능하지만 충돌 없는 리베이스가 가능한 경우에 사용할 수 있습니다.

  • 파이프라인이 성공해야 함 옵션이 활성화된 경우 사용할 수 없습니다.

CI/CD 파이프라인 없이 리베이스하면 자원이 절약되어, 빈번한 리베이스가 필요한 반선형 워크플로우를 가진 프로젝트에 유리합니다.

관련 주제