해당 글은 Github에서 Branch를 보호하는 룰을 설정하는 방법에 대해 다룬다.
특히 팀 협업에 있어서 Main Branch의 Rule을 설정하는 것은 매우 중요하다.
우선 Team Repository에 들어가 브랜치 규칙을 할당할 팀을 먼저 생성한다.


Branch Name & Enforcement Status
Repository Settings Rulesets로 들어가 Ruleset Name, Enforcement Status를 Active한다.

Bypass list
Rulset을 무시하고 직접 브랜치에 Merge, Push 가능한 Organization Group을 설정한다.
프로젝트 리더나 중요한 멤버만 설정할 수 있도록 하자.

Target branches
BranchRule을 적용할 Branch를 선택한다.

Branch Rules
중요한 Branch Rules만 적어두었다.
Restrict updates - 브랜치로의 직접적인 Push를 차단한다. 관리자나 허용된 인원외에는 메인 브랜치에 직접 코드를 올릴 수 없다.
Restrict delections - 브랜치 삭제를 방지한다. 실수로 브랜치를 날려버리는 상황을 방지한다.
Block force pushes - 커밋 히스토리를 보호한다. git push -f 명령어로 과거 기록을 덮어쓰거나 지우는 상황을 방지한다.

Require a pull request before merging - PR을 강제한다. 모든 코드는 반드시 PR을 생성하고 리뷰를 거쳐야만 브랜에 합쳐질 수 있다.
Required approvals - 최소한의 PR 동료 승인 인원을 설정한다. (혼자 커밋하고 PR하는 상황을 방지)
Dismiss stale pull request approvals when new commits are pushed - 승인을 받은 유저가 코드를 다시 수정하고 푸시하면, 기존 승인을 무효화하고 다시 리뷰받도록 한다.
Require conversation resolution before merging - 리뷰어가 단 코멘트가 모두 Resolved 상태가 되어야만 머지할 수 있도록 강제한다.
Require reviews from Code Owners (Option) - 특정 파일 (DB, 보안 관련 코드 등)은 미리 전문가만 승인할 수 있도록 강제한다.
Allowed merge methods - 머지 방식 (Merge, Squash, Rebase) 을 설정한다.

Require Status Checks to Pass
CI도구를 Github Actions 워크플로우 파일(.yml)에 등록한 경우에만 활성화하도록 하자.
코드를 검사해 CI도구가 Pass 상태가 되어야지만 Merge 버튼이 활성화 되도록 한다.
Require branches to be up to date before merging - 머지하려는 코드가 타겟 브랜치의 최신 상태를 반영하고 있어야 머지를 허용한다. 충돌을 미리 방지하는 역할을 한다.
