본문 바로가기

Github

05_브랜치로 나누어 관리하기

반응형

브랜치란: 브랜치를 나누어 관리하는 이유

브랜치는 **버전의 분기**다 (버전의 새로운 흐름)

=버전을 여러 개의 흐름으로 관리하는 방법

브랜치로 버전의 분기를 관리하는 방법

  1. 브랜치를 **나눈다**.
  2. 각자의 브랜치에서 **작업한다**.
  3. (필요하다면) 나눈 브랜치를 **합친다**.

ex - 브랜치로 문제 해결하기

ex-1) 같은 부분을 다르게 수정한 부분만 보면 됨

ex-2)

브랜치 나누기

최초의 브랜치, master(or main) 브랜치

  • 가장 기본적인, 최초의 브랜치
  • 우리가 지금까지 만든 커밋들은 모두 기본적으로 master 브랜치에 속해 있다.

브랜치 커밋 개수?

  • master 브랜치 : 커밋 3개
  • foo 브랜치 : 커밋 5

  • master 브랜치: 커밋 4개
  • foo 브랜치 : 커밋 5개
  • bar 브랜치 : 커밋 6개

브랜치 이름 짓기

브랜치가 나뉘어진 목적을 담아 이름을 짓는다.

(ex)

  • feature/menu
  • release/2.3.0
  • hotfix/login

특정 브랜치에서 작업하기: HEAD와 체크아웃

HEAD

  • **현재 작업 중인 브랜치의 커밋**을 가리킴
  • 일반적으로 현재 작업 중인 브랜치의 **최신 커밋**을 가리킴
  • 한 마디로 "내가 지금 어디에서 작업 중인가"를 가리킴
  • HEAD는 자유자재로 변경 가능 (checkout)

(ex)

HEAD가 master 브랜치라면?

  • 커밋 4개
  • 현재: master 브랜치의 4번 커밋 (현재 브랜치의 최신 커밋을 가리킴)
  • 현재 작업 환경에 맞게 되어 있음

HEAD가 foo 브랜치라면?

  • 커밋 5개
  • 현재: foo 브랜치의 5번 커밋 (현재 브랜치의 최신 커밋을 가리킴)

checkout(체크아웃)

  • 특정 브랜치에서 작업할 수 있도록 작업 환경을 바꾸는 것
  • HEAD의 위치를 특정 브랜치의 최신 커밋으로 옮김

브랜치 나누기 실습

작업 환경 세팅

master 브랜치를 생성한다.

하나의 커밋을 더 생성한다.

브랜치 생성하기

상단에 브랜치 버튼을 누른다.

  • **새 브런치 체크아웃** : 새 브랜치를 만듦과 동시에 작업환경을 foo로 변경하겠다는 의미

앞에 동그라미는 현재 HEAD 브랜치임을 의미한다. 현재 HEAD는 foo 브랜치다.

새로운 브랜치 foo에서 foo_a.txt를 생성하고 커밋하자.

다른 브랜치로 checkout

다른 브랜치로 checkout하려면 브랜치를 더블클릭한다.

폴더를 보면 foo 브랜치에서 생성했던 foo_a.txt가 없다.

브랜치 삭제하기

브랜치 선택 > 오른쪽 마우스 > 삭제

브랜치 합치기: merge

브랜치를 합친다 === 브랜치를 **병합(merge)**한다

빨리감기 병합(fast-forward merge)

  • foo 브랜치가 뻗어 나오고,
  • foo 브랜치에 커밋이 쌓이고,
  • 병합되는 순간까지
  • master 브랜치는 가만히 있었다 (추가적인 커밋이 없었다)

그래서 master 브랜치는 마치 **빨리감기하듯이** 그저 foo 브랜치에서 추가된 커밋을 반영하기만 하면 된다.

그럼 빨리 감기 병합이 아닌 병합은?

  • bar 브랜치에는 없는 커밋이 master 브랜치에는 있고,
  • master 브랜치에는 없는 커밋이 bar 브랜치에 있는 상황

두 브랜치를 병합한 새로운 커밋이 생성된다

브랜치 합치기 실습

fast-forward merge 해보기

master브랜치에 foo 브랜치를 병합하여 fast-forward merge하자.

  1. 병합 기준이 되는 브랜치(master)로 이동

  1. 병합할 브랜치 선택 > 오른쪽 마우스 > 현재 브랜치로 브랜치 병합

확인!

master 브랜치에 foo 브랜치에서 수정한 사항들이 반영된다.

폴더를 확인해보니 foo_a.txt가 잘 나온다.

이제 foo 브랜치는 필요없으니 삭제한다.

브랜치 삭제 완료!

ff merge 아닌 merge하기

새 브랜치 bar를 생성하고, 파일 bar_a, bar_b를 각각 생성하여 각각 커밋한다.

master 브랜치로 checkout하면 bar_a, bar_b 파일 없이 파일이 세 개 밖에 없다.

여기서 master 브랜치에서 파일을 생성하고 커밋한다(ff merge를 안하기 위해)

bar 브랜치를 master 브랜치로 merge하자. 새로운 커밋이 생성되어 merge된다.

폴더를 보면 bar_a, bar_b가 있음을 확인할 수 있다.

merge 충돌 해결하기

충돌?

충돌이 발생했을 때 대처법

  1. 충돌을 해결한다(어떤 브랜치의 내용을 최종적으로 반영할지 직접 선별한다).
  2. 다시 커밋한다.

실습해보기

  1. master 브랜치에 a.txt 생성하고 커밋하기
  2. foo 브랜치 생성 및 checkout
  3. foo 브랜치에서 a.txt 내용을 변경 후 커밋하기
  4. master 브랜치로 checkout
  1. master 브랜치에서 a.txt 내용을 변경 후 커밋하기

각 브랜치(foo, master)에서 a.txt의 내용을 변경했으므로 merge 하면 충돌이 발생한다.

충돌이 발생했으므로 git이 a.txt 파일 내용을 변경해준다.

  • ====== : 영역 구분선

sourcetree를 사용하면 버튼을 클릭하여 내용을 선별할 수 있다.

  • **'내것'을 이용해 해결** : master 브랜치 내용을 선택
  • **'저장소'것을 사용하여 해결** : foo 브랜치 내용을 선택

master 브랜치 내용을 반영하여 충돌을 해결해보자.

파일 내에 충돌이 해결되었다.

아직 병합은 안됐다. 파일 상태에 들어가면 커밋 메시지가 자동으로 작성되어 있는데 이걸 커밋하면 병합이 완료된다.

병합 완료!

브랜치 재배치하기: rebase

rebase?

foo 브랜치의 base를 다시 배치한다는 것

  • 원래 base

  • base 재배치 (최근 master로)

실습해보기

그림과 똑같이 깃 형태를 만든다.

  1. foo 브랜치로 checkout
  2. 커밋 선택 > 오른쪽 마우스 > 재배치 (충돌이 없으므로 바로 재배치 가능)

확인 버튼 클릭

재배치 완료

재배치가 되었으므로 모든 파일이 있다.

 

반응형