1. 탐구
브랜치 전략
1. Git Flow
- main : 출시 가능한 프로덕션 코드를 모아놓은 브랜치
- develop : 다음 버전 개발을 위한 코드를 모아놓은 브랜치
- 개발이 완료되면 main으로 머지
- supporting : 그 역할이 끝나면 삭제한다.
- release : SW배포를 준비하기 위한 브랜치
- develop에서 분기 → 버전 이름 등의 데이터를 수정하거나 배포 전 사소한 버그 수정을 위해 사용
- release : SW배포를 준비하기 위한 브랜치
- hotfix : 이미 배포된 버전에 문제가 발생하면 이 브랜치에서 문제 해결
- main에서 분기 > 문제가 해결되면 main과 develop에 머지
- feature : 하나의 기능을 개발하기 위한 브랜치
- fast-forward가 아닌, merge commit을 생성해 머지 → 히스토리가 특정 기능 단위로 묶인다.
2. github flow
: git flow에 비해 간단한 구조
- master가 그 역할만 유지한다면, 나머지 브랜치엔 관여하지 않는다.
- main : 출시 가능한 프로덕션 코드를 모아놓은 브랜치
- topic : git flow의 feature 브랜치와 동일한 역할
3. gitlab flow
: github flow가 너무 간단해, 규모가 큰 서비스에는 부적합 → 단순함을 이용하면서 체계를 갖추기 위해 등장
머지 전략
Merge
: 커밋 이력이 모두 남는다.
-
fast-forward merge: 머지하면, 머지한 브랜치의 작업사항을 모두 연장선으로 나열된다.
$ git checkout master $ git merge develop- 변경사항을 그대로 main브랜치로 가져온다.
-
recursive merge: 머지 커밋을 하나 생성하며, 하나의 브랜치로 합쳐진다.
- 가장 일반적으로 많이 사용
-—n-ff옵션을 주면 강제로 merge 커밋을 생성하게 할 수 있다.
-
squash & merge: 여러개의 커밋을 하나의 커밋으로 합친다.
git checkout develop git merge --squash feature/1 git commit -m "squash & merge"- 장점
- 머지가 되었다는 사실을 히스토리 상에서 한번에 알아볼 수 있다.
- 장점
- 버전 별로 어떤 것이 변경되었는지 한 눈에 알 수 있다.
- 머지된 브랜치의 자잘한 커밋사항이 남지 않기 때문에 ‘머지가 되었다’라는 사실 자체에만 집중한 기록이 남아, 프로그램의 변경 사항을 읽기 쉽다.
- 단점
- 누가 어떤 커밋을 통해 어떤 라인을 수정했는지 정보를 알기 어렵다.
-
rebase & merge: 진행했던 커밋들은 베이스로 설정한 브랜치의 마지막 커밋 뒤로 붙게 된다. 베이스가 변경되었기에 commit hash 또한 변경된다.
- rebase는 base를 다시 설정한다는 말
$ git checkout develop
$ git rebase master
$ git checkout master
$ git merge develop
- 장점
- develop에서 변경한 내용을 master에서 변경한 것처럼 바꿔버릴 수 있다.
- 머지된 브랜치의 커밋을 모두 살려놓기에 누가 언제, 어떤 부분을 수정했다는 정보를 모두 알 수 있다.
- 단점
- merge 커밋이 없기 때문에, 어느 시점에 merge가 되었는지 나중에 판단하기 어렵다.
- 태깅에 신경을 많이 써줘야한다.
- merge 커밋이 없기 때문에, 어느 시점에 merge가 되었는지 나중에 판단하기 어렵다.
2. 실습
1. fast-forward merge
$ git checkout develop
$ git merge feature/1
feature/1에서 작업한 커밋(feature/1, feature/1-2) 모두 현재 커밋에 이어서 추가가 되었다.
2. recursive merge
$ git checkout develop
$ git merge feature/1 --no-ff
하나의 merge 커밋을 생성하며 병합한다.
3. squash & merge
git checkout develop
git merge --squash feature/1
git commit -m "squash & merge"
하나의 merge 커밋으로 합쳐져 병합이 된다. 이 때, recursive처럼 그래프 상에서 하나로 합쳐지는 선은 없다.
4. rebase & merge
$ git checkout feature/1
$ git rebase develop
$ git checkout develop
$ git merge feature/1
-
rebase 이전
develop에서는 또 다른 커밋(커밋 메시지 develop)이 생성되었다.
-
rebase 이후
git rebase develop
develop의 최신 사항이 현재 feature/1브랜치에 반영이 되어 한 줄로 세워진다.
이 때, feature/1에 있던 모든 브랜치 커밋의 해시값이 변경된다. develop브랜치의 해시값이 변경되는 것이 아니다. feature/1의 모든 커밋의 해시값이 변경된다.
-
머지 전 develop 브랜치
git checkout develop
-
머지 후 develop 브랜치
git merge feature/1
머지 후, 물론 한 줄로 세워진 그대로 반영이 된다.
4. Articles
Hotfix 따른 Git 전략에 대한 고민 (Git Flow vs Github Flow)