본문 바로가기

개발

[Git] Branch

Branch 

1) Branch는 무엇이고, 왜 쓰는 걸까요?

 

브랜치는 뭔 뜻이죠? "나뭇가지" / "분기" 라는 뜻을 가지고 있습니다.

나무를 떠올려볼까요?

 

나무에 있는 나뭇가지들은 나무 뿌리에서 시작을 해서, 근본을 공유합니다. 다만, 나뭇가지들은 어느 순간부터 각자 분리되어있죠.

 

실제 나뭇가지는 다시 합쳐지지는 않지만, 이 나뭇가지들이 다시 합쳐지는 그림을 떠올리면서... 깃에서의 브랜치를 이해해봅시다.

 

 

 

 

가장 왼쪽에 있는 초록색 원을 프로젝트의 시작 커밋이라고 해볼까요?

 

그리고 여러분이 파란색 원과 같이 커밋을 하고 싶습니다.

근데, 그와 동시에 다른 사람들도 작업을 해서 커밋을 하고 싶다고 합시다.

 

 

 

 

만약 여러분이 지금까지 알고있는 내용으로 생각해보면, 위와 같은 플로우의 작업이 가능했나요? main/master 브랜치 혹은 develop 브랜치만 사용했던 지난 프로젝트들을 떠올려보세요.

 

계속 같은 브랜치에서 작업을 하느라, 다른 사람이 작업을 하고 푸쉬했습니다! 라고 하면, 무조건 pull해야 했고, 또 pull을 하면 꼭 하나씩 충돌이 나서, 어려움을 겼었었죠. 굉장히 힘들었죠?

 

이제 이걸 브랜치를 이용해봅시다. 각자 원하는 작업을 각자 다른 브랜치에서 진행하고, 작업을 진행한 이후에 중심 브랜치로 합치는(Merge(병합)) 플로우를 가져봅시다.

 

이전보다 협업이 더 빠르고, 편하게 진행될 것 입니다.

 

 

2) Branch 명령어

a. checkout

브랜치를 먼저 만들어야겠죠? 아래는 브랜치를 만드는 명령어 입니다.

BRANCH_NAME 라는 이름을 가진 브랜치를 만드는 거에요 🥰

$ git branch -d BRANCH_NAME

 

이미 만들어져 있는 브랜치로 이동하고 싶다면 어떻게 하면 될까요?

$ git checkout BRANCH_NAME

 

그럼 더 편하게! 만약 브랜치를 만들면서, 해당 브랜치로 바로 이동하고 싶다면 어떤 명령어를 써야할까요?

$ git checkout -b BRANCH_NAME

 

 

💡 여기서 잠깐! git checkout은 안타깝게도..

      요즘 쓰면 늙은이 취급 받는다고 하네요 ㅠㅠ

 

      우리 한번 switch를 써볼까요?

 

 

 

 

방금 Checkout 을 배웠는데 Switch 를 또 배우다니... 🤯

그 이유는 무엇일까요?

 

정답은 Checkout 이 가진 기능이 너무 많기 때문입니다.

그래서 Switch와 Restore 두 명령어로 명확하게 분리되었어요. Restore 는 뒤에서 다루기로 해요.

 

 

b. switch

switch 는 말 그대로 브랜치로 이동하는 명령어 입니다. checkout 과 비슷한 부분이 정말 많아요.

먼저, 이미 존재하는 브랜치로 이동 해볼까요?

$ git switch BRANCH_NAME

 

그러면 새로운 브랜치를 만드는 방법은요?

여기서도 똑같이 BRANCH_NAME 브랜치를 만들어 볼거에요. 그리고 해당 브랜치로 바로 이동을 할겁니다!

$ git switch -c BRANCH_NAME

 

 

여기서 퀴즈! 🔎

Q. switch 에서 없는 기능은 무엇일까요?

더보기

A. 브랜치를 만들고 바로 이동하지 않는 기능입니다. 😎

 

