브랜치(branch)
모든 버전 관리 시스템은 브랜치를 지원한다. 개발을 하다 보면 코드를 여러개로 복사해야 하는 일이 자주 생긴다. 코드를 통째로 복사하고 나서 원래 코드와는 상관없이 독립적으로 개발을 진행할 수 있는데, 이렇게 독립적으로 개발하는 것이 브랜치다.
Git의 브랜치는 매우 가볍고 순식간에 브랜치를 새로 만들고 브랜치 사이를 이동하고 Merge 할 수 있다.
Git의 브랜치는 커밋 사이를 가볍게 이동할 수 있는 어떤 포인터 같은 것이다. 기본적으로 Git은 master 브랜치를 만든다. 최초로 커밋하면 Git은 master라는 이름의 브랜치를 만들어서 자동으로 가장 마지막 커밋을 가리키게 한다.
testing이라는 브랜치를 만들어 보자.
git branch testing
새로 만든 브랜치도 지금 작업하고 있던 마지막 커밋을 가리킨다.
지금 작업 중인 브랜치가 무엇인지 Git은 어떻게 알까? Git은 'HEAD'라는 특수한 포인터가 있다. 이 포인터는 지금 작업하고 있는 로컬 브랜치를 가리킨다. 브랜치를 새로 만들었지만, Git은 아직 master 브랜치를 가리키고 있고 HEAD도 master 브랜치를 가리키고 있다.
git log
명령에 --decorate
옵션을 사용하면 쉽게 브랜치가 어떤 커밋을 가리키는지 확인할 수 있다.
git log --oneline --decorate
f30ab (HEAD, master, testing) add feature #32 - ability to add new
34ac2 fixed bug #1328 - stack overflow under contain conditions
'master'와 'testing'이라는 브랜치가 f30ab 커밋 옆에 위치하여 이런 식으로 브랜치가 가리키는 커밋을 확인할 수 있다.
다음과 같이 testing 브랜치로 이동한다.
git checkout testing
이렇게 하면 HEAD는 testing 브랜치를 가리킨다.
그리고 파일을 수정해서 커밋을 해보자.
vi test.txt
git commit -am 'made a change'
HEAD가 가리키는 testing 브랜치가 새 커밋을 가리킨다. 하지만 master 브랜치는 여전히 이전 커밋을 가리킨다. master 브랜치로 되돌아 가면,
git checkout master
결과는 다음과 같다.
master 브랜치가 가리키는 커밋을 HEAD가 가리키게 하고 워킹 디렉토리의 파일도 그 시점으로 되돌려 놓았다. 앞으로 커밋을 하면 다른 브랜치의 작업들과 별개로 진행되기 때문에 testing 브랜치에서 임시로 작업하고 원래 master 브랜치로 돌아와서 하던 일을 계속할 수 있다.
다시 파일을 수정하고 커밋을 해보자.
vim test.txt
git commit -am 'made other changes'
프로젝트 히스토리가 분리돼 진행한다. 우리는 브랜치를 하나 만들어 그 브랜치에서 일을 좀 하고, 다시 원래 브랜치로 되돌아와서 다른 일을 했다. 두 작업 내용은 서로 독립적으로 각 브랜치에 존재한다. 커밋 사이를 자유롭게 이동하다가 때가 되면 두 브랜치를 Merge 한다.
토픽 브랜치
토픽 브랜치는 이름처럼 하나의 토픽(주제)에만 집중하는 브랜치로, 다른 작업은 일절 하지 않는다. 일반적으로 개발할 때는 이러한 토픽 브랜치를 여러 개 작성해서 사용한다. 그리고 이와는 별도로 언제라도 배포할 수 있는 안정된 브랜치는 항상 따로 준비해 두는데 master 브랜치가 바로 이 안정된 브랜치이다.
위에서 testing 브랜치를 만들었는데 이 브랜치는 특정 기능을 구현하기 위한 토픽 브랜치이다. 따라서 특정 기능 이외의 작업을 일절하지 않는다.
토픽 브랜치에서는 특정한 주제를 기반으로 해야만 개발이 이루어진다. 그리고 해당 주제와 관련된 개발이 모두 달성되면 master 브랜치와 다시 합쳐준다. 이런 개발 플로우를 사용하면 master 브랜치는 언제라도 다른 사람이 보고 사용할 수 있다.
통합 브랜치
토픽 브랜치를 나누고, 통합하는 공간이 바로 통합 브랜치이다. 일반적으로 master 브랜치를 통합 브랜치로 사용한다. 통합 브랜치는 토픽 브랜치에서의 개발이 완료되고 합쳐지는 부분이므로 개발이 실제로 이루어지는 브랜치는 아니다. 따라서 어중간한 변경 사항이 없으므로 남에게 언제나 공개해도 괜찮은 브랜치이다.