독립적으로 작업을 진행하기 위한 개념. commit 사이를 이동할 수 있는 포인터 같은 것.
git을 사용하면서 브랜치를 생성해서 작업하는데 브랜치의 정확한 정의에 대해 찾아본 적은 없던 것 같다.
그래서 검색해봤는데, 뭔가 내가 생각했던 정의보다는 조금 추상적인 느낌이긴 하지만..
브랜치 생성을 통해 기존에 작업하던 코드에서 독립적으로 떨어져서 작업할 수 있게 되고, 독립적인 브랜치 히스토리를 갖게 된다.
브랜치의 특징
git의 commit은 변경사항을 모두 기록하는 것이 아니라 스냅샷으로 기록한다.
git add README test.rb LICENSE
git commit -m 'initial commit'
파일 3개를 add로 스테이징 후 commit을 한다고 했을 때, 다음과 같이 진행된다.
이후 새로 생성된 커밋은 현재 트리 개체와 부모 커밋 개체(이전 커밋)의 정보를 저장한다.
git은 최초로 commit을 하면 mater라는 이름의 브랜치를 만들어서 자동으로 가장 마지막 commit을 가리키게 한다.
=> branch가 포인터 같은 것이라고 하는 이유!
git에는 HEAD라는 특수한 포인터가 존재하는데, 이 포인터는 지금 작업하는 브랜치를 가리키는 포인터이다.
git checkout
명령어를 통해 브랜치를 이동하는데, checkout할 때 움직이는 것이 바로 이 HEAD 포인터이다.
브랜치의 포인터가 아닌 일반적인 commit 파일을 가리키게 할 수도 있는데 이러한 경우를 detached HEAD라고 표현한다.
branch, commit, HEAD 총 3개의 포인터가 있다고 생각하면 될 것 같다!
git은 파일을 관리하기 위해 object를 생성
하는데, object에는 4가지 타입이 있다.
해당 object들은 .git/objects
폴더에 저장된다.
object로 만들어 관리할 때 체크섬의 앞부분 두 글자를 폴더명으로, 나머지를 파일명으로 해서 저장하여 관리한다.
git cat-file -p [오브젝트 SHA-1값]
명령어로 오브젝트 파일의 내용을 확인할 수 있다.
파일의 이름이나 형식 등 파일의 메타 데이터는 저장되지 않고 파일의 내용만 저장해서 blob타입의 object를 생성한다. 사이즈는 컨텐츠의 용량이 byte로 표시된다.
tree object는 파일의 내용을 저장하고 있는 blob object를 모아놓기 위한 object라고 할 수 있다.
tree의 컨텐츠는 해당 디렉토리 내부의 파일과 디렉토리의 정보(파일명, 형식, SHA-1 등)를 담은 blob과 tree object의 리스트이다.
tree 객체는 하위 디렉토리의 트리 객체를 참조할 수 있고
blob 객체는 한 디렉토리에 있는 모든 blob을 담고 있다. 객체에 대한 접근 권한, 파일 이름은 여기서 관리한다.
tree의 SHA-1값, parent object의 SHA-1값, author, committer, commit message를 포함하고 있다.
tree의 SHA-1값은 해당 commit의 스냅샷의 최상단 tree를 가리키는 포인터이다.
parent는 두번째 commit부터 확인해볼 수 있는데, 해당 commit의 바로 직전 commit의 SHA-1값이다.
git의 특정 commit에 tag를 달면 tag object가 생성된다. 객체 종류, 태그 이름, tagger, 태그 메세지, PGP 서명정보가 담겨있다.
일반적으로 5개의 브랜치로 운영을 한다고 하는데, 프로젝트의 성격이나 팀마다 다르게 운영할 수 있다.
항상 유지되는 브랜치를 메인 브랜치라고 한다. master, develop 브랜치가 여기에 해당된다.
제품으로 출시될 수 있는 브랜치
배포(release)이력을 관리하기 위해 사용, 즉 배포 가능한 상태만을 관리한다.
다음 출시 버전을 개발하는 브랜치
기능 개발을 위한 브랜치들을 병합하기 위해 사용한다.
이 브랜치를 기반으로 개발을 진행하고,모든 기능이 추가되고 버그가 수정되어 배포 가능한 안정적인 상태라면
develop 브랜치를 master 브랜치에 merge시킨다.
일정 기간 동안만 유지되는 브랜치들을 말한다. feature, release, hotfix 브랜치가 여기에 해당된다.
기능을 개발하는 브랜치
새로운 기능 개발 및 버그 수정이 필요할 때 develop 브랜치로부터 분기해 만든다.
개발이 완료되면 다시 develop 브랜치에 merge시킨다.
이번 출시 버전을 준비하는 브랜치
출시를 위한 기능 개발이 완료되면, develop 브랜치로부터 생성한다.
이 브랜치에서는 출시를 위한 준비를 하는데, 새로운 기능 개발은 없고 버그 수정 등 출시 준비 작업만을 수행하기 위한 브랜치로 사용하는 것이다.
출시 버전에서 발생한 버그를 수정하는 브랜치
배포한 버전에 빠르게 수정해야 할 상황이 생겼을 때, master 브랜치에서 분기시킨다.
이 브랜치에서 변경된 사항은 develop 브랜치에도 merge시켜야 한다.
참고
- git 공식
- 팀장님의 멋진 발표 자료
- https://coding-groot.tistory.com/68 (git object type)
- https://storycompiler.tistory.com/7 (git object type)
- https://cyberx.tistory.com/81 (git object type)
- https://gmlwjd9405.github.io/2018/05/11/types-of-git-branch.html (브랜치 종류)