[Git] git branch

Date:     Updated:

카테고리:

태그:

들어가기에 앞서

출처 글 👉 https://victorydntmd.tistory.com/75?category=682764

이 글은 victorydntmd님 블로그의 git branch 포스트를 거의 대부분 참고한 글입니다. git branchgit 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 브랜치에서 직접 배포 가능한 버전을 만들기에는 시간도 많이 소요되고 안정성을 보장하기도 어렵다.


관련 용어

Head는 현재 작업 중인 branch를 가리키는 포인터다.

master

  • git init할 때 자동으로 생성해주는 기본 브랜치
    • 아무런 브랜치도 생성하지 않으면 이 master 브랜치 하나로, 즉 가지 하나로 쭉~ 가는 것이다.
  • 보통 팀원들이 각자의 작업 코드를 하나로 합칠 때 사용하는 뼈대 브랜치로 사용할 수 있다.
    • 최종 완성된 배포용 브랜치로 사용할 수도 있다.


명령어

git branch

git branch

  • 로컬 저장소에 있는 브랜치 목록과 현재 사용하고 있는(HEAD 포인터가 가리키는) 브랜치를 확인할 수 있다.
  • git branch 👉 로컬 저장소의 브랜치 목록
  • git branch -r 👉 원격 저장소의 브랜치 목록
  • git branch -a 👉 로컬+원격 모든 브랜치 목록

git branch 브랜치이름

image

  • 새로운 브랜치를 생성한다. 현재 A 브랜치에 위치하고 있고 git branch B로 B 브랜치를 새롭게 생성했다면 B 브랜치의 부모 브랜치는 A 브랜치가 되며 부모인 A 브랜치의 버전을 그대로 복사하고 A 브랜치의 커밋 내역들 까지도 부모 브랜치와 같게 된다.
    • 여태까지 200번의 커밋을 했던 A 브랜치로부터 가지 친 B 브랜치를 만들었을 때, B 브랜치에서 3번을 작업을 더 했다면 B 브랜치는 203번의 커밋 내역을 가지고 있는 셈이 된다.
      • A 브랜치는 그대로 200번. B 브랜치는 A 브랜치를 복사해서 가져왔을 뿐 완전히 독립적인 작업 공간이기 때문에 B 브랜치 작업 내용은 A 브랜치에 반영되지 않는다.
  • 브랜치를 생성했다고 해서 생성한 브랜치로 이동하는건 아니다. 주의할 것!
    • 브랜치 이동은 git checkout 명령어를 사용한다.

git branch -D 브랜치이름

해당 브랜치를 로컬 저장소에서 삭제. (필요하면 다시 원격 브랜치에서 가져올 수 있다.)


git checkout

git checkout 브랜치이름

  • 해당 브랜치로 이동한다. HEAD 포인터가 해당 브랜치로 옮겨지게 된다.

git checkout -b 브랜치이름

  • 브랜치를 생성함과 동시에 이동한다.
    • git branchgit checkout을 합침
git branch foo
git checkout foo

현재의 브랜치를 부모로 삼는 foo라는 이름의 브랜치를 만들고 foo 브랜치로 이동한다.


git push origin 브랜치이름

원격 저장소에서도 브랜치 별로 관리가 된다.

git add .
git commit -m "뫄뫄하는 새로운 버전 생성"
git push origin foo

Github 원격 저장소의 foo 브랜치에 작업 내용을 커밋 및 업로드 한다. 그럼 원격 저장소에서 아래와 같이 브랜치 목록에 추가된 것을 확인할 수 있다.

image

VS Code 깃허브 저장소의 브랜치 목록이다. 오픈소스라 그런지 수 많은 브랜치가 있는 것을 알 수 있다! 전부 git push origin 브랜치이름 하여 원격 저장소의 브랜치로서 업로드 된 브랜치들이다.

image

image

아래 브랜치를 예로 들자면, 이 브랜치는 생성될 때 즉 부모 브랜치로부터 복사 받았을 땐 36 개의 커밋 내역을 가진 상태로 복사를 받았고 이렇게 브랜치를 생성한 이후로 49164 번의 커밋을 했다는 의미이다!


git pull origin 브랜치이름

git checkout master
git pull origin foo

내 로컬 저장소의 master 브랜치에 원격 저장소의 foo 브랜치를 가져와 반영하고 싶다면 git checkout master를 통해 master 브랜치로 이동한 후 git pull origin foo 명령어를 통해 foo 원격 브랜치를 가져와 반영하면 된다. pullmerge까지 같이 진행시켜준다.

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는 팀원들의 작업 물들을 통합하는, 즉 완성본으로의 역할로서 사용한다. 늘 이런 전략으로 사용되는 것은 안디ㅏ. 브랜치 전략은 회사마다 다르다.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Git 카테고리 내 다른 글 보러가기

댓글 남기기