branch란?

Git은 데이터를 일련의 스냅샷으로 기록한다.

커밋을 하게되면 Git은 현재 Staging area에 있는 데이터의 스냅샷에 대한 포인터, 저자, 커밋 메시지 같은 메타 데이터와 이전 커밋에 대한 포인터 등을 포함하는 커밋 개체를 저장한다.

Git의 브랜치는 커밋 사이를 가볍게 이동할 수 있는 포인터같은 것이다.

branch0

위 이미지의 노란블록은 커밋, 초록블록은 브랜치를 나타낸다.

위의 이미지에서는 1874 커밋과 6231 커밋을 각각 브랜치가 기리키고 있어 브랜치를 통해 커밋사이를 이동할 수 있다.

브랜치의 이러한 특징으로 독립적으로 어떤 작업을 진행하기 위해 사용한다.

git branch

git branch 명령어를 실행하면 현재 만들어진 브랜치를 보여준다.

branch1

브랜치 옆에 *는 현재 사용중인 브랜치라는 뜻이다.

Git은 기본적으로 master 브랜치를 제공한다.

git branch exp 명령어를 실행하게 되면 exp라는 이름을 가진 브랜치가 생성된다.

브랜치를 이동하고 싶으면 git checkout [branch] 명령어를 실행하면 된다.

branch2

브랜치를 새로 만들때 생성한 브랜치는 현재 사용중인 브랜치를 그대로 복사한다(커밋내용도 포함)

git log –branches –graph –oneline

모든 브랜치의 log 를 비교하며 어디서부터 분기가 나누어졌는지 한눈에 볼 수 있다.

–oneline 은 간랸하게 보이게 해준다.

브랜치 별로 다른 작업을 해보자

현재 상황

  • master 브랜치에서 f1.txt파일 생성
  • master 브랜치를 기준으로 exp 브랜치를 만듦
  • exp 브랜치에서 f2.txt 파일 생성
  • exp 브랜치에서 f2.txt 파일 수정

    branch3

branch 병합

위의 상황에서 exp 브랜치의 내용을 master로 옮기자!

  1. master 브랜치에서 git merge exp

    branch4

  2. f1.txt 수정이라는 커밋을 exp는 가지고 있지 않는다. 그렇기에 exp 브랜치master 브랜치는 같은 내용을 담고 있지 않는다
  3. 두 브랜치를 동일하게 해주기 위해 exp 브랜치에서 git merge master

    branch5

  4. 두 브랜치는 완전히 동일해졌다.
  5. 이 경우 exp 브랜치는 필요가 없기에 git branch -d exp을 하여 exp 브랜치를 삭제해준다.

Fast-forwad

exp 브랜치에서 병합을 해주어었을 때는 새로운 커밋이 생기지 않았다.

하지만, master 브랜치에서 병합을 해주었을 때는 새로운 커밋이 생겼다.

그리고, exp 브랜치에서 병합을 해주었을 때 Fast-forwad라는 메세지가 생겼다.

하지만 master 브랜치에서 병합을 해주었을 때는 해당 메세지가 생기지 않았다.


위의 상황을 좀더 간결한 이미지로 그리면 아래와 같다.

branch7

master 브랜치에서 exp를 병합할경우 DB를 합치는 작업이 필요하다.

그렇기에 Git이 자동으로 DB를 합쳐 새로운 커밋을 생성을 한다.(커밋메세지는 우리가 작성 가능)

이 이후 exp 브랜치에서 master를 병합할 경우 exp브랜치는 이미 master 브랜치와 자신이 합쳐진 커밋을 가리키고 있으면 된다.

그렇기에 커밋을 생성할 필요가 없다.

이런 경우를 Fast-forwad라고 한다.

브랜치 충돌

Git은 우리가 같은 파일이여도 다른 위치를 수정하면 알아서 병합을 해준다.

하지만 같은 파일의 같은 위치를 수정하게 되면 자동으로 병합이 되지 않는다.

  • master 브랜치에서 f1.txt을 생성
    f1.txt
    (common)
    
  • master 브랜치를 기준으로 exp 브랜치 생성
  • exp 브랜치에서 f1.txt 파일 수정 및 커밋
    f1.txt
    (exp)
    
  • master 브랜치에서 f1.txt 파일 수정
    f1.txt
    (master)
    
  • mater 브랜치로 exp 브랜치 병합
      $ git merge exp
      Auto-merging f1.txt
      CONFLICT (content): Merge conflict in f1.txt
      Automatic merge failed; fix conflicts and then commit the result.
    

오류가 생기면서 자동으로 병합이 되지 않는다.

문제가 생긴 파일의 내부는

f1.txt
<<<<<< HEAD
(master)
=======
(exp)
>>>>>> exp

이처럼 바뀐다.

======을 기준으로 HEAD부분은 현재 사용중인 브랜치의 수정사항, exp부분은 exp 브랜치의 내용이다.

이후 우리가 필요한 부분은 수정해 커밋을 하면 병합이 완료된다.

댓글남기기