본문 바로가기
Git

[Git] branch | branch 다루기

by snow_white 2022. 3. 14.

브랜치(branch)란?

브랜치란 독립적으로 어떤 작업을 진행하기 위한 개념이다. 필요에 의해 만들어지는 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행할 수 있다.

 

모든 버전 관리 시스템은 브랜치를 지원한다. 개발을 하다 보면 코드를 여러 개로 복사해야 하는 일이 자주 생긴다. 코드를 통째로 복사하고 나서 원래 코드와는 상관없이 독립적으로 개발을 진행할 수 있는데, 이렇게 독립적으로 개발하는 것이 브랜치다.

 

새로운 브랜치로 갈라져 나가며 한 번에 여러 모습의 프로젝트를 사용해야 할 경우 사용할 수 있다.

각각의 서로 다른 차원에서 개발을 진행하며, 따로 폴더를 새로 만들지 않아도 한 곳에서 진행할 수 있다.

브랜치마다 테스트용, 새로운 기능의 실험, 새로운 디자인 등을 적용해보기 위해 사용한다.

 

또한, 브랜치는 다른 브랜치와 병합(Merge)함으로써, 작업한 내용을 다시 새로운 하나의 브랜치로 모을 수 있다.

 

마스터 브랜치(Master Branch)

: 저장소를 처음 생성하게 되면 깃은 'Master'라는 이름의 브랜치를 자동으로 생상허게 된다. 따로 새로운 브랜치를 생성하지 않으면 저장소에 새로운 파일을 추가하는 것이나 소스코드를 수정하여 커밋하는 작업 모두 마스터 브랜치를 통해 이루어지게 된다.

 

통합 브랜치(Integration Branch)

: 언제든 배포할 수 있는 버전을 만들 수 있어야 하는 브랜치이다. 따라서 안정적인 상태, 즉 모든 기능이 정상적으로 동작하는 상태가 되어있어야 한다. 만약 버그를 수정하거나 새로운 기능을 추가해야 한다면 통합 브랜치가 아닌 토픽 브랜치를 만들어 사용한다. 일반적으로 마스터 브랜치를 통합 브랜치로 사용한다.

 

토픽 브랜치(Topic Branch)

: 기능 추가나 버그 수정과 같은 단위 작업을 위한 브랜치를 토픽 브랜치라고 한다. 토픽 브랜치는 보통 통합 브랜치로부터 파생해서 생성하고, 특정 작업이 완료되면 통합 브랜치에 병합하는 방식으로 작업하게 된다. 토픽 브랜치를 피처 브랜치(Feature Branch)라고 하기도 한다.

 

체크 아웃(Checkout)

: 깃에서는 항상 작업할 브랜치를 미리 선택해야 한다. 맨 처음에는 마스터 브랜치가 선택되어 있는데 다른 브랜치로 전환하여 작업할 때 사용하는 명령어가 체크 아웃(Checkout)이다.

 


브랜치 전환하기

Git 에서는 항상 작업할 브랜치를 미리 선택해야 한다. 현재 선택된 브랜치가 아닌 다른 브랜치에서 작업하고 싶을 때에는, '체크아웃(checkout)' 명령어를 실행하여 원하는 브랜치로 전환할 수 있다. 체크아웃을 실행하면, 우선 브랜치 안에 있는 마지막 커밋 내용이 작업 트리에 나타난다. 브랜치가 전환 되었으므로 이 후에 실행한 커밋은 전환한 브랜치에 추가된다.

헤드(Head)

: 헤드는 현재 사용 중인 브랜치의 선두 부분을 나타내는 이름이다. 기본적으로는 마스터의 선두 부분을 나타낸다. 

 

스태시(Stash)

: stash 란, 파일의 변경 내용을 일시적으로 기록해두는 영역이다.

커밋하지 않은 변경 내용이나 새롭게 추가한 파일이 인덱스와 작업 트리에 남아 있는 채로 다른 브랜치로 체크아웃하면, 그 변경 내용은 이전 브랜치가 아닌 체크아웃하여 전환한 브랜치에서 커밋할 수 있다. 단, 커밋 가능한 변경 내용 중에 전환된 브랜치에서도 한 차례 변경이 되어 있는 경우에는 체크아웃에 실패할 수 있다. 이 경우 이전 브랜치에서 커밋하지 않은 변경 내용을 커밋하거나, stash 를 이용해 일시적으로 변경 내용을 다른 곳에 저장하여 충돌을 피하게 한 뒤 체크아웃을 해야 한다.

 

머지(Merge)

: merge 를 사용하면, 여러 개의 브랜치를 하나로 모을 수 있다.

 

리베이스(Rebase)

