Git Branch (local/remote)

똘이주인·2021년 8월 5일
0

branch는 단어 그대로하면 나뭇가지 라는 뜻이고 생각해보면 나뭇가지는 중심이 되는 줄기에서 사방으로 뻗은 모양새 라고 생각할 수 있다. git에서의 branch도 크게 다른의미는 아니다.

중심이 되는 branch가 있고 여기서부터 양옆(물론 방향성과는 크게 상관은 없다.)으로 뻗어나가는 잔가지들이 있다. 그럼 이런걸 왜 쓰는가? branch를 만든다는 것은 프로젝트를 함에 있어서 독립적인 공간을 새로이 만드는 것이다.

보통 기본적으로 있는 branch를 master브런치라고 하는데 사용자가 branch명령어를 이용해서 여러개의 branch를 만들 수 있다.


또한 이렇게 만들어진 브랜치는 다른 브랜치와 병합(Merge)함으로써, 작업한 내용을 다시 새로운 하나의 브랜치로 모을 수 있다.

아래 그림을 보면, 브랜치를 사용하여 동시에 여러 작업을 진행할 때의 작업 흐름을 한눈에 파악할 수 있다.


여러 명이서 동시에 작업을 할 때에 다른 사람의 작업에 영향을 주거나 받지 않도록, 먼저 메인 브랜치에서 자신의 작업 전용 브랜치를 만든다. 그리고 각자 작업을 진행한 후, 작업이 끝난 사람은 메인 브랜치에 자신의 브랜치의 변경 사항을 적용한다. 이렇게 함으로써 다른 사람의 작업에 영향을 받지 않고 독립적으로 특정 작업을 수행하고 그 결과를 하나로 모아 나가게 된다. 이러한 방식으로 작업할 경우 '작업 단위', 즉 브랜치로 그 작업의 기록을 중간 중간에 남기게 되므로 문제가 발생했을 경우 원인이 되는 작업을 찾아내거나 그에 따른 대책을 세우기 쉬워진다.

브런치 사용

  1. 새 브런치 생성하기

    git branch 명령으로 새로운 브랜치를 만들 수 있습니다.

    기존에 작업하고 있던 master 브랜치에서 testing 이라는 브랜치를 만든다.

    $ git branch testing

한 커밋 히스토리를 가리키는 두 브랜치

지금 작업 중인 브랜치가 무엇인지 Git은 어떻게 파악할까?

다른 버전 관리 시스템과는 달리 Git은 HEAD 라는 특수한 포인터가 있다. 이 포인터는 지금 작업하는 로컬 브랜치를 가리킨다. 브랜치를 새로 만들었지만, Git은 아직 master 브랜치를 가리키고 있다. 이렇듯 git branch 명령은 브랜치를 만들기만 하고 HEAD가 가리키는 브랜치를 옮기지 않는다.

현재 작업 중인 브랜치를 가리키는 HEAD
  1. 브랜치 이동하기

    git branch 명령은 브랜치를 생성할 뿐 HEAD 가 가리키는 브랜치를 옮기지는 않는다고 했다.

    그렇다면 브랜치는 어떻게 이동할 수 있을까?

    git checkout 명령으로 다른 브랜치로 이동할 수 있다.

    $ git checkout testing
    
    // HEAD는 testing 브랜치를 가리킨다

HEAD가 testing 브랜치를 가리킴
java
$ vim test.rb
$ git commit -a -m 'made a change'

HEAD가 가리키는 testing 브랜치가 새 커밋을 가리킴

새로 커밋해서 testing 브랜치는 앞으로 이동했다. 하지만, master 브랜치는 여전히 이전 커밋을 가리킨다. 그럼 이번엔 master 브랜치로 되돌아가본다.
    java
    $ git checkout master

HEAD가 checkout 한 브랜치로 이동함

방금 실행한 명령이 한 일은 두 가지이다

**`master`** 브랜치가 가리키는 커밋을 HEAD가 가리키게 하고, 워킹 디렉토리의 파일도 그 시점으로 되돌려 놓았다. 앞으로 커밋을 하면 다른 브랜치의 작업들과 별개로 진행되기 때문에 **`testing`** 브랜치에서 임시로 작업하고 원래 **`master`** 브랜치로 돌아와서 하던 일을 계속할 수 있다.

브랜치를 이동하면 워킹 디렉토리의 파일이 변경된다.

이전에 작업했던 브랜치로 이동하면 워킹 디렉토리의 파일은 그 브랜치에서 가장 마지막으로 했던 작업 내용으로 변경됩니다. 파일 변경시 문제가 있어 브랜치를 이동시키는게 불가능한 경우 Git은 브랜치 이동 명령을 수행하지 않는다.

이번에는 **`master`** 브랜치에서 파일을 수정하고 커밋을 해본다.
   java
    $ vim test.rb
    $ git commit -a -m 'made other changes'
이렇게 되면 프로젝트 히스토리는 분리되어 진행한다.(브랜치가 갈라진다.)

두 작업 내용은 서로 독립적으로 각 브랜치에 존재합니다. 커밋 사이를 자유롭게 이동하다가 때가 되면 두 브랜치를 Merge 하면 된다.

갈라지는 브랜치

실제로 Git의 브랜치는 어떤 한 커밋을 가리키는 40글자의 SHA-1 체크섬 파일에 불과하기 때문에 만들기도 쉽고 지우기도 쉽다. **새로 브랜치를 하나 만드는 것은 41바이트 크기의 파일을(40자와 줄 바꿈 문자) 하나 만드는 것에 불과하다.**

브랜치가 필요할 때 프로젝트를 통째로 복사해야 하는 다른 버전 관리 도구와 Git의 차이는 극명하다. 통째로 복사하는 작업은 프로젝트 크기에 따라 다르겠지만 수십 초에서 수십 분까지 걸린다. 그에 비해 Git은 순식간이다.

게다가 커밋을 할 때마다 이전 커밋의 정보를 저장하기 때문에 Merge 할 때 어디서부터(Merge Base) 합쳐야 하는지 알수있다. 이런 특징은 개발자들이 수시로 브랜치를 만들어 사용하게 한다.

0개의 댓글