Branch란?
브랜치란 독립적으로 어떤 작업을 진행하기 위한 개념입니다. 필요에 의해 만들어지는 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행할 수 있습니다.
개발자들이 협업을 진행할 때 동일한 소스코드를 함께 공유하고 다룬다. 여기서 어떤 사람은 버그를 수정하고, 어떤 사람을 기능을 개발하기도 한다. 동일한 코드를 여러 사람이 다른 작업을 할 때 서로 다른 버전의 코드가 만들어진다. 이 때 동시에 여러 작업을 할 수 있도록 Branch(브랜치)를 사용한다. 분리된 작업 영역에서 수정을 하고 나중에 원래 버전과 비교해서 하나의 새로운 버전을 만든다. 이러한 브랜치 전략들을 정리했다.
1) git clone → github의 저장소를 복제한다. -b 옵션을 사용하여 해당 브랜치로 복제를 수행한다.
2) git add → 작업 디렉토리 영역의 변경 내용을 스테이징 영역에 넘긴다. 이 때 특정 파일이나 디렉토리 명을 입력해 일부만 넘길 수도 있고, *을 사용해 모든 변경된 내용을 넘길 수도 있다.
3) git commit → 해당 명령어를 사용하여 소스코드의 변경을 저장한다. 이 때 -m 옵션을 사용하여 변경 사항을 메세지로 남길 수 있다.
4) git push → 저장된 소스코드를 원격저장소(github)에 올려서 다른 사람과 코드를 공유할 수 있다. 이 때 git push <리모트명> <브랜치명> 으로 작성한다.
5) PR → Pull Request로 fork 한 기존의 저장소에 소스코드를 보낸다. 해당 과정을 통해 fork 후 변경한 내용을 기존 소스코드 저장소에 반영하게 된다.
PR까지 전체적인 과정
저장소를 clone → 브랜치 생성 및 이동 → 소스코드 작성 및 변경 → 변경한 내용을 git add로 스테이징 영역에 저장 → git commit으로 변경 사항을 저장 → git push로 원격 저장소에 소스코드를 올림 → Pull Request를 전송
add : git에 현재 commit된 버전과 다르게 변경된 파일이 있음을 알려주는 동작이다. git add가 실행되면 git은 이를 표시하기 위해 가진 파일들에 변화가 생긴다.
commit : git에 변경된 파일이 있음을 명시하는 동작이다. commit을 하면 그 전까지 add한 파일들이 해당 commit에 기록된다. add와 마찬가지로 git commit이 실행되면, git은 이를 기록하기 위해 가진 파일들에 변화가 생긴다.
- master : 기준이 되는 브랜치로 제품을 배포하는 브랜치
- develop : 개발 브랜치로 개발자들이 이 브랜치를 기준으로 각자 작업한 기능들을 Merge
- feature : 단위 기능을 개발하는 브랜치로 기능 개발이 완료되면 develop 브랜치에 Merge
- release : 배포를 위해 master 브랜치로 보내기 전에 먼저 QA(품질검사)를 하기위한 브랜치
- hotfix : master 브랜치로 배포를 했는데 버그가 생겼을 떄 긴급 수정하는 브랜치
gitflow 과정
참고: 우아한형제들 기술블로그 (우린 Git-flow를 사용하고 있어요)
- master 브랜치에서 develop 브랜치를 분기합니다.
- 개발자들은 develop 브랜치에 자유롭게 커밋을 합니다.
- 기능 구현이 있는 경우 develop 브랜치에서 feature-* 브랜치를 분기합니다.
- 배포를 준비하기 위해 develop 브랜치에서 release-* 브랜치를 분기합니다.
- 테스트를 진행하면서 발생하는 버그 수정은 release-* 브랜치에 직접 반영합니다.
- 테스트가 완료되면 release 브랜치를 master와 develop에 merge합니다.
사용법
- master 브랜치는 어떤 때든 배포가 가능하다
- master 브랜치는 항상 최신 상태며, stable 상태로 product에 배포되는 브랜치
- 이 브랜치에 대해서는 엄격한 role과 함께 사용한다
- merge하기 전에 충분히 테스트를 해야한다. 테스트는 로컬에서 하는 것이 아니라 브랜치를 push 하고 Jenkins로 테스트 한다
- master에서 새로운일을 시작하기 위해 브랜치를 만든다면, 이름을 명확히 작성하자
- 브랜치는 항상 master 브랜치에서 만든다
- Git-flow와는 다르게 feature 브랜치나 develop 브랜치가 존재하지 않음
- 새로운 기능을 추가하거나, 버그를 해결하기 위한 브랜치 이름은 자세하게 어떤 일을 하고 있는지에 대해서 작성해주도록 하자
- 커밋메시지를 명확하게 작성하자
- 원격지 브랜치로 수시로 push 하자
- Git-flow와 상반되는 방식
- 항상 원격지에 자신이 하고 있는 일들을 올려 다른 사람들도 확인할 수 있도록 해준다
- 이는 하드웨어에 문제가 발생해 작업하던 부분이 없어지더라도, 원격지에 있는 소스를 받아서 작업할 수 있도록 해준다
- 피드백이나 도움이 필요할 때, 그리고 merge 준비가 완료되었을 때는 pull request를 생성한다
- pull request는 코드 리뷰를 도와주는 시스템
- 이것을 이용해 자신의 코드를 공유하고, 리뷰받자
- merge 준비가 완료되었다면 master 브랜치로 반영을 요구하자
- 기능에 대한 리뷰와 논의가 끝난 후 master로 merge한다
- 곧장 product로 반영이될 기능이므로, 이해관계가 연결된 사람들과 충분한 논의 이후 반영하도록 한다
- 물론 CI도 통과해야한다!
- master로 merge되고 push 되었을 때는, 즉시 배포되어야한다
- GitHub-flow의 핵심
- master로 merge가 일어나면 자동으로 배포가 되도록 설정해놓는다
- master 브랜치는 production 브랜치
- production브랜치는 master 이상 권한만 push 가능
- developer 권한 사용자는 master 브랜치에서 신규 브랜치를 추가
- 신규 브랜치에서 소스를 commit 하고 push
- merge request를 생성하여 master 브랜치로 merge 요청
- master 권한 사용자는 developer 사용자와 함께 리뷰 진행 후 master 브랜치로 merge
- 테스트가 필요하다면 master에서 procution 브랜치로 merge하기 전에 pre-production 브랜치에서 테스트
그 동안 개발을 진행할 때 체계적으로 브랜치 전략을 사용하지는 않았지만 Github flow 방식을 주로 사용했다. 하지만 이렇게 다양한 브랜치 전략이 존재하고 프로젝트를 할 때 하나씩 직접 다 사용해 봐야지!!!!