yoongrammer

git 브랜치(branch) 란? 본문

VCS (Version Control System)/git

git 브랜치(branch) 란?

yoongrammer 2020. 11. 18. 22:08
728x90

목차

    git 브랜치(branch) 란?


     

    브랜치는 커밋 개체(object) 사이를 가볍게 이동할 수 있는 포인터 같은 것입니다.

     

    커밋을 하면 git 저장소에는 커밋 개체, 트리 개체, blob 이 저장됩니다.

     

    커밋 개체는 아래 정보를 가지고 있습니다.

    • 커밋 메시지 같은 메타데이터
    • 이전 커밋에 대한 포인터 정보
    • 트리 개체를 가리키는 포인터 정보
    • author, committer 정보

    트리 개체는 add 된 파일과 디렉터리 구조가 들어 있습니다.

     

    Blob은 git 저장소에 저장된 파일입니다.

     

    파일 세 개를 add 하여 커밋을 하면 git 저장소에는 다섯 개의 데이터 개체가 생깁니다.

    (커밋 개체 하나, 트리 개체 하나, blob 세 개)

    $ git add README test.rb LICENSE
    $ git commit -m 'The initial commit of my project'
    참고: https://git-scm.com/

    다시 파일을 수정하고 커밋을 하면 커밋 개체는 이전 커밋을 가리키는 포인터도 저장하게 됩니다.

    참고: https://git-scm.com/

    git의 브랜치를 사용하면 위와 같은 여러 커밋 개체 사이를 가볍게 이동할 수 있습니다.

    브랜치가 필요할 때 프로젝트를 통째로 복사해야 하는 다른 버전 관리 도구와는 다르게 Git의 브랜치는 어떤 한 커밋을 가리키는 체크섬 파일에 불과하기 때문에 만들기도 쉽고 지우기도 쉽습니다.

     

    기본적으로 git은 master 브랜치를 만듭니다.

    브랜치 생성하기


    git branch <branchname> 명령으로 브랜치를 생성할 수 있습니다.

    $ git branch testing

    새로 만든 브랜치는 지금 작업하고 있던 마지막 커밋을 가리키게 됩니다.

     

    git은 현재 작업하는 로컬 브랜치를 가리키는 HEAD라는 특수한 포인터가 있습니다.

    git branch 명령은 브랜치를 만들기만 하고 HEAD를 옮기지는 않습니다.

    참고: https://git-scm.com/

    브랜치 이동하기


    git checkout <branch> 명령으로 HEAD를 다른 브랜치로 옮길 수 있습니다.

    $ git checkout testing

    위 명령을 수행하면 HEAD는 testing 브랜치를 가리키게 됩니다.

    참고: https://git-scm.com/

    여기서 새로 커밋을 한다면 HEAD가 가리키는 testing 브랜치가 새 커밋을 가리키게 됩니다.

    $ vim test.txt
    $ git add test.txt
    $ git commit -m 'made a change'
    참고: https://git-scm.com/

    브랜치 변경시 아직 커밋하지 않은 파일이 checkout 할 브랜치와 충돌 나면 브랜치를 변경할 수 없으니 워킹 디렉터리를 정리하는 것이 좋습니다.

     

    git checkout -b <branchname> 명령을 사용하면 브랜치를 생성하고 checkout 하는 작업을 한 번에 할 수 있습니다.

    $ git checkou -b testing
    // 아래 명령과 동일하다
    $ git branch testing
    $ git checkout testing

    브랜치 합치기


    git merge 명령은 브랜치를 합칠 때 사용합니다.

    $ git merge testing

     

    git merge에는 Fast-forward, 3-way Merge 두 가지 방식이 있습니다.

    Fast-forward

    • 브랜치 포인터를 Merge 과정없이 최신 커밋으로 이동하는 방식입니다.
    • 현재 브랜치가 가리키는 커밋이 Merge 할 브랜치의 조상일 경우 사용합니다.

    위 그림에 master에서 testing이나 hotfix 브랜치를 merge 한다면 fast-forward 방식으로 merge를 합니다.

    hotfix와 testing 브랜치가 master 브랜치를 가리키고 있기 때문에 입니다.

     

    testing 브랜치를 merge 할 경우 아래 그림처럼 됩니다.

    $ git merge testing

    3-way Merge

    • fast-forward가 아닌 경우에는 3-way Merge 방식을 사용합니다.
    • 단순히 브랜치 포인터를 최신 커밋으로 옮기는 것이 아니라 3-way Merge 의 결과를 별도의 커밋으로 만들고나서 해당 브랜치가 그 커밋을 가리키도록 이동 시킵니다.

    위 그림에 master에서 hotfix를 merge 한다면 3-way Merge 방식으로 merge를 합니다.

    hotfix 브랜치는 master 브랜치를 가리킬 수 없기 때문입니다.

     

    master에서 hotfix를 merge 할 경우 아래 그림처럼 됩니다.

    $ git merge hotfix

    브랜치 삭제


    git branch -d <branchname> 명령으로 브랜치를 삭제할 수 있습니다.

    보통 merge 이후 브랜치가 필요 없을 때 사용합니다.

    $ git branch -d testing
    728x90
    Comments