한화 SW 캠프 2일차 개념정리

배창민·2025년 8월 14일

Branch 란?

특정 기준에서 줄기를 나누어 작업할 수 있는 기능을 브랜치라고 하며 브랜치를 만들지 않고 A, B가둘 다 커밋 2을 기준으로 커밋을 만들려고 한다면 오류가 나게 된다.

[master or main]

Git이 제공하는 기본적인 브랜치. 첫 번째 커밋을 하면 자동으로 master라는 이름의 브랜치가 커밋을 가리키고 새로 커밋을 할 때마다 master 브랜치의 포인터가 최신 커밋을 가리킨다.

커밋 2에서 새로운 A 브랜치를 만들면 master 브랜치와 동일하게 커밋 2를 가리킨다. A 브랜치에서 커밋을 한번 더 하면 A 브랜치가 master 브랜치보다 커밋 하나만큼 앞서게 된다.

master 브랜치에서 커밋을 하나 더 하면 A 브랜치와 master 브랜치는 갈라지게 된다. [HEAD] 라고 하는 브랜치 혹은 커밋을 가리키는 특수한 포인터를 이용해 브랜치 사이를 넘나들 수 있다.

Git Branch 전략 예시 - git flow

  • Master (Main)
    • Production 에 출시가 가능한 브랜치
  • Develop
    • 개발이 완료 된 최신 브랜치
    • 신규 개발된 내역이 처음 합쳐지는 브랜치
  • Feature
    • 각 기능을 개발하는 브랜치
    • 기능 개발 단위로 Feature 브랜치가 생성됨
  • Release
    • Develop 브랜치에서 생성됨
    • 개발이 완료되어 출시를 위해 준비하는 브랜치
  • Hotfix
    • Production 에 배포 된 버전에서 발생한 버그를 수정하는 브랜치
💡 Git Flow는 명시적으로 버전관리가 필요한 이를 테면, 스마트폰 어플리케이션, 오픈소스 라이브러리/프레임워크 등의 프로젝트에 적합하다.

웹 어플리케이션은 특성상 사용자는 항상 최신의 단일 버전만을 사용하므로 여러 버전을 병렬적으로 지원할 필요가 없다. 또한 웹 어플리케이션은 하루에 몇 번이고 릴리즈될 수 있다. 이런 특성상 웹 어플리케이션 개발에 Git Flow는 다소 적합하지 않다.

Git Branch 전략 예시 - github flow

💡 GitHub Flow는 깃허브를 기반으로 한 간단하고 유연한 개발 워크플로우로 주요 목표는 신속한 배포와 효율적인 협업을 지원하는 것이다. Git Flow와 달리 단일 브랜치를 사용하여 개발하는데, 이는 하나의 버전이 만들어지면 바로 배포될 수 있다는 의미이다.
  • 개발을 위해 마스터 브랜치에서 개발 브랜치를 생성한다.
  • 개발자는 지속적으로 개발 브랜치에 코드 변경 사항을 제출한다.
  • 작업이 완료되면 코드 검토를 위해 풀 요청을 제출한다.
  • 검토 또는 검증 중에 코드를 마스터 분기에 동기화하거나 새 제출을 생성하여 검토 또는 검증 피드백에 응답한다.
  • 코드 검토를 통과하고 개발 브랜치가 검증된 후 코드를 마스터 브랜치에 병합한다.
  • 지속적인 배포를 위해 최신 버전의 프로덕션 환경을 배포한다.

Merge 란?

각자의 브랜치에서 개발이 완료 되면 [master] 브랜치에 작업물을 합쳐야 한다.

병합(Merge) : 두 버전의 합집합을 구하는 것으로 아래와 같은 세 가지 상황이 일어날 수 있다.

  • 빨리 감기 (Fast-forward) : 하나의 커밋에만 변화가 있어 새로운 상태를 만들어줄 필요 없이 기존
    커밋과 동일하게 변화가 있는 커밋으로 상태를 바꾸어주는 상황
  • 병합 커밋 (Merge Commit) : 두 커밋에 모두 변화가 있어 병합하면서 새로운 커밋이 만들어지는
    상황
  • 충돌 (Conflict) : 같은 파일에 대해 두 커밋 모두 변화가 있어 어느 쪽으로 합쳐야 할지 충돌이
    일어나는 상황. 충돌이 난 부분을 확인하고 무엇을 남길지 수동으로 선택해서 해결해야함.

빨리 감기(Fast-forward)

[master] 브랜치에서 [menu1] 브랜치를 병합하면 커밋 3는 커밋 2를 단순하게 수정한 수정본이므로 두 상태를 합치면 따로 바뀌는 상태 없이 커밋 3이 된다. 커밋 2를 가리키던 [master] 브랜치가 빨리 감기를 해서 커밋 3를 가리키게 된다.

[menu1] 브랜치의 모든 내용이 [master] 브랜치에 반영 되었으니 [menu1] 브랜치는 삭제 가능하다.

병합 커밋(Merge Commit)

커밋 4는 커밋 2를 기준으로 변경 되었기 때문에 커밋 3과 커밋 4는 병합 커밋이 일어난다. 해당 병합을 [master] 브랜치에 올리거나, [menu2] 브랜치에 올리는 것 둘 다 가능하지만 [master] 브랜치에 올린다.

충돌 (Conflict)

만약 커밋3과 커밋4가 같은 파일에 다른 수정을 한 경우 어느 쪽을 선택해야 할지 알 수 없어 충돌이 발생한다. 충돌을 피하기 위해서는 작업 디렉토리를 세세하게 분리하여 동일 디렉토리 내부에 작업하는 일이 없도록 하는 것이 좋다. 그럼에도 불구하고 충돌이 발생하는 경우에는 충돌 코드 수정 후 병합해야한다.

profile
개발자 희망자

0개의 댓글