[GIT] GIT을 선택하다. - 2편 BRANCH활용하기

2021. 1. 11. 10:58 형상관리/Git

BRANCH활용하기

기본적으로 하나의 브랜치 즉 마스터브랜치(타:trunk)만 사용해도 버전관리 시스템이 제공하는 모든 이점을 얻을 수 있습니다.

BRANCH란?

우리는 일반적으로 여러가지 작업을 번갈아 가며 진행합니다. 새로운 기능을 추가하거나 유지보수가 쉽도록 리팩터링할 수도 있고 이따금씩 발생하는 버그를 수정하기도 합니다. 어떠한 작업도 무시할 수 없으며 적절히 균형을 마추며 진행해야 합니다. 단방향 이력은 이러한 요구를 다루리가 쉽지 않습니다. 그래서 브랜치가 필요합니다.

git에서는 모든 것이 브랜치로 간주되므로 브랜치를 생성하는 비용이 크지않습니다. 모든 파일을 새로운 디렉토리로 복사하는 다른 시스템들과는 다르게 git의 브랜치는 해당 브랜치가 만들어진 시점부터 적용된 커밋만 추적합니다. 최신 커밋에는 부모링크가 있고 이 링크를 사용하여 git은 브랜치에 있는 모든 변경사항을 찾을 수 있습니다.

하지만 브랜치를 생성할 시기를 결정하는 것이 가장 어려우므로 아래와 같은 가이드라인을 제시하겠습니다.

    • 실험적인 변경사항 : 성능이 향상되는지 알아보기 위해 알고리즘을 다시 작성하거나 코드의 일부를 특정 패턴으로 리팩토링으로 하려할때 브랜치를 생성하여 작업합니다.
    • 새로운 기능 : 새로운 기능을 추가할때마다 브랜치를 생성한다. 작업이 끝나면 브랜치를 합쳐십시요, 이때 브랜치의 전체 변경 이력을 가져오거나 모든 이력을 하나의 커밋으로 합칠 수 있습니다.
    • 버그수정 : 아직 릴리즈 하지 않은 코드의 버그거나 릴리즈 하려고 태그를 붙힌 코드의 버그에 상관없이 버그와 관련된 변경사항을 추적할 수 있도록 브랜치를 생성하십시요. 새로운 기능을 추가하는 브랜치와 마찬가지로 수정한 부분을 기존의 코드에 반영할 때 매우 유연해 집니다. 특히 수정한 버그에 확신이 서지 않을 경우 적합합니다.

새로운 브랜치 생성하기

1. 아래와 같은 명령어로 new라는 브랜치를 생성합니다.

git brach new

2. 생성됬는지 확인합니다.

git branch
*master
new

3. 새로운 new 브랜치가 생성됬음을 알 수 있습니다. master 브랜치 명 옆에 별표가 있음을 주의 깊게 보셔야 합니다. 별표는 해당 브랜치가 현재 체크아웃된 상태임을 의미합니다. 체크아웃된 브랜치는 현재 작업트리를 나타내는 브랜치가 됩니다. 새 브랜치를 사용하기 위해서는 체크아웃해야합니다. 다음과 같이 checkout 명령어를 사용하여 브랜치를 체크아웃 합니다.

git checkout new
Switched to branch 'new'

4. 다시 현재 체크아웃된 브랜치를 확인한다.

git branch
master
*new

5. 위의 방식은 브랜치를 생성하고 체크아웃 했습니다. 하지만 대부분 브랜치를 생성할때 새로운 브랜치로 바로 체크아웃 하려 할 것입니다. git checkout -b를 실행하여 브랜치 생성과 체크아웃을 동시에 진행할 수 있습니다.

git checkout -b new2 master
Switched to a new branch 'new2'

6. 세번째 매개변수 master를 눈여겨 봐야합니다. 추가한 매개변수는 git이 현재 브랜치 대신 master브랜치로 부터 새로운 브랜치를 생성하도록 합니다.

브랜치간의 변경사항 병합하기

브랜치 간의 변경사항을 합치는 방법에는 몇 가지가 있는데 대표적으로 세가지가 있습니다.

    • 바로합치기(straight merge) : 하나의 브랜치와 다른 브랜치의 변경 이력 전체를 합칩니다.
    • 커밋합치기(squashed commit) : 한 브랜치의 이력을 압축하여 다른 브랜치의 최신 커밋 하나로 합칩니다.
    • 선택합치기(cherry picking) : 다른 브랜치에서 하나의 커밋을 가져와 현재 브랜치에 적용 합니다.

브랜치 충돌 다루기 

1. git 에서 자동으로 합칠수 없는 경우를 충돌이라 합니다. 충돌은 각 브랜치에서 파일의 동일한 영역을 다르게 변경할 경우 흔히 나타납니다. 충돌이 발생했을시 아래와 같은 오류 메시지가 나타납니다.

git merge about2
Auto-merged about.html
CONFLICT(content):Merge conflict in about.html
Automatic merge failed; fix conflicts and then commit the result.

2. 위의 에러메시지를 유심히살펴보면 about.html이라는 파일에서 충돌이 난 것을 알 수 있습니다. 충돌한 about.html을 열어보면 아래와 같은 모양으로 나타날 것입니다.

<li>Objective C</li>
<<<<<<< HEAD:about.html
<li>Javascript</li>
========
<li>ECMAScript</li>
>>>>>>>> about2:about.html

3. «««« 은 현재 브랜치의 코드이고 ======= 는 구분자이며 »»»» 이 앞에 나오는 코드는 다른 브랜치의 코드를 나타냅니다. 이럴경우 손수 중복코드를 제거하고 커밋할 수도 있고 git mergetool을 이용하여 제거할 수도 있습니다. 이 명령어는 merge도구를 사용하는데 적합한도구에는 kdiff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, opendiff가 있습니다. 대표적으로 리눅스에는 kdiff(http://kdiff3.sourceforge.net)가 있고 OS X에는 opendiff가 있습니다. 머지는 아래와 같이 진행합니다.

git mergetool

4. 머지가 완료되면 커밋 합니다.

git commit

브랜치 삭제하기

브랜치는 쓰임새가 다한 이후에도 남아 있을 수 있습니다. 필요없는 브랜치는 저장소의 브랜치의 갯수가 늘지 않도록 삭제해야 합니다. git branch 명령어에 -d 매개변수를 지정하여 삭제할 수 있습니다. -d의 브랜치 삭제명령은 삭제하려는 브랜치가 현재 브랜치에 성공적으로 merge가 된 상태일때만 동작합니다. 만일 현재 브랜치와 삭제하려는 브랜치르르 합치지 않고 삭제한다면 -D를 전달인자로 사용하여 강제 삭제할 수 있습니다.



출처: https://redgolems.tistory.com/6?category=481635 [레드골렘즈 콤비의 개발이야기]