git을 이용해 프로젝트를 진행할 때 기본적으로 'master'라는 프로젝트의 원본이 되는 브랜치를 이용해 작업을 하는데, 공동작업이나 안전성을 위해 Branch라는 것을 만들어 작업하기도 한다.


branch ?

프로젝트를 진행하면서 해당 진행사항을 commit할 확신이 없는, 또는 취소될 수 있는 여지가 있는 사항을 진행할 경우 실험적인 작업으로 실행하여 추 후 commit하거나 취소하는 작업을 조금 더 쉽게 할 수 있도록 하는 하나의 작업 영역

  • 프로젝트를 통째로 복사하여 실험용으로 만들어도 되겠지만, 원본과 합치는 작업이 번거롭기 때문에 branch를 생성하여 git으로 병합하면 이를 편하게 작업할 수 있는것이다.

  • 또한 공동작업의 경우 팀원들이 각각 branch를 만들어 작업하기 때문에 협업에 있어 가장 중요한 부분이기도 하다.

branch 만들기

브랜치는 기본적으로 작업 진행 전 미리 만들어두고 진행을 해야한다. 즉, 원본의 복사본을 만들어두고 작업하는 것과 비슷한 효과이다.

  • 브랜치를 만들기 위해 'Branch'버튼을 클릭하고 브랜치 이름 설정 후 만들면 된다.
    기본적으로 git의 branch에는 ‘master’가 있는데, 이 master또한 브랜치 이며 원본작업을 하는 공간이다.
    따라서 branch에서 작업한 내용은 병합될 때 까지 master에 아무런 영향을 주지 않는다.

여러 브랜치를 만들어 작업할 경우 브랜치는 각각의 복사본이라 생각하면 되기 때문에 브랜치 변경 시 실제 깃이 관리하는 프로젝트 또한 해당 브랜치 작업에 맞게 다시 재셋팅 된다.
또한 Log/History에서 여러 브랜치 작업에 대한 그래프 표현으로 어디서 출발한 브랜치인지 알 수 있다.

branch merge(병합)

여러 브랜치에서 작업하고 있을 경우 각각의 브랜치마다 상태가 다르기 때문에 이를 최종적으로는 합쳐줘야 하는데 이를 merge라고 한다.

  • master브랜치로 변경 후 합치고자 하는 브랜치를 오른쪽 클릭 후
    'merge [브랜치명] into current branch'를 클릭하게 되면 해당 브랜치가 master로 병합된다.

  • 또한 병합과 동시에 자동 commit되어 저장된다.
    ( 병합된 상태를 Log/History탭에서 그래프로 확인할 수 있으며, master브랜치에 국한된 것만은 아니다. )

충돌(conflicts)해결

서로 다른 브랜치를 병합할때 git이 알아서 합쳐주지만, 종종 충돌이 발생되어 충돌 발생지점에 대한 직접적인 수정이 필요할 때가 있다.

  • 브랜치들을 서로 merge할 때 서로 다른 부분을 수정 하게 될 경우 문제가 발생하지 않지만, 서로 같은 부분을 수정하게 되었을 경우 충돌이 발생하게 되며 수정사항을 사용자에게 맡기게 된다.
    ( 단 commit되지 않은 branch는 병합할 수 없다. )

ex ) 충돌발생 예

<<<<<<< HEAD
마스터가작업
=======
실험2 작업
>>>>>>> 실험2

merge시 충돌이 일어나게 되면 코드가 위와 같은 식으로 바뀌게 되는데,
‘=====’를 기준으로 '< < < < <HEAD'까지가 현재 브랜치의 작업이며,
'> > > > >실험2'까지가 실험2브랜치의 작업이다.


  • 따라서 사용자가 이 정보를 확인한 후 알맞게 수정한 이후 소스트리에서 해당 파일을 확인해보면
    ‘!’ 아이콘으로 표시가 되는데 깃에게 해당 파일의 병합작업 충돌사항을 수정 완료하였다는 사실을 알려줘야 한다.

  • 이를 알리려주기 위해서는 해당 파일을 오른쪽 클릭한 후 Resolve Conflicts"-> "Mark Resolved"를 클릭하면 자동으로 해당 파일이 staged상태로 올라가게 되며, commit할 시 자동으로 설명을 달아주게 된다.

“Resolve Confilicts”메뉴에 보면 Resolve Using ‘Mine’ 와 Resolve Using ‘Theirs’가 있는데
Resolve Using 'Mine'은 현재 브랜치의 작업을 남겨두고 충돌이 발생한 병합코드를 지우는 것이고,
Resolve Using 'Theris'는 병합한 브랜치의 작업을 남겨두고 충돌이 발생한 현재 브랜치코드를 지우는 것이다.

충돌의 최소화

merge의 충돌은 위처럼 단순한 경우만 있는것이 아니라 프로젝트의 범주가 커질 경우 심각한 충돌이 발생할 수도 있는데 이를 최소화 하기 위해서는 브랜치의 작업에서 master브랜치와 주기적으로 동기화하여 충돌사항을 줄여나가야 한다.

master브랜치와 동기화

master가 아닌 브랜치에서 작업을 하게 될 때 작업하기 전 최신 master버전과 동일한 상태를 만들기 위해 master와 동기화 해야하는데 이는 브랜치의 merge와 동일한 방식으로 하면된다.
단, master가 merge하는것이 아닌 브랜치가 master를 병합하는 것이기 때문에 작업할 브랜치를 선택하고 master를 오른쪽 클릭하여 “Merge master into current branch”를 클릭한다.
이런식으로 작업을 한 이후 버전이 확실해 지면, 다시 master로 병합하여 새로운 버전을으로 업데이트하면 된다.