[Git] Git Branch의 개념 (fast-forward와 3-way merge)

2022. 2. 16. 15:00·Git & GitHub/Git

 

 

1. 브랜치란?


Branch는 가지라는 의미인데, 말 그래도 하나의 프로젝트를 여러 갈래로 나눠 관리할 수 있게 해주는 기능이다.

독립된 브랜치에서 자유롭게 개발하고 새로운 버전을 만들어내기도 한다.

 

소프트웨어를 개발할 때 개발자들은 깃과 같은 분산 버전 관리 시스템을 통해 협업 업무를 하게 된다. 만약 한 줄기로만 작업할 수 있다면 로그가 뒤죽박죽될 수 있기 때문에 버전 관리도 까다롭고, 수정도 굉장히 신중히 해야할 것이다.

 

하지만 브랜치를 사용하면 분기점으로 버전을 나누어 프로젝트를 개발하고 실험해볼 수 있다. 만약 브랜치에서 작업한 프로젝트가 마음에 들면 merge를 통해 본래 버전에 다시 합칠 수도 있다.

 

 

 

 

2. 브랜치의 합병


브랜치는 인덱스 영역에서 헤더 영역으로 저장할 때, 즉 commit할 때 생성된다.

브랜치 merge의 종류는 2가지인데  fast-forward merge 와  3-way merge 가 있다.

 

 fast-forward merge 는 merge 작업을 할 때

main branch에는 따로 자식이 없지만 branch에만 자식이 존재할 때 사용하는 통합 방식이다.

아래 그림은 실제 깃의 실행원리는 아니지만 개념적으로 이해하기 쉬우려고 만든 branch 원리이다.

실제 깃의 브랜치 실행원리는 3번에서 알아보도록 하자.

fast-forward merge

 

 

반면  3-way merge 는 merge 작업을 할 때 main branch와 branch에 각각 자식이 존재할 때 합병하는 방식이다.

3-way merge

 

 

 

 

 

 

3. fast-forward merge 방식


 

이번에는 실제 깃의 branch가 어떻게 동작하는지 알아보자.

새로운 가지를 만들고 커밋한다고 해서 바로 branch가 만들어지지는 않는다. 사실 깃 헤더영역에서는 기본적으로 Branch 포인터에 의해 브랜치를 구분한다.

 

위 그림은 게시판까지는 main branch 포인터가 가리키고 있지만 댓글 기능부터는 My branch라는 새로운 브랜치 포인터가 생성되어 가리키고 있다.

 

 

이렇게 브랜치 포인터가 같은 곳을 가르키게되면 통합되는데 main에 다른 자식이 없었기 때문에 main branch 포인터를 직선적으로 움직여도 바로 합칠 수 있게 되는데, 다른 방식보다 속도가 빨라 이것을 fast-forward merge라고 부른다.

 

 

 

 

 

4. 3-way merge 방식


일단 전제는 위에서 보여준 예시와 같다. 게시판까지는 main branch 포인터, 댓글 기능부터는 My branch라는 새로운 브랜치 포인터가 만들어진 상태다.

이때  main branch에 기능이 추가됐을 때 실제로 가지가 생기게 된다!!

(실제 실행원리에서는 새로운 가지에 의해 가지가 생기는 것이 아니라 main에 의해서 가지가 생김...)

이제 my branch에서의 작업이 끝나고 main과 합병하기로 했다고 해보자.

이제 main branch쪽으로 합병할 것인지 my branch 쪽으로 합병할 것인지 정해서 가지를 합치면 된다.

(주로 main쪽으로 합치게 된다.)

main branch 포인터는 댓글 기능 완료로 옮기고, my branch 포인터는 원래 있던 지점에 그대로 둔다.

 

 

 

브랜치에 대한 자세한 설명 참고

깃 홈페이지: https://git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

 

Git - 브랜치란 무엇인가

3.1 Git 브랜치 - 브랜치란 무엇인가 모든 버전 관리 시스템은 브랜치를 지원한다. 개발을 하다 보면 코드를 여러 개로 복사해야 하는 일이 자주 생긴다. 코드를 통째로 복사하고 나서 원래 코드와

git-scm.com

 

'Git & GitHub/Git' 카테고리의 다른 글
  • [Git] git rebase 사용하기
  • [Git] git branch 사용하기
  • [Git] Git reset 명령어 (feat. git reflog로 복구하기)
  • [Git] 깃(git)의 기초 - 로컬저장소 생성과 초기 설정
gakko
gakko
좌충우돌 개발기
  • gakko
    MYVELOP 마이벨롭
    gakko
  • 전체
    오늘
    어제
    • 분류 전체보기 (203)
      • Spring (23)
        • Spring (10)
        • Spring Boot (7)
        • Spring Security (1)
        • Hibernate (4)
      • Test (3)
      • 끄적끄적 (6)
      • 활동 (35)
        • 부스트캠프 (23)
        • 동아리 (3)
        • 컨퍼런스 (3)
        • 글또 (5)
        • 오픈소스 컨트리뷰션 (1)
      • 디자인패턴 (0)
      • Git & GitHub (22)
        • Git (13)
        • Github Actions (1)
        • 오류해결 (5)
        • 기타(마크다운 등) (3)
      • 리눅스 (6)
        • 기초 (6)
        • 리눅스 서버 구축하기 (0)
      • Infra (2)
        • Docker (1)
        • Elastic Search (0)
        • Jenkins (1)
        • AWS (1)
      • MySQL (7)
        • 기초 (6)
        • Real MySQL (1)
      • 후기 (3)
        • Udemy 리뷰 (3)
      • CS (26)
        • 웹 기본지식 (0)
        • 자료구조 (13)
        • 운영체제 OS (12)
        • 데이터베이스 (1)
        • 시스템 프로그래밍 (0)
        • 기타 (0)
      • Tools (1)
        • 이클립스 (1)
        • IntelliJ (0)
      • 프로젝트 (1)
        • 모여모여(부스트캠프) (1)
      • JAVA (32)
        • Maven (6)
        • 오류해결 (11)
        • 자바 클래스&메소드 (1)
        • JSP & Servlet (12)
      • Javascript (5)
        • 기초 (3)
        • React (2)
      • Python (28)
        • 파이썬 함수 (9)
        • 알고리즘 문제풀이 (16)
        • 데이터 사이언스 (2)
        • 웹 크롤링 (1)
      • 단순정보전달글 저장소 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 우진님
  • 공지사항

  • 인기 글

  • 태그

    웹개발
    Spring
    자바
    오류해결
    부스트캠프
    Python
    알고리즘
    MySQL
    GitHub
    스프링부트
    부스트캠프 7기
    스프링
    jsp
    os
    java
    파이썬
    자바스크립트
    Git
    운영체제
    부스트캠프 멤버십
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
gakko
[Git] Git Branch의 개념 (fast-forward와 3-way merge)
상단으로

티스토리툴바