브랜치
브랜치는 프로젝트의 작업 트리 버전입니다. 새 프로젝트를 생성하면 GitLab은 귀하의 리포지토리에 삭제할 수 없는 기본 브랜치를 생성합니다. 기본 브랜치 설정은 프로젝트, 서브그룹, 그룹 또는 인스턴스 수준에서 구성할 수 있습니다.
프로젝트가 성장함에 따라 팀은 브랜치 네이밍 패턴을 따라 선호하는 브랜치를 계속해서 생성합니다. 각 브랜치는 개발 작업이 병렬로 수행될 수 있도록 변경 세트를 나타내며, 한 브랜치에서의 개발 작업은 다른 브랜치에 영향을 미치지 않습니다.
브랜치는 프로젝트에서 개발의 기초입니다:
- 시작하기 위해 브랜치를 생성하고 커밋을 추가합니다.
- 작업이 검토 준비가 되면 병합 요청을 생성하여 귀하의 브랜치에서 변경 사항을 병합하기를 제안하세요. 이 프로세스를 간소화하기 위해 브랜치 네이밍 패턴을 따르는 것이 좋습니다.
- 리뷰 앱을 통해 브랜치의 변경 사항을 미리 보세요.
- 브랜치의 내용이 병합되면 병합된 브랜치를 삭제하세요.
브랜치 생성
전제 조건:
- 프로젝트에 대해 최소한의 개발자 역할이 있어야 합니다.
GitLab UI에서 새 브랜치를 생성하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- Code > Branches를 선택합니다.
- 오른쪽 상단에서 새 브랜치를 선택합니다.
- 브랜치 이름을 입력합니다.
- 다음 위치에서 생성에서 귀하의 브랜치의 기반이 되는 것을 선택합니다: 기존 브랜치, 기존 태그 또는 커밋 SHA.
- 브랜치 생성을 선택합니다.
빈 프로젝트에서
빈 프로젝트는 브랜치를 포함하고 있지 않지만, 브랜치를 추가할 수 있습니다.
전제 조건:
- 프로젝트에 대해 최소한의 개발자 역할이 있어야 합니다.
- 유지자 또는 소유자 역할이 아닌 경우, 기본 브랜치 보호가
기본 브랜치에 커밋을 푸시할 수 있도록
부분적으로 보호함
또는보호하지 않음
으로 설정되어 있어야 합니다.
빈 프로젝트에 기본 브랜치를 추가하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- 이 프로젝트의 저장소는 비어 있습니다로 스크롤하고 추가할 파일 유형을 선택합니다.
- 웹 IDE에서 이 파일을 원하는 대로 편집한 다음 커밋 생성을 선택합니다.
- 커밋 메시지를 입력하고 커밋을 선택합니다.
GitLab은 기본 브랜치를 생성하고 파일을 추가합니다.
이슈에서
전제 조건:
- 프로젝트에 대해 최소한의 개발자 역할이 있어야 합니다.
이슈를 보는 중에 해당 페이지에서 직접 연관된 브랜치를 생성할 수 있습니다. 이렇게 생성된 브랜치는 변수를 포함한 이슈로부터 브랜치 이름의 기본 패턴을 사용합니다.
전제 조건:
- 프로젝트에 대해 최소한의 개발자 역할이 있어야 합니다.
이슈에서 브랜치를 생성하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- Plan > 이슈를 선택하고 귀하의 이슈를 찾습니다.
- 이슈 설명 아래에서 병합 요청 생성 드롭다운 목록을 찾아 을 선택하여 드롭다운 목록을 표시합니다.
- 브랜치 생성을 선택합니다. 프로젝트의 기본 브랜치를 기반으로 하는 기본 브랜치 이름이 제공됩니다. 원하는 경우 다른 브랜치 이름을 입력합니다.
- 프로젝트의 기본 브랜치를 기반으로 브랜치를 생성하려면 브랜치 생성을 선택합니다.
브랜치 관리 및 보호
GitLab은 개별 브랜치를 보호하는 여러 가지 방법을 제공합니다. 이러한 방법은 브랜치가 생성되어 삭제될 때까지 감시 및 품질 체크를 받도록 보장합니다:
- 프로젝트의 기본 브랜치는 추가로 보호를 받습니다.
- 보호된 브랜치를 구성하여 누가 브랜치에 커밋할 수 있고, 다른 브랜치를 병합할 수 있으며, 브랜치 자체를 다른 브랜치에 병합할 수 있는지를 제한할 수 있습니다.
- 승인 규칙을 구성하여 브랜치가 병합되기 전에 보안 관련 승인을 포함한 리뷰 요구 사항을 설정할 수 있습니다.
- 제3자 상태 확인을 통합하여 브랜치 내용이 품질 기준을 충족하는지 확인할 수 있습니다.
브랜치를 관리할 수 있습니다: - GitLab 사용자 인터페이스로. - 명령줄에서 Git을 사용하여. - 브랜치 API를 통해.
브랜치 모두 보기
GitLab 사용자 인터페이스에서 브랜치를 보고 관리하려면 다음을 수행하세요.
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- Code > Branches를 선택합니다.
이 페이지에서 다음을 수행할 수 있습니다:
-
모든 브랜치 보기 또는 활성 또는 유효하지 않은 브랜치만 필터링하기.
커밋이 마지막 3개월 이내에 이루어진 경우 브랜치가 활성으로 간주됩니다. 그렇지 않으면 유효하지 않은 것으로 간주됩니다.
- 새 브랜치 생성하기.
- 브랜치 비교.
- 병합된 브랜치 삭제하기.
구성된 보호가 있는 브랜치 보기
-
Introduced in GitLab 15.1 with a flag named
branch_rules
. Disabled by default. - Enabled on GitLab.com in GitLab 15.10.
- Enabled on self-managed in GitLab 15.11.
branch_rules
를 비활성화할 수 있습니다.
GitLab.com 및 전용 GitLab에서는이 기능을 사용할 수 있습니다.저장소의 브랜치는 여러 가지 방법으로 보호될 수 있습니다. 다음을 수행할 수 있습니다:
- 누가 브랜치로 푸시할 수 있는지 제한하기.
- 누가 브랜치를 병합할 수 있는지 제한하기.
- 모든 변경의 승인을 요구하기.
- 외부 테스트 통과를 요구하기.
브랜치 규칙 요약 페이지에는 구성된 보호가 있는 모든 브랜치와 그 보호 방법이 표시됩니다:
필수 조건:
- 프로젝트에 대한 최소한의 Maintainer 역할이 있어야 합니다.
브랜치 규칙 개요 목록을 보려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- 설정 > 저장소를 선택합니다.
- 브랜치 규칙을 확장하여 보호가 있는 모든 브랜치를 볼 수 있습니다.
브랜치 이름 지정
Git은 브랜치 이름 규칙을 강제하여 브랜치 이름이 다른 도구와 호환되도록 보장하는 데 도움을 줍니다. GitLab은 또한 브랜치 이름에 대한 추가 요구 사항을 강제하고 잘 구조화된 브랜치 이름에 대한 이점을 제공합니다.
GitLab은 모든 브랜치에 이러한 추가 규칙을 강제합니다:
- 브랜치 이름에 공백을 허용하지 않습니다.
- 40자의 16진수 문자로 구성된 브랜치 이름은 금지됩니다. 이는 Git 커밋 해시와 유사하기 때문입니다.
- 브랜치 이름은 대소문자를 구분합니다.
Docker와 같은 일반 소프트웨어 패키지는 추가적인 브랜치 이름 제한 사항을 강제할 수 있습니다.
다른 소프트웨어 패키지와의 최상의 호환성을 위해 다음만 사용하십시오:
- 숫자
- 하이픈 (
-
) - 밑줄 (
_
) - ASCII 표준 표의 소문자
브랜치 이름에는 순방향 슬래시(/
) 및 이모지를 사용할 수 있지만, 다른 소프트웨어 패키지와의 호환성은 보장되지 않습니다.
특정 형식의 브랜치 이름은 여러 가지 이점을 제공합니다:
- 브랜치 이름에이슈 번호를 접두어로 사용하여 병합 요청 작업 흐름을 간소화합니다.
- 브랜치 이름별로 브랜치 보호 자동화합니다.
- 브랜치가 GitLab에 푸시되기 전에 푸시 규칙을 사용하여 브랜치 이름을 테스트합니다.
- 병합 요청에서 실행할 CI/CD 작업을 정의합니다.
이슈에서 브랜치 이름에 대한 기본 패턴 구성
기본적으로 GitLab은 이슈에서 브랜치를 만들 때 패턴 %{id}-%{title}
을 사용하지만, 이 패턴을 변경할 수 있습니다.
필수 조건:
- 프로젝트에 대한 최소한의 Maintainer 역할이 있어야 합니다.
이슈에서 만든 브랜치에 대한 기본 패턴을 변경하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- 설정 > 저장소를 선택합니다.
- 브랜치 기본값을 확장합니다.
-
브랜치 이름 템플릿으로 스크롤하여 값을 입력합니다. 이 필드는 다음 변수를 지원합니다:
-
%{id}
: 이슈의 숫자 ID. -
%{title}
: Git 브랜치 이름으로 허용되는 문자만 사용하도록 수정된 이슈의 제목.
-
- 변경 사항 저장을 선택합니다.
이슈 번호로 브랜치 이름 접두사 추가
병합 요청 생성을 간소화하기 위해 Git 브랜치 이름을 이슈 번호로 시작하여 하이픈을 붙입니다.
예를 들어 #123
이슈에 브랜치를 연결하려면 브랜치 이름을 123-
으로 시작합니다.
이슈와 브랜치는 동일한 프로젝트에 있어야 합니다.
GitLab은 이슈 번호를 사용하여 다음과 같은 데이터를 병합 요청으로 가져옵니다:
- 이슈가 병합 요청과 관련되었다고 표시됩니다. 이슈 및 병합 요청은 서로 링크가 표시됩니다.
- 브랜치가 이슈에 연결됩니다.
- 프로젝트에 기본 종료 패턴이 구성되어 있으면, 병합 요청을 병합하면 관련 이슈도 닫힙니다.
- 이슈 마일스톤 및 레이블이 병합 요청으로 복사됩니다.
브랜치 비교
저장소에서 브랜치를 비교하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- 코드 > 리비전 비교를 선택합니다.
-
소스 브랜치를 선택하여 원하는 브랜치를 검색합니다. 정확한 일치가 먼저 표시됩니다.
연산자를 사용하여 검색을 세분화할 수 있습니다:-
^
는 브랜치 이름의 시작과 일치:^feat
는feat/user-authentication
와 일치합니다. -
$
는 브랜치 이름의 끝과 일치:widget$
은feat/search-box-widget
와 일치합니다. -
*
는 와일드카드를 사용하여 일치:branch*cache*
은fix/branch-search-cache-expiration
과 일치합니다. - 연산자를 결합할 수 있습니다:
^chore/*migration$
은chore/user-data-migration
와 일치합니다.
-
- 대상 저장소 및 브랜치를 선택합니다. 정확한 일치가 먼저 표시됩니다.
-
변경 사항 표시 아래에서 브랜치 비교 방법을 선택합니다:
-
소스에서 들어오는 변경만 (기본 설정)은 최신 공통 커밋 이후 소스 브랜치에서 발생한 차이를 보여줍니다.
소스 브랜치가 생성된 후 대상 브랜치에 따로 발생한 관련 없는 변경 사항은 포함되지 않습니다.
이 방법은git diff <from>...<to>
Git 명령어를 사용하여 브랜치를 비교하며,
실제 커밋 대신 병합 베이스를 사용하므로 체리픽된 커밋의 변경 사항이 새로운 변경 사항으로 표시됩니다. -
소스가 생성된 이후 대상의 변경 포함은 두 브랜치 간의 모든 차이를 보여줍니다.
이 방법은git diff <from> <to>
Git 명령어를 사용합니다.
-
소스에서 들어오는 변경만 (기본 설정)은 최신 공통 커밋 이후 소스 브랜치에서 발생한 차이를 보여줍니다.
- 비교를 선택하여 커밋 목록과 변경된 파일을 표시합니다.
- 선택 사항. 소스와 대상을 반대로 하려면 리비전 바꾸기를 선택하세요 ().
병합된 브랜치 삭제
다음 조건을 모두 충족하는 경우 병합된 브랜치를 대량으로 삭제할 수 있습니다:
- 보호된 브랜치가 아닙니다.
- 프로젝트의 기본 브랜치에 병합되었습니다.
전제 조건:
- 프로젝트에 대한 적어도 개발자 역할이 있어야 합니다.
다음 단계:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- 코드 > 브랜치를 선택합니다.
- 페이지 오른쪽 상단에서 더보기 를 선택합니다.
- 병합된 브랜치 삭제를 선택합니다.
- 대화 상자에서 확인을 위해 단어
delete
를 입력한 후 병합된 브랜치 삭제를 선택합니다.
대상 브랜치에 대한 워크플로 구성
- GitLab 16.4에서 도입되었습니다. 기본적으로
target_branch_rules_flag
이라는 플래그와 함께 활성화됩니다.- 기능 플래그가 제거되었습니다. GitLab 16.7에서 기본적으로 활성화됩니다.
일부 프로젝트는 개발을 위해 develop
및 qa
와 같은 장기 브랜치를 여러 개 사용합니다.
이러한 프로젝트에서는 main
을 기본 브랜치로 유지하되, 병합 요청이 develop
또는 qa
를 대상으로 하기를 원할 수 있습니다.
대상 브랜치 워크플로는 프로젝트의 적절한 개발 브랜치를 대상으로 하도록 병합 요청이 진행되도록 돕습니다.
병합 요청을 생성할 때 워크플로는 브랜치 이름을 확인합니다. 브랜치 이름이 워크플로와 일치하면 병합 요청이 지정한 브랜치를 대상으로 합니다. 브랜치 이름이 일치하지 않으면 병합 요청은 프로젝트의 기본 브랜치를 대상으로 합니다.
규칙은 “첫 일치” 기준으로 처리됩니다 - 동일한 브랜치 이름에 두 개 이상의 규칙이 일치하는 경우 맨 위의 규칙이 적용됩니다.
전제 조건:
- 프로젝트에 대한 적어도 메인테이너 역할이 있어야 합니다.
대상 브랜치 워크플로를 만들려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고 프로젝트를 찾습니다.
- 설정 > 병합 요청을 선택합니다.
- 병합 요청 브랜치 워크플로로 스크롤합니다.
- 브랜치 대상 추가를 선택합니다.
- 브랜치 이름 패턴으로 브랜치 이름과 일치시키기 위해 문자열 또는 와일드카드를 제공합니다.
- 대상 브랜치를 선택하여 브랜치 이름 패턴과 일치할 경우 사용할 대상 브랜치를 선택합니다.
- 저장을 선택합니다.
예시
당신은 프로젝트를 다음 타깃 브랜치 워크플로우로 구성할 수 있습니다:
브랜치 이름 패턴 | 타깃 브랜치 |
---|---|
feature/*
| develop
|
bug/*
| develop
|
release/*
| main
|
이러한 타깃 브랜치는 다음과 같은 프로젝트에 대한 병합 요청을 만드는 프로세스를 간소화합니다:
-
main
을 애플리케이션의 배포 상태를 나타내는 데 사용합니다. -
develop
와 같은 다른 장기 실행 브랜치에 현재 릴리스되지 않은 개발 작업을 추적합니다.
작업 흐름이 처음에는 새로운 기능을 main
대신 develop
에 배치하는 경우, 이러한 타깃 브랜치는 feature/*
또는 bug/*
에 일치하는 모든 브랜치가 실수로 main
을 대상으로 하지 않도록 보장합니다.
main
으로 릴리스할 준비가 되었을 때, release/*
이라는 브랜치를 만들고, 이 브랜치가 main
을 대상으로 하도록 합니다.
타깃 브랜치 워크플로우 삭제
타깃 브랜치 워크플로우를 제거하면 기존의 병합 요청은 변경되지 않습니다.
전제 조건:
- 적어도 관리자(Maintainer) 역할을 가져야 합니다.
다음을 수행하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고, 프로젝트를 찾습니다.
- 설정 > 병합 요청을 선택합니다.
- 삭제하려는 브랜치 타깃에서 삭제를 선택합니다.
관련 주제
문제 해결
동일한 커밋을 포함하는 여러 브랜치
기술적으로 더 깊은 수준에서, Git 브랜치는 분리된 엔티티가 아니라, 커밋 SHA의 집합에 부착된 레이블입니다. GitLab이 브랜치가 병합되었는지 여부를 결정할 때, 그 브랜치의 타깃 브랜치에 해당 커밋 SHAs의 존재 여부를 확인합니다. 이러한 동작은 두 병합 요청이 동일한 커밋을 포함할 때 예상치 못한 결과를 초래할 수 있습니다. 이 예에서, 브랜치 B
와 C
는 모두 브랜치 A
에서 커밋(3
)을 시작합니다.
브랜치 B
를 병합하면, 브랜치 A
도(당신의 조치 없이)병합된 것처럼 보입니다. 왜냐하면 브랜치 A
의 모든 커밋이 이제 타깃 브랜치 main
에 나타나기 때문입니다. 브랜치 C
는 병합되지 않은 상태로 남아 있을 것입니다. 왜냐하면 커밋 5
가 브랜치 A
나 B
의 일부가 아니기 때문입니다.
병합 요청 A
는 여전히 병합된 상태이며, 해당 브랜치로 새로운 커밋을 푸시하려고 해도 그대로 유지됩니다. 만약 병합 요청 A
에 변경 사항이 남아 있어(병합 요청 A
의 일부가 아닌)아직 병합되지 않은 경우, 해당 변경 사항에 대한 새로운 병합 요청을 엽니다.
오류: 모호한 HEAD
브랜치가 존재함
Git 2.16.0 이전 버전에서는 HEAD
라는 이름의 브랜치를 만들 수 있었습니다. 이 HEAD
라는 브랜치는 Git이 활성(체크아웃된) 브랜치를 설명하는 데 사용하는 내부 참조(또한 HEAD
라고 함)와 충돌합니다. 이러한 이름 충돌은 귀하의 저장소의 기본 브랜치를 업데이트하는 것을 방해할 수 있습니다:
오류: 기본 브랜치를 설정할 수 없습니다. 저장소에 'HEAD'라는 이름의 브랜치가 있나요?
이 문제를 해결하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하고, 프로젝트를 찾습니다.
- 코드 > 브랜치를 선택합니다.
-
HEAD
라는 이름의 브랜치를 검색합니다. - 브랜치에 변경 내용이 없는지 확인합니다.
- 브랜치 삭제를 선택한 후 예, 브랜치 삭제를 선택합니다.
Git 버전 2.16.0 이후에는 이 이름으로 브랜치를 만들 수 없습니다.
작성한 모든 브랜치 찾기
프로젝트에서 작성한 모든 브랜치를 찾으려면 Git 저장소에서 다음 명령을 실행하세요:
git for-each-ref --format='%(refname:short) %(authoremail)' | grep $(git config --get user.email)
프로젝트에 있는 모든 브랜치의 총계를, 작성자 별로 정렬하여 얻으려면 Git 저장소에서 다음 명령을 실행하세요:
git for-each-ref --format='%(authoremail)' | sort | uniq -c | sort -g