Git branch에 대해 더욱 깊숙히 알아보자.
git을 쓰는 이유는 사실 브랜치 때문이라 봐도 무방할 것 같다. 동일 코드를 여러 사용자가 이용할 때 버전 관리를 용이하게 하는 것이 바로 브랜치이다.
git에서 항상 작업할 브랜치를 미리 선택해야 한다. 처음에 git을 설치하게 되면 master 브랜치가 선택되어 있다. 기존 브랜치가아닌 다른 브랜치에서 작업하고 싶다면 체크아웃(checkout) 명령어를 실행하여 원하는 브랜치로 전환할 수 있다. 체크아웃을 실행하면 우선 브랜치 안에 있는 마지막 커밋 내용이 작업 트리에 펼쳐진다. 브랜치가 전환되었으므로 이후에 실행한 커밋은 전환한 브랜치에 추가된다.
위의 이미지에서 HEAD가 보이는데 HEAD란 현재 사용중인 브랜치의 선두 부분을 나타내는 이름이다. HEAD를 이동하면 사용하는 브랜치가 변경된다.
stash
커밋하지 않은 변경 내용이나 새롭게 추가한 파일이 인덱스와 작업 트리에 남아있는 채로 다른 브랜치로 전환하면 그 변경 내용은 기존 브랜치가 아닌 전환된 브랜치에서 커밋할 수 있다.
체크아웃할 때 전환할 브랜치에 변경 사항이 있을 경우 체크아웃에 실패하게 된다. 이 경우 전환 전 브랜치에서 커밋하지 않은 내용을 커밋하거나 stash를 이용해 일시적으로 변경 내용을 다른 곳에 저장하여 충돌을 피하게 한 뒤 체크아웃을 해야한다.
stash란, 파일의 변경 내용을 일시적으로 기록해두는 영역이다. stash를 사용하여 작업 트리와 인덱스 내에서 아직 커밋하지 않은 변경을 일시적으로 저장해 둘 수 있다. 이 stash에 저장된 변경 내용은 나중에 다시 불러와 원래의 브랜치나 다른 브랜치에 커밋할 수 있다.
브랜치 통합하기
작업이 완료된 토픽 브랜치는 최종적으로 통합 브랜치에 병합된다. 브랜치 통합은 merge와 rebase를 사용하는 2가지 종류가 있다. 둘의 결과는 다르니 잘 알아보자
merge
여러개의 브랜치를 하나로 모을 수 있다.
아래 그림과 같이 master 브랜치에서 분기하는 bugfix라는 브랜치가 있다고 가정하자.
bugfix 브랜치를 master브랜치로 병합할 때 master브랜치가 수정사항이 없다면 merge를 통해 손쉽게 병합이 가능하다. bugfix의 이력은 master의 이력을 모두 포함하고 있기 때문에 master의 HEAD가 bugfix의 HEAD로 이동하는 것이다. 이를 fast-forward라고 한다.
그러나 bugfix를 분기한 이후에 master 브랜치에서 수정이 있었을 경우 두 브랜치의 변경 내용을 통합할 필요가 있다.
따라서 양쪽의 변경을 가져온 merge commit을 실행하게 된다.
병합 실행시에 fast-forward 병합이 가능한 경우라도 non fast-forward병합 옵션을 지정하여 아래 그림과 같이 만들어 낼 수도 있다.
rebase
위와 같은 상황이 있다고 가정하자.
rebase를 적용하면 아래와 같이 master 브랜치의 뒤에 이어 붙여진다.
이때 이어붙여진 커밋 버전은 master의 HEAD와 충돌여부가 있기 때문에 이 부분을 수정해야한다.
rebase를 적용하면 master의 HEAD는 그대로 유지이기 때문에 bugfix와 HEAD 위치를 동일하게 맞추기 위해 merge를 진행한다.(fast-forward)
성공적인 Git 브랜칭 모델
이 운용 모델에서는 크게 나눠 4가지 종류의 브랜치를 이용하여 개발을 진행합니다.
- 메인 브랜치(Main branch)
- 피처 브랜치(Feature branch) 또는 토픽 브랜치(Topic branch)
- 릴리스 브랜치(Release branch)
- 핫픽스 브랜치(Hotfix branch)
메인 브랜치
master와 develop 브랜치를 대체로 메인으로 사용한다.
master: 배포 가능한 상태만을 관리 커밋할 때 태그를 사용하여 배포 번호 기록
develop: 통합 브랜치의 역할을 하며 평소 이 브랜치를 기반으로 개발
피처 브랜치
토픽 브랜치를 담당한다.
새로운 기능 개발 및 버그 수정이 필요할 때 develop 브랜치로부터 분기한다.피처 브랜치에서의 작업은 기본적으로 공유할 필요가 없기 때문에 원격으로 관리하지 않는다. 개발이 완료되면 develop 브랜치로 병합하여 다른 사람과 공유한다.
릴리즈 브랜치
버그를 수정하거나 새로운 기능을 포함한 상태로 모든 기능이 정상적으로 동작하는지 확인한다. 관례적으로 브랜치 이름 앞에 release-를 붙인다. 배포 가능한 상태가 되면 master로 병합하며 커밋에 릴리즈 번호 태그를 추가한다. 릴리즈 브랜치에서 버그 픽스를 할 경우 디벨롭 브랜치에도 병합을 해줘야한다.
핫픽스 브랜치
배포한 버전에 긴급하게 수정해야할 필요가 있을 경우 master브랜치에서 분기하는 브랜치이다. 관례적으로 브랜치 이름 앞에 hotfix-를 붙인다.
배포가 된 것에서 예상치 못한 버그가 일어났을 때 신속하게 변경해 주는 브랜치이다. 작업 완료 후 디벨롭 브랜치에도 병합해줘야한다.
'Git' 카테고리의 다른 글
Git branch (0) | 2022.04.10 |
---|---|
Git merge (0) | 2022.04.09 |
.gitignore 설정 (0) | 2022.03.31 |
Github 간단 설명 (0) | 2022.03.17 |