[Git] Branch

Happy_Nerd·2021년 3월 15일
0

Git

목록 보기
3/5
post-thumbnail

Branch

독립적으로 작업을 진행하기 위한 개념. commit 사이를 이동할 수 있는 포인터 같은 것.

git을 사용하면서 브랜치를 생성해서 작업하는데 브랜치의 정확한 정의에 대해 찾아본 적은 없던 것 같다.
그래서 검색해봤는데, 뭔가 내가 생각했던 정의보다는 조금 추상적인 느낌이긴 하지만..
브랜치 생성을 통해 기존에 작업하던 코드에서 독립적으로 떨어져서 작업할 수 있게 되고, 독립적인 브랜치 히스토리를 갖게 된다.

브랜치의 특징

  • 각 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행할 수 있다.
  • 다른 브랜치와 병합(merge)하여 작업한 내용을 새로운 하나의 브랜치로 모을 수 있다.
  • 브랜치를 생성하여 작업의 기록을 남길 수 있으므로 문제가 발생했을 경우 원인이 되는 작업을 찾아낼 수 있다.

git의 동작 원리

git의 commit은 변경사항을 모두 기록하는 것이 아니라 스냅샷으로 기록한다.

git add README test.rb LICENSE
git commit -m 'initial commit'

파일 3개를 add로 스테이징 후 commit을 한다고 했을 때, 다음과 같이 진행된다.

  1. 추가한 파일들의 blob을 생성.
  2. 루트 디렉토리와 하위 디렉토리의 트리 개체를 체크섬과 함께 저장소에 저장.
  3. 커밋 개체 생성.
  4. 메타 데이터와 루트 디렉토리 트리 개체를 가리키는 포인터 정보(스냅샷)를 커밋 개체에 넣어 저장.

이후 새로 생성된 커밋은 현재 트리 개체부모 커밋 개체(이전 커밋)의 정보를 저장한다.

git은 최초로 commit을 하면 mater라는 이름의 브랜치를 만들어서 자동으로 가장 마지막 commit을 가리키게 한다.
=> branch가 포인터 같은 것이라고 하는 이유!

git에는 HEAD라는 특수한 포인터가 존재하는데, 이 포인터는 지금 작업하는 브랜치를 가리키는 포인터이다.
git checkout 명령어를 통해 브랜치를 이동하는데, checkout할 때 움직이는 것이 바로 이 HEAD 포인터이다.
브랜치의 포인터가 아닌 일반적인 commit 파일을 가리키게 할 수도 있는데 이러한 경우를 detached HEAD라고 표현한다.

branch, commit, HEAD 총 3개의 포인터가 있다고 생각하면 될 것 같다!

git의 4가지 오브젝트 타입

git은 파일을 관리하기 위해 object를 생성하는데, object에는 4가지 타입이 있다.
해당 object들은 .git/objects폴더에 저장된다.

object로 만들어 관리할 때 체크섬의 앞부분 두 글자를 폴더명으로, 나머지를 파일명으로 해서 저장하여 관리한다.
git cat-file -p [오브젝트 SHA-1값]명령어로 오브젝트 파일의 내용을 확인할 수 있다.

blob (binary large object) 타입

파일의 이름이나 형식 등 파일의 메타 데이터는 저장되지 않고 파일의 내용만 저장해서 blob타입의 object를 생성한다. 사이즈는 컨텐츠의 용량이 byte로 표시된다.

tree 타입

tree object는 파일의 내용을 저장하고 있는 blob object를 모아놓기 위한 object라고 할 수 있다.

tree의 컨텐츠는 해당 디렉토리 내부의 파일과 디렉토리의 정보(파일명, 형식, SHA-1 등)를 담은 blob과 tree object의 리스트이다.

tree 객체는 하위 디렉토리의 트리 객체를 참조할 수 있고
blob 객체는 한 디렉토리에 있는 모든 blob을 담고 있다. 객체에 대한 접근 권한, 파일 이름은 여기서 관리한다.

commit 타입

tree의 SHA-1값, parent object의 SHA-1값, author, committer, commit message를 포함하고 있다.

tree의 SHA-1값은 해당 commit의 스냅샷의 최상단 tree를 가리키는 포인터이다.
parent는 두번째 commit부터 확인해볼 수 있는데, 해당 commit의 바로 직전 commit의 SHA-1값이다.

tag 타입

git의 특정 commit에 tag를 달면 tag object가 생성된다. 객체 종류, 태그 이름, tagger, 태그 메세지, PGP 서명정보가 담겨있다.

Branch 종류

일반적으로 5개의 브랜치로 운영을 한다고 하는데, 프로젝트의 성격이나 팀마다 다르게 운영할 수 있다.

메인 브랜치

항상 유지되는 브랜치를 메인 브랜치라고 한다. master, develop 브랜치가 여기에 해당된다.

Master

제품으로 출시될 수 있는 브랜치

배포(release)이력을 관리하기 위해 사용, 즉 배포 가능한 상태만을 관리한다.

Develop

다음 출시 버전을 개발하는 브랜치

기능 개발을 위한 브랜치들을 병합하기 위해 사용한다.
이 브랜치를 기반으로 개발을 진행하고,모든 기능이 추가되고 버그가 수정되어 배포 가능한 안정적인 상태라면
develop 브랜치를 master 브랜치에 merge시킨다.

보조 브랜치

일정 기간 동안만 유지되는 브랜치들을 말한다. feature, release, hotfix 브랜치가 여기에 해당된다.

Feature

기능을 개발하는 브랜치

새로운 기능 개발 및 버그 수정이 필요할 때 develop 브랜치로부터 분기해 만든다.
개발이 완료되면 다시 develop 브랜치에 merge시킨다.

Release

이번 출시 버전을 준비하는 브랜치

출시를 위한 기능 개발이 완료되면, develop 브랜치로부터 생성한다.
이 브랜치에서는 출시를 위한 준비를 하는데, 새로운 기능 개발은 없고 버그 수정 등 출시 준비 작업만을 수행하기 위한 브랜치로 사용하는 것이다.

Hotfix

출시 버전에서 발생한 버그를 수정하는 브랜치

배포한 버전에 빠르게 수정해야 할 상황이 생겼을 때, 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 (브랜치 종류)

0개의 댓글