
💻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를 할 때 오류도 경험해보면서 이해해보도록 노력하자!