1. Branch란?
- 독립적으로 어떠한 작업을 진행하기 위한 개념으로, 필요에 의해 만들어지는 각각의 Branch는 다른 Branch의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행할 수 있다.
- 개발자들이 협업을 진행할 때, 기능 개발이나 버그 수정과 같은 서로 다른 작업을 하면 동일한 코드여도 서로 다른 버전의 코드가 만들어진다. 이 때, 동시에 여러 작업을 진행할 수 있도록 Branch를 사용하고, 이 Branch를 사용하는데 전략이 필요하다.
2. Git에 대한 사전 지식
2-1. PR(Pull Request) 과정
- git clone : github의 저장소 복제
- git add : 작업 디렉토리 영역의 변경 내용을 스테이징 영역에 넘기는데, 이 때 디렉토리 명을 입력해 일부만 넘길 수도 있고, *을 사용해 변경된 모든 내용을 넘길 수도 있다.
- git commit : 소스코드의 변경을 저장하고, -m 옵션을 사용하여 메시지를 남길 수 있다.
- git push : 저장된 소스코드를 github에 올려서 다른 사람들과 코드를 공유한다. (git push [리모트명][브랜치명])
- PR : Pull Request로 fork한 기존의 저장소에 소스코드를 보내고, 해당 과정을 통해 변경된 내용을 기존 소스코드 저장소에 반영한다.
2-2. add & commit
- add : git에 현재 commit된 버전과 다르게 변경된 파일이 있음을 알려주는 동작
- commit : git에 변경된 파일이 있음을 명시하는 동작
3. Git Branch 전략 1 : Git-Flow
3-1. Git-Flow 전략에 존재하는 5가지 Branch
- Master : 기준이 되는 Branch로, 제품을 배포하는 Branch
- Develop : 개발 Branch로, 이 Branch를 기준으로하여 각자 작업한 기능들을 Merge
- Feature : 단위 기능을 개발하는 Branch로, 기능 개발이 완료되면 develop Branch에 Merge
- Release : 배포를 위해 Master Branch로 보내기 전, QA(품질검사)를 하기위한 Branch
- Hotfix : Master Branch로 배포 후, 버그가 생겼을 때 긴급 수정하는 Branch
- Master와 Develop이 중요한 Main Branch이고, 나머지는 필요에 의해 운영하는 Branch이다.
- Branch를 Merge할 때, 항상 -no-ff 옵션을 붙여 Branch에 대한 기록이 사라지는 것을 방지하는 것을 원칙으로 한다.
3-2. Git-Flow 과정
- Master에서 Develop Branch 분기
- 개발 작업을 하며 개발자들은 Develop에 자유롭게 commit
- 기능 구현이 있는 경우, Develop에서 Feature-* Branch를 분기
- 배포를 준비하는 경우, Develop에서 Release-* Branch를 분기
- 테스트를 진행하며 발생하는 버그 수정은 Release-* Branch에 직접 반영
- 테스트가 완료되면, Release를 Master와 Develop에 Merge
4. Git Branch 전략 2 : Github-Flow
- Git-Flow가 Github에서 사용하기에 복잡하다고 나오게된 Branch 전략
- Hotfix와 Feature를 구분하지 않음(다만, 우선순위만 다름)
- 수시로 배포가 일어나며, CI와 배포가 자동화되어 있는 프로젝트에 유용
4-1. Github-Flow Rules
- Master는 어떤 때든 배포가 가능하다.
- Master는 항상 최신 상태며, stable 상태로 배포되는 Branch
- Master는 엄격한 rule과 함께 사용하며, merge하기 전에 충분히 테스트가 되어야 함(테스트는 local에서 하지 않고, Branch를 push한 뒤, Jenkins로 테스트)
- Master에서 새로운 일을 시작하기 위해 Branch를 새로 만든다면, 이름을 명확히 작성한다.
- 새 Branch는 항상 Master에서 만듬
- Git-Flow와 달리, Feature나 Develop이 존재하지 않음
- 새로운 기능 추가나, 버그 해결을 위한 Branch 이름은 자세하게 작성하고, commit message 또한 명확하게 작성
- 원격 Branch에 수시로 push한다.
- 항상 원격 Branch에 자신이 하고 있는 일을 올려, 다른 사람들도 확인 할 수 있고, local 하드웨어 문제가 발생하더라도 원격 Branch의 소스를 받아 작업할 수 있게 해줌
- 피드백이나 도움이 필요하거나, Merge 준비가 완료되었을 때는 Pull Request를 생성한다.
- Pull Request(PR)는 코드 리뷰를 도와주는 시스템으로, 이것을 통해 코드를 공유하고 리뷰를 받을 수 있음
- Master 준비가 완료되었다면, Master Branch 반영을 요구
- 기능에 대한 리뷰와 논의가 끝났다면, Master로 Merge한다.
- 곧바로 product에 반영되므로, 충분히 논의하고 CI도 통과된 후, 반영한다.
- Master로 Merge되고 Push되었을 때는 즉시 배포한다.
- Github-Flow의 핵심으로, Master로 Merge가 일어나면 자동으로 배포가 되도록 설정
5. Git Branch 전략 3 : Gitlab-Flow
- Production : Git-Flow의 Master Branch와 역할이 같으며, 오직 배포만을 담당
- Master : 기준이 되는 Branch로, 배포 전, Production Branch로 Merge하여 배포
- Pre-Production : Production으로 넘기기 전, 테스트를 수행하는 Branch
- Production Branch에서 배포된 코드가 항상 최신 버전 상태를 유지할 필요가 없다는 장점이 있음
- 복잡한 Git-Flow와 너무 간단한 Github-Flow의 절충안
5-1. Gitlab-Flow Rules
- Master Branch의 역할은 Production
- Production은 Master 이상의 권한만 push 가능
- Develop 권한 사용자는 Master에서 신규 Branch를 추가하고, 해당 Branch에서 commit & push. 그 후, Merge Request를 생성하여 Master에 Merge 요청
- Master 권한 사용자는 Develop 권한 사용자와 충분한 리뷰를 진행한 뒤, Master에 Merge, 그 후 배포 시에 Production과 Merge
- 테스트가 필요하면, Production으로 Merge하기 전, Pre-Production에서 테스트
6. Fork & Pull Request
- 규모가 있는 경우, Branch보단 Fork와 Pull Request를 활용하여 구현
- Fork : Branch와 비슷하지만, 프로젝트를 통째로 외부에 복제하여 개발하는 방식
- Pull Request : 개발이 완료된 뒤, Branch처럼 바로 Merge를 하는 것이 아니라 git 관리자에게 Merge 요청을 보내고, 관리자가 요청과 해당 코드를 보고 적절하다 싶으면 Merge하는 방식