이로써 우리는 브랜치를 생성하고, 이동할 수 있게 되었습니다. 👏 이제는 원격 저장소와 로컬 저장소의 브랜치를 유기적으로 연결하고, 사용할 수 있는 방법에 대해서 알아보려고 합니다.

 

아이디어톤 당시, 로컬 저장소의 master 브랜치에서 작업을 하고 push 했던 경험을 되살려 보세요. 자동으로 원격 저장소의 origin/master 브랜치에 반영이 되지 않았나요?

이는 두 브랜치 간에 tracking connection 이 설정되어 있기 때문입니다.

 

그래서요...? 그걸 이용하면 뭐가 좋은거죠? 🤷‍♂️

tracking connection을 잘 이용하면 더 깔끔하고, 충돌없는 커밋 관리를 할 수 있습니다.

 

 

예시를 통해서 한 번 알아볼까요?

 

어느 날, 사자 🦁 4명이 모여 모나리자를 그리기로 했어요.

A는 눈을, B는 코와 입을 맡았습니다. 그리고 C는 얼굴을 제외한 몸통을, D는 배경을 담당했습니다.

 

이들은 원활하게 작업하기 위해서 브랜치를 3개로 나누자고 결정했어요.

각각 face / torso / background 로 말이에요.

 

그리고 사자들은 아래와 같은 플로우로 작업하자고 결정했어요.

 

 

 

자, 이제 사자들이 어떻게 작업을 했는지 알아볼까요?

 

가장 먼저, C와 D는 master 브랜치에 먼저 서명을 추가했습니다.

(master) $ git commit -m "Add C and D's signature"
(master) $ git push origin master

 

곧바로 D가 background 브랜치에서 두 가지 작업을 마쳤습니다.

(master) $ git switch -c background
(background) $ git commit -m "Draw sky and land"
(background) $ git commit -m "Draw mountains"
(background) $ git push origin background

 

이 작업을 마친 후에는 background 브랜치에서 master 브랜치로 PR을 요청했어요.

 

C는 torso 브랜치에서 한 가지 작업을 마치고는 master 브랜치로 PR을 요청했어요.

(master) $ git switch -c torso
(torso) $ git commit -m "Draw torso"
(torso) $ git push origin torso

 

그 사이, A와 B는 master 브랜치에 자신들의 서명을 추가했어요.

(master) $ git commit -m "Add other signatures"
(master) $ git push origin master

 

B가 face 브랜치에서 먼저 코 작업을 마쳤어요.

(master) $ git switch -c face
(face) $ git push -u origin face

(master) $ git switch -c lower_face --track origin/face
(lower_face) $ git commit -m "Draw nose"
(lower_face) $ git push lower_face

 

그리고 바로 A가 face 브랜치에서 눈 작업을 마쳤습니다.

(master) $ git switch -c upper_face --track origin/face
(upper_face) $ git commit -m "Draw eyes"
(upper_face) $ git push upper_face:face

 

B는 face 브랜치에서 입 작업까지 마친 후에 master 브랜치로 PR을 요청했어요.

(master) $ git switch -c lower_face
(lower_face) $ git commit -m "Draw mouse"
(lower_face) $ git push lower_face

 

그 결과 아래와 같은 로그가 남았습니다!

각각 맡은 부분에 따라 명확하고, 깔끔하게 나뉘어지지 않았나요?

[참고: https://github.com/Anthologia/mona-lisa ]

 

그런데, 사자들의 작업을 보면 요상한 명령들이 보이는데요. 🤔

--track origin/face 이란 무엇이고, push 마지막에 붙이는 :face 는 무엇일까요?

 

그 친구들이 바로 tracking connection 과 관련된 명령입니다.

 

그건 다음 게시물에서 이어 다루기로 할게요!

 

 

'개발' 카테고리의 다른 글

코드 실행시간 측정하기 (Java, Python, C, C++)  (0) 2022.01.10
[Git] Tracking connection (-set-upstream 명령)  (0) 2021.11.19
[Git] Pull request  (0) 2021.11.02
[Git] Fork 명령어  (0) 2021.11.01
[Git] Add, commit, push  (0) 2021.10.31