💻Codeit에서 교육하는 커리큘럼을 바탕으로 정리하였다.
브랜치란 하나의 코드 관리 흐름을 뜻한다. Git은 나무 뿌리처럼 root commit
을 시작으로 가지가 갈라지는 나무 모양이라 생각하면 편한데, 가지 하나하나를 브랜치
라 부른다.
예를 들면 하나의 프로그램이라도 유료와 무료버전이 있을 수 있다. 이런 경우 하나의 뿌리에서 유료와 무료의 브랜치
를 만들어서 버전을 관리하는 경우가 있을 수 있다.
$ git status
터미널에서 git status
커맨드를 입력하면 main
브랜치 위에 있다라고 표시가 뜬다. 레포지토리를 만들고 커밋을 하면 자동으로 생기는 브랜치를 말한다. 프로젝트 버전관리를 하려면 최소한 하나의 코드관리흐름이 있어야 할 것이다.
$ git branch [만들고자하는 이름]
$ git checkout [가고 싶은 브랜치 이름]
먼저 현재 존재하는 모든 브랜치를 조회
하는 방법을 알아보자.
$ git branch
존재한 브랜치들을 확인해보았다면 브랜치를 새로 만들거나
, 삭제하는 방법
, 새로 만든 브랜치로 바로 이동하는 방법
도 알아보자.
$ git branch [만들고자 하는 이름]
$ git branch -d [삭제하고자 하는 이름]
$ git chectout -b [만들고자 하는 이름]
앞서 나는 main
, premium
브랜치 2가지를 작업할 때 사용하였다. 이때 premium branch
에 main branch
로 합칠 때
$ git checkout premium
$ git merge main
하지만 merge를 할 때 conflict가 발생할 수도 있다. premium branch
와 main branch
의 작업이 달랐다고 가정해보자. 파일을 확인해보면
이렇게 가운데 ======
을 기준으로 conflict된 것을 확인할 수 있다.
그렇다면 conflict를 해결할 방법은 무엇이 있을까?
git add .
, git commit
을 하는 방법Merge branch 'main' into premium
메세지가 입력된 것을 볼 수 있다.$ git merge --abort
보통 하나의 프로젝트를 진행할 때 주로 여러 개발자들이 참여하는데, 하나의 프로젝트에는 여러 개발자들이 업무를 분할하여, 각 본인의 브랜치에 자신이 맡은 역할을 작업 한 뒤에 최종적으로 merge하여 프로젝트를 완성한다. 이 과정에서 다른 개발자들간의 코드 내용이 조금씩 틀려 충돌이 자주 발생한다.
$ git remote add origin https://github.com/JoonyyyI/Math_Box.git
origin
이라는 이름으로 등록하겠다라는 의미로 새로운 리모트 레포지토리를 등록할 때 우리가 origin
이라는 이름으로 가리키는 것은 관례화
되어 있는 것이다. 원하는 이름을 사용해도 되지만 관례를 따르도록 하자.
$ git push -u origin main
이 커맨드의 뜻은
-u
옵션은 --set-upstream
이라는 옵션의 약자tracking
하는 걸로 설정된다.tracking
이라는 건 로컬 레포지토리의 한 브랜치가 리모트 레포지토리의 한 브랜치와 연결되는데 이렇게 맺어진 연결 상태를 tracking connection
이라고 한다.로컬 레포지토리에서 리모트 레포지토리로 push
하고 히스토리 확인시 하나로 합쳐져 있는 것을 확인할 수 있다.
하지만 다시 premium
으로 checkout
한 후 git push
를 하면 오류가 발생한다.
$ git push --set-upstream origin premium
이 커맨드 입력 후 GitHub
를 확인하면 새로운 브랜치가 생긴 것을 확인할 수 있다.
branch
는 프로젝트에서 코드를 관리하는 하나의 흐름인데, 사실 branch
도 어떤 커밋을 가리키는 존재로 포인터라 부를 것이다. 새로운 커밋을 할 때마다 main 브랜치는 새로운 커밋을 가리킨다.
HEAD
도 어던 커밋을 가리키는 존재로 포인터라 부르는데, 명확히 하자면 HEAD
는 어떤 branch
를 가리키는 것이다. 그 branch
가 working directory
가 된다는 의미기도 하다.
git reset | git checkout |
---|---|
HEAD가 가리키던 브랜치가 다른 커밋을 가리키도록 한다 | HEAD 자체가 다른 커밋이나 브랜치를 가리키도록 한다 |
HEAD도 결국 간접적으로 다른 커밋을 가리키게되는 효과가 생긴다 | 브랜치를 통하지 않고, 커밋을 직접적으로 가리키는 HEAD를 Detached HEAD라고 한다. |
오늘 배운 브랜치의 개념은 조금 어렵다. 그래도 한번 정리했다는 데 의미를 갖고 실무경험을 통해 branch
, HEAD
차이점을 이해해보고, merge
를 할 때 오류도 경험해보면서 이해해보도록 노력하자!