04_Git

03_git 브랜치(branch) 관리

chuu_travel 2025. 2. 19. 17:36
728x90
01. 브랜치

 

  • 브랜치는 영어로 나뭇가지를 의미함
  • 줄기에서 뻗어나오는 나뭇가지와 같이 버전을 여러 흐름으로 나누어 관리하는 방법
  • 버전을 나누는 이유
    • 사례1
      • A와 B가 협업하여 온라인 쇼핑몰을 만들고 있는 경우, A는 장바구니 기능, B는 주문 목록 기능을 구현
      • 각각 기능을 구현하는 과정에서 여러 파일을 추가, 수정, 삭제할 수 있음
      • A와 B가 모두 작업을 완료했다면 각자의 작업을 하나로 합쳐야함
      • 이 때 각자 추가, 수정, 삭제한 코드를 하나하나 대조해야함
        • 코드를 하나하나 대조하면 번거롭기도 하고 실수가 일어날 수도 있음
    • 사례2
      • 자체 제작한 프로그램을 여러 회사에 납품하는 회사 C는 각 회사의 요구사항에 맞게 조금씩 변경한 프로그램을 납품함
      • 만약 C회사의 프로그램이 버전 10.0.0 까지 출시됐고 고객사가 1000개가 넘어간다면
      • 각 버전마다 코드를 복사하기엔 너무 번거롭고 비효율적임
  • 버전 나누기의 단계
    1. 브랜치를 나눔
    2. 각자의 브랜치에서 작업
    3. (필요한 경우) 나눈 브랜치를 합침
  • 위의 사례를 브랜치로 해결한다면
    • A와 B는 각자 브랜치를 나누어 '장바구니' 브랜치와 '주문목록' 브랜치에서 작업
    • 각자의 작업이 끝나면 브랜치를 합치고 '같은 코드를 다르게 수정한 부분'만 살펴보면 됨

 

 

02. 브랜치 실습

 

  • 브랜치 나누기
    • 깃이 제공하는 가장 기본적인 최초의 브랜치를 master브랜치라고 함
    • 지금까지 만들었던 커밋은 모두 master 브랜치에 속함
    • master에 커밋 3개가 있고 master의 최신 커밋에서 foo라는 브랜치를 만들고 foo 브랜치에서 커밋 두개를 추가한다면 master 브랜치의 입장에서는 커밋이 3개뿐이지만 foo 브랜치의 입장에서는 커밋이 5개
      • foo브랜치는 master브랜치의 세 번째 커밋에서 뻗어나왔기 때문에 master브랜치의 커밋 3개를 모두 포함
  • HEAD
    • 현재 작업 중인 브랜치의 최신 커밋을 가리키는 표시
    • 일반적으로 현재 작업중인 브랜치의 최신 커밋을 가리키지만 브랜치를 나누고 합치는 과정에서 HEAD의 위치는 자유자재로 바꿀 수 있음
  • 체크아웃
    • 특정 브랜치에서 작업할 수 있도록 작업 환경을 바꾸는 것
    • 특정 브랜치로 체크아웃하게 되면 HEAD의 위치가 해당 브랜치의 최신 커밋을 가리키고, 작업 디렉토리는 체크아웃한 브랜치의 모습으로 바뀜
  • 브랜치 이름
    • 실무에서는 브랜치 이름 규칙을 정해두는 경우가 많음
      • 예) 새로운 기능을 개발하기 위한 브랜치 'feature/새기능', 릴리즈를 준비하기 위한 브랜치 = 'release/릴리즈번호', 버그를 급하게 수정하는 브랜치 = 'hotfix/수정사항' 등

 

03. 브랜치 병합

 

  • 브랜치 하나로 통합하는 것을 병합, 영어로 merge라고 함
  • master 브랜치와 foo 브랜치 병합
    • 병합 이후 더 이상 브랜치에 남은 예정 작업이 없다면 해당 브랜치를 삭제하는 것이 좋음

 

 

04. 브랜치 충돌

 

  • 브랜치를 병합하는 과정에서 충돌이 발생하는 경우도 있음
  • 충돌은 병합하려는 두 브랜치가 서로 같은 내용을 다르게 수정한 상황을 의미
  • 충돌이 발생하면 브랜치가 한 번에 병합되지 못함

 

충돌 해결

  • 브랜치를 병합하는 과정에서 충돌이 발생하면 충돌이 발생한 파일들의 충돌을 해결한 뒤 다시 커밋해야만 브랜치가 올바르게 병합됨
  • 충돌이 발생한 이유는 병합하려는 두 브랜치가 같은 내용을 서로 다르게 수정했기 때문이므로 충돌이 발생한 두 브랜치 중 어떤 브랜치의 내용을 병합 결과에 반영할지를 직접 선택해야함
  • === 기호 윗 부분은 <<<<<HEAD 기호로 현재 HEAD가 가리키는 브랜치(현재 체크아웃한 브랜치)의 내용을 표시
  • === 기호 아랫 부분은 >>>>>foo 기호로 foo 브랜치의 내용을 표시
  • 충돌 해결
    • 내것을 이용해 해결: 현재 체크아웃된 브랜치의 내용을 병합에 반영
    • 저장소것을 사용하여 해결 : 병합하려는 브랜치의 내용을 병합해 반영
    • vscode등의 편집기를 통해 직접 편집하는 것도 가능
  • 충돌을 해결한 것으로 브랜치 병합이 끝난 것이 아님
  • 파일 상태로 가서 커밋
    • 충돌이 발생했던 브랜치가 성공적으로 병합됨을 확인

 

 

 

05. 브랜치 재배치

 

  • 브랜치의 재배치는 rebase 라고 함
  • 브랜치가 뻗어나온 기준점을 변경하는 것
    • 예) master 브랜치의 두 번째 커밋에서 뻗어나온 foo 브랜치를 master의 네 번째 커밋에서 뻗어나오도록 변경하는 것
  • 브랜치 재배치에서도 충돌이 발생할 수 있음
    • 충돌 시에는 앞서 배운 방법으로 해결 가능

 

728x90

'04_Git' 카테고리의 다른 글

github사용시, SSH Key 생성 및 등록방법  (0) 2025.02.24
git다운로드 방법  (2) 2025.02.24
04_Git hub  (0) 2025.02.24
02_Git 버전관리  (0) 2025.02.19
01_Git 준비  (0) 2025.02.19