병합 방법
프로젝트에 선택한 병합 방법은 병합 요청의 변경 사항이 기존 브랜치에 어떻게 병합되는지를 결정합니다.
이 페이지의 예제는 커밋 A, C, E가 있는 main
브랜치와 커밋 B, D가 있는 feature
브랜치를 가정합니다:
프로젝트의 병합 방법 구성
-
왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
-
설정 > 병합 요청을 선택합니다.
- 다음 옵션 중에서 원하는 병합 방법을 선택합니다:
- 병합 커밋
- 반 직선 히스토리를 가진 병합 커밋
- 빨리 감기 병합
-
병합 시 커밋 압축에서 커밋 처리에 대한 기본 동작을 선택합니다:
- 허용하지 않음: 압축이 수행되지 않으며, 사용자는 동작을 변경할 수 없습니다.
- 허용: 기본적으로 압축이 꺼져 있지만, 사용자가 동작을 변경할 수 있습니다.
- 권장: 기본적으로 압축이 켜져 있지만, 사용자가 동작을 변경할 수 있습니다.
- 필수: 항상 압축이 수행되며, 사용자는 동작을 변경할 수 없습니다.
- 변경 사항 저장을 선택합니다.
병합 커밋
기본적으로 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
반선형 히스토리를 가진 병합 커밋
병합 시마다 병합 커밋이 생성되지만, 빠른 병합(빠른 전달)이 가능할 경우에만 브랜치가 병합됩니다.
이는 병합 요청 빌드가 성공했을 때, 병합 후에도 대상 브랜치 빌드가 성공하는 것을 보장합니다.
이 병합 방법을 사용하여 생성된 커밋 그래프 예시:
반선형 히스토리를 가진 병합 커밋
방법이 선택된 병합 요청 페이지를 방문할 때, 빠른 병합이 가능한 경우에만 수락할 수 있습니다.
빠른 병합이 불가능한 경우, 사용자는 리베이스를 선택할 수 있으며, 리베이스에 대한 정보를 참조하시기 바랍니다.
이 방법은 병합 커밋 방법과 동일한 Git 명령과 같습니다. 그러나, 소스 브랜치가 대상 브랜치(예: main
)의 구버전을 기반으로 하는 경우, 소스 브랜치를 리베이스해야 합니다.
이 병합 방법은 깔끔한 커밋 이력을 생성하면서도 모든 브랜치가 어디서 시작되고 병합되었는지를 확인할 수 있게 해줍니다.
빠른 병합
때때로 워크플로우 정책에 따라 병합 커밋 없이 깔끔한 커밋 이력이 요구될 수 있습니다. 이러한 경우, 빠른 병합이 적합합니다.
빠른 병합 요청을 통해, 병합 커밋을 생성하지 않고도 선형 Git 이력을 유지하고 병합 요청을 수락할 수 있습니다. 이 병합 방법을 사용하여 생성된 커밋 그래프 예시:
이 방법은 다음과 같습니다:
- 일반적인 병합의 경우:
git merge --ff <source-branch>
- 스쿼시 병합의 경우:
git merge --squash <source-branch>
다음에git commit
빠른 병합을 위한 설정(--ff-only
)이 활성화되면, 병합 커밋이 만들어지지 않고 모든 병합이 빠른 병합으로 진행됩니다.
브랜치를 빠른 병합할 수 있을 경우에만 병합이 허용됩니다. 빠른 병합이 불가능한 경우, 사용자는 리베이스를 선택할 수 있으며, 리베이스에 대한 정보를 참조하시기 바랍니다.
빠른 병합
방법이 선택된 병합 요청 페이지를 방문할 때, 빠른 병합이 가능한 경우에만 수락할 수 있습니다.
(반)선형 병합 방법에서의 리베이스
이러한 병합 방법에서는 소스 브랜치가 대상 브랜치와 최신 상태인 경우에만 병합할 수 있습니다:
- 반선형 히스토리를 가진 병합 커밋.
- 빠른 병합.
빠른 병합이 불가능하지만 충돌 없는 리베이스가 가능한 경우, GitLab은 다음을 제공합니다:
-
/rebase
퀵 액션. - 사용자 인터페이스에서 리베이스 선택 옵션.
소스 브랜치를 빠른 병합하기 전에, 다음 두 조건이 모두 참일 경우 소스 브랜치를 로컬에서 리베이스해야 합니다:
- 대상 브랜치가 소스 브랜치보다 앞서 있습니다.
- 충돌 없는 리베이스가 불가능합니다.
스쿼시 이전에 리베이스가 필요할 수 있으며, 스쿼시는 자체적으로도 리베이스와 동등한 것으로 간주될 수 있습니다.
CI/CD 파이프라인 없이 리베이스
- GitLab 15.3에서 일반 가용성으로 변경됨. 기능 플래그
rebase_without_ci_ui
가 제거되었습니다.
CI/CD 파이프라인을 트리거하지 않고 병합 요청의 브랜치를 리베이스하려면, 병합 요청 보고서 섹션에서 파이프라인 없이 리베이스를 선택하세요.
이 옵션은:
-
패스트-포워드 병합이 불가능하지만 충돌 없는 리베이스가 가능한 경우에 사용할 수 있습니다.
-
파이프라인이 성공해야 함 옵션이 활성화된 경우 사용할 수 없습니다.
CI/CD 파이프라인 없이 리베이스하면 자원이 절약되어, 빈번한 리베이스가 필요한 반선형 워크플로우를 가진 프로젝트에 유리합니다.