[Git] git branch
카테고리: Git
들어가기에 앞서
이 글은 victorydntmd님 블로그의 git branch
포스트를 거의 대부분 참고한 글입니다. git branch
와 git merge
를 이 분 블로그에서 공부했습니다. 이해가 쏙쏙 잘 되게 설명을 너무 잘해주셔서.. ㅠㅠㅠ 출처는 이 분 블로그임을 밝히며 개인적인 필기를 남기기 위한 용도로 이 분의 블로그 글을 정리하는 것임을 밝힙니다. git branch
설명은 링크 남긴 이 분의 블로그에서 보시는 것을 추천드립니다! (훨씬 설명이 잘 되어있음!!!)
branch
Git에서 브랜치는 독립적인 Working Directory 를 의미한다. 현재의 버전으로 다른 버전(기존 코드를 복사해와 완전히 새로운 독립 공간을 만듬)을 만들어서 가지를 쳐보는 것이다. 여러가지 버전의 브랜치를 만들어 보고 이를 합치는 식으로 작업한다. 분기를 만드는 브랜치 생성을 통해 동일한 소스코드를 기반으로 서로 다른 버전을 만들거나, 서로 다른 작업을 할 수 있다.
사용 용도 & 전략
- 다른 방식의 코드로 테스트해보기 위해 테스트 버전을 만들
branch
를 만든다. - 백업 해두기 위해
branch
를 만든다. - ✨협업시 각각의 Collaborator 마다 본인만의
branch
를 따로 만들어서 각자 작업을 완료한 후 이를master branch
에 merge 하여 병합하는 식의 작업을 한다.✨ 팀원들 각각 독립적이고 서로 영향을 주지 않는 원격 브랜치를 만들어서 본인들이 맡은 부분의 코드를 짜고master
브랜치에 합치는 식이다!- 어떻게 브랜치를 관리할 것인지에 대한 브랜치 전략은 회사마다 다르지만 이렇게 하는 것이 보통인듯 하다!
- 팀원 본인의 로컬 저장소
master
브랜치 👉 원격으로부터 최신master
원격 브랜치를pull
해 오고, 자신이 작업한 로컬 브랜치로 이동하여 작업한 후, 자신의 로컬master
브랜치에 이를merge
시킨 후 이를 다시 원격master
에 반영하는 식으로 사용한다.- 즉,
pull
, 통합하여push
하는 용도로 쓴다.
- 즉,
- 원격 저장소에 있는 단 하나의
master
브랜치 👉 완성해나가는 중인 단 하나의 최종본이라고 생각하면 될 것 같다. 팀원들은 각자 작업한 것들을 이master
브랜치에 merge 시켜 나가야 한다.
브랜칭 모델
링크의 “컬럼 「A successful Git branching model」- 성공적인 Git 브랜칭 모델” 참고하기
master
브랜치- 최종 배포 가능한 브랜치
develop
브랜치- 개발 한것의 최종본을 완성해나가는 브랜치
topic
브랜치(Feature 브랜치)- 개발에 필요한 버그 수정 및 테스트 버전 가지치기. 팀원들이 각자 로컬로만 작업하고 작업이 완료되면
develop
브랜치에 merge 하여 합친다.
- 개발에 필요한 버그 수정 및 테스트 버전 가지치기. 팀원들이 각자 로컬로만 작업하고 작업이 완료되면
release
브랜치- 개발 완료된
develop
브랜치를 가지고 배포를 위한 최종적인 버그를 수정하는 작업을 수행한다. - 이
release
브랜치에서의 최종 배포 상태가 완료되면master
브랜치에 병합시켜 배포한다.
- 개발 완료된
hotfix
브랜치- 이미 1번 이상 배포한 버전에 유지 보수해야할 필요가 있을 경우
master
브랜치에서 분기하여 유지 보수 하는 브랜치.develop
브랜치에서 직접 배포 가능한 버전을 만들기에는 시간도 많이 소요되고 안정성을 보장하기도 어렵다.
- 이미 1번 이상 배포한 버전에 유지 보수해야할 필요가 있을 경우
관련 용어
Head
Head
는 현재 작업 중인 branch
를 가리키는 포인터다.
master
git init
할 때 자동으로 생성해주는 기본 브랜치- 아무런 브랜치도 생성하지 않으면 이
master
브랜치 하나로, 즉 가지 하나로 쭉~ 가는 것이다.
- 아무런 브랜치도 생성하지 않으면 이
- 보통 팀원들이 각자의 작업 코드를 하나로 합칠 때 사용하는 뼈대 브랜치로 사용할 수 있다.
- 최종 완성된 배포용 브랜치로 사용할 수도 있다.
명령어
git branch
git branch
- 로컬 저장소에 있는 브랜치 목록과 현재 사용하고 있는(HEAD 포인터가 가리키는) 브랜치를 확인할 수 있다.
git branch
👉 로컬 저장소의 브랜치 목록git branch -r
👉 원격 저장소의 브랜치 목록git branch -a
👉 로컬+원격 모든 브랜치 목록
git branch 브랜치이름
- 새로운 브랜치를 생성한다. 현재 A 브랜치에 위치하고 있고
git branch B
로 B 브랜치를 새롭게 생성했다면 B 브랜치의 부모 브랜치는 A 브랜치가 되며 부모인 A 브랜치의 버전을 그대로 복사하고 A 브랜치의 커밋 내역들 까지도 부모 브랜치와 같게 된다.- 여태까지 200번의 커밋을 했던 A 브랜치로부터 가지 친 B 브랜치를 만들었을 때, B 브랜치에서 3번을 작업을 더 했다면 B 브랜치는 203번의 커밋 내역을 가지고 있는 셈이 된다.
- A 브랜치는 그대로 200번. B 브랜치는 A 브랜치를 복사해서 가져왔을 뿐 완전히 독립적인 작업 공간이기 때문에 B 브랜치 작업 내용은 A 브랜치에 반영되지 않는다.
- 여태까지 200번의 커밋을 했던 A 브랜치로부터 가지 친 B 브랜치를 만들었을 때, B 브랜치에서 3번을 작업을 더 했다면 B 브랜치는 203번의 커밋 내역을 가지고 있는 셈이 된다.
- 브랜치를 생성했다고 해서 생성한 브랜치로 이동하는건 아니다. 주의할 것!
- 브랜치 이동은
git checkout
명령어를 사용한다.
- 브랜치 이동은
git branch -D 브랜치이름
해당 브랜치를 로컬 저장소에서 삭제. (필요하면 다시 원격 브랜치에서 가져올 수 있다.)
git checkout
git checkout 브랜치이름
- 해당 브랜치로 이동한다. HEAD 포인터가 해당 브랜치로 옮겨지게 된다.
git checkout -b 브랜치이름
- 브랜치를 생성함과 동시에 이동한다.
git branch
와git checkout
을 합침
git branch foo
git checkout foo
현재의 브랜치를 부모로 삼는 foo
라는 이름의 브랜치를 만들고 foo
브랜치로 이동한다.
git push origin 브랜치이름
원격 저장소에서도 브랜치 별로 관리가 된다.
git add .
git commit -m "뫄뫄하는 새로운 버전 생성"
git push origin foo
Github 원격 저장소의 foo
브랜치에 작업 내용을 커밋 및 업로드 한다. 그럼 원격 저장소에서 아래와 같이 브랜치 목록에 추가된 것을 확인할 수 있다.
VS Code 깃허브 저장소의 브랜치 목록이다. 오픈소스라 그런지 수 많은 브랜치가 있는 것을 알 수 있다! 전부 git push origin 브랜치이름
하여 원격 저장소의 브랜치로서 업로드 된 브랜치들이다.
아래 브랜치를 예로 들자면, 이 브랜치는 생성될 때 즉 부모 브랜치로부터 복사 받았을 땐 36 개의 커밋 내역을 가진 상태로 복사를 받았고 이렇게 브랜치를 생성한 이후로 49164 번의 커밋을 했다는 의미이다!
git pull origin 브랜치이름
git checkout master
git pull origin foo
내 로컬 저장소의 master
브랜치에 원격 저장소의 foo
브랜치를 가져와 반영하고 싶다면 git checkout master
를 통해 master
브랜치로 이동한 후 git pull origin foo
명령어를 통해 foo
원격 브랜치를 가져와 반영하면 된다. pull
은 merge
까지 같이 진행시켜준다.
git push origin master
master
브랜치에 원격 저장소의 foo
브랜치를 가져와 반영한 후 최종적으로 원격 저장소의 master
브랜치에 이를 push
한다.
팀원들 각자 브랜치를 만들어 각자 맡은 작업들을 진행한 후 원격 브랜치에 올린다.
- 자신이 맡은 작업들의 커밋 내역들이 이 원격 브랜치에 기록된다.
- 다른 팀원이 이 원격 브랜치를
pull
하여 자신의 브랜치에 반영할 수 도 있다.
A, B, C 이렇게 3 명이 협업을 한다고 가정해보자. 이 3 명은 A
, B
, C
브랜치에서 각자 다른 작업을 맡아 코드를 짠다. 그럼 브랜치는 총 4 개가 있게 된다. A
, B
, C
, master
. 자신이 작업한 커밋 내역들을 원격에 저장하거나 다른 사람이 내 브랜치를 가져갈 수 있도록 하기 위하여 각자의 브랜치를 원격 저장소에 push
하고, 다른 사람이 작업하여 올려 놓은 원격 브랜치들을 가져와서 master
로컬 브랜치에 반영하고 이를 최종적으로 master
원격 브랜치에 올리는 식으로 작업을 한다. master
는 팀원들의 작업 물들을 통합하는, 즉 완성본으로의 역할로서 사용한다. 늘 이런 전략으로 사용되는 것은 안디ㅏ. 브랜치 전략은 회사마다 다르다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기