: 통합 브랜치에 토픽 브랜치를 통합한다는 점에서 머지와 비슷하지만 특징이 약간 다르다. Merge는 변경 내용의 이력이 모두 남아 있어서 이력이 복잡해지지만, Rebase는 이력이 단순해지지만, 원래 커밋 이력이 변경된다. 정확한 이력을 남겨둬야 할 필요가 없을 경우 사용한다.

 

Branch: 분기된 가지 (다른 차원)

  • 프로젝트를 하나 이상의 모습으로 관리해야 할 때
    • 예) 실배포용, 테스트서버용, 새로운 시도용
  • 여러 작업들이 각각 독립되어 진행될 때
    • 예) 신기능 1, 신기능 2, 코드개선, 긴급수정...
    • 각각의 차원에서 작업한 뒤 확정된 것을 메인 차원에 통합

 

1. 브랜치 생성 / 이동 / 삭제하기

add-coach란 이름의 브랜치 생성

git branch add-coach

 

브랜치 목록 확인

git branch

 

add-coach 브랜치로 이동

git switch add-coach
  • checkout 명령어가 Git 2.23 버전부터 switch, restore로 분리

브랜치 생성과 동시에 이동하기

git switch -c new-teams
  • 기존의 git checkout -b (새 브랜치명)

 

브랜치 삭제하기

git branch -d (삭제할 브랜치명)
  • to-delete란 브랜치 만들고 삭제해보기

 

지워질 브랜치에만 있는 내용의 커밋이 있을 경우
즉 다른 브랜치로 가져오지 않은 내용이 있는 브랜치를 지울 때는
-d 대신 -D(대문자)로 강제 삭제해야 한다.

git branch -D (강제삭제할 브랜치명)

 

브랜치 이름 바꾸기

git branch -m (기존 브랜치명) (새 브랜치명)

 


 

2. 각각의 브랜치에서 서로 다른 작업해보기

A. main 브랜치

  1. Leopards의 members에 Olivia 추가
    • 커밋 메시지: Add Olivia to Leopards

 

  1. Panthers의 members에 Freddie 추가
    • 커밋 메시지: Add Freddie to Panthers

 

 add-coach 브랜치로 이동하여 해당 코드들 확인



B. add-coach 브랜치

  1. Tigers의 매니저 정보 아래 coach: Grace 추가
    • 커밋 메시지: Add Coach Grace to Tigers

 

  1. Leopards의 매니저 정보 아래 coach: Oscar 추가
    • 커밋 메시지: Add Coach Oscar to Leopards

 

  1. Panthers의 매니저 정보 아래 coach: Teddy 추가
    • 커밋 메시지: Add Coach Teddy to Panthers



C. new-teams 브랜치

  1. pumas.yaml 추가
    • 커밋 메시지: Add team Pumas
team: Pumas

manager: Jude

members:
- Ezra
- Carter
- Finn

 

  1. jaguars.yaml
    • 커밋 메시지: Add team Jaguars
team: Jaguars

manager: Stanley

members:
- Caleb
- Harvey
- Myles

 


 

3. 결과 살펴보기

git log: 위치한 브랜치에서의 내역만 볼 수 있음

 

여러 브랜치의 내역 편리하게 보기

git log --all --decorate --oneline --graph



소스트리에서 확인


서로 다른 브랜치를 합치는 두 방식

  • merge : 두 브랜치를 한 커밋에 이어붙인다.
    • 브랜치 사용내역을 남길 필요가 있을 때 적합한 방식
  • rebase : 브랜치를 다른 브랜치에 이어붙인다.
    • 한 줄로 깔끔히 정리된 내역을 유지하기 원할 때 적합
    • 이미 팀원과 공유된 커밋들에 대해서는 사용하지 않는 것이 좋음

 

1. merge로 합치기

add-coach 브랜치를 main 브랜치로 merge

  • main 브랜치로 이동
  • 아래의 명령어로 병합
git merge add-coach
  • :wq로 자동입력된 커밋 메시지 저장하여 마무리
  • 소스트리에서 확인

 

merge는 reset으로 되돌리기 가능

  • merge도 하나의 커밋
  • merge하기 전 해당 브랜치의 마지막 시점으로

 

병합된 브랜치는 삭제

삭제 전 소스트리에서 add-coach 위치 확인

git branch -d add-coach

 

2. rebase로 합치기

new-teams 브랜치를 main 브랜치로 rebase

  • new-teams 브랜치로 이동
    • merge때와는 반대!
  • 아래의 명령어로 병합
git rebase main

 

  • 소스트리에서 상태 확인
    • main 브랜치는 뒤쳐져 있는 상황

 

  • main 브랜치로 이동 후 아래 명령어로 new-teams의 시점으로 fast-forward
git merge new-teams
  • new-teams 브랜치 삭제

 

 

[참조 자료]

https://backlog.com/git-tutorial/kr/stepup/stepup1_1.html

댓글