'
본문 바로가기
study/Git&Github

[Git & GitHub] - 브랜치 branch & 병합 merge

by meowdule 2025. 2. 1.

 

1. 브랜치와 브랜치 전략

 

브랜치란?

브랜치는 프로젝트의 독립적인 작업 흐름을 관리하는 기능입니다.

  • 새로운 기능 개발, 버그 수정 등에서 작업 공간을 분리하여 안전하게 작업할 수 있습니다.
  • 브랜치를 사용하면 기존 코드에 영향을 주지 않고 새로운 기능을 추가할 수 있습니다.


 

Git Branch 전략 (Git Flow & GitHub Flow)

1) Git Flow

Git Flow는 명확한 버전 관리가 필요한 프로젝트(예: 오픈소스 라이브러리, 앱 개발)에 적합한 전략입니다.

브랜치 구성

  • Master(Main): 출시 가능한 코드 저장소
  • Develop: 개발 작업이 통합되는 브랜치
  • Feature: 각 기능별 작업 브랜치
  • Release: 출시 준비를 위한 브랜치
  • Hotfix: 긴급 버그 수정을 위한 브랜치

Git Flow의 특징

  • 다양한 브랜치로 복잡한 프로젝트를 구조화
  • 다중 버전 지원에 적합

 

 

2) GitHub Flow

GitHub Flow는 깃허브를 기반으로 한 간단하고 유연한 워크플로우로, 신속한 배포에 적합합니다.

브랜치 구성

  • Main: 기본 배포 브랜치
  • Feature: 각 기능 개발을 위한 브랜치

GitHub Flow의 특징

  • 지속적 통합과 배포(CI/CD)에 최적화
  • 풀 리퀘스트(PR)를 통해 코드 검토 및 병합


브랜치 규칙 (Branch Rule)

  1. Main 브랜치에는 직접 커밋 금지
    •   작업 브랜치가 꼬일 위험 방지
  2. 기능 작업 전에 Main 브랜치 기준으로 새로운 브랜치 생성
  3. 브랜치 이름은 feature/기능명 형식으로 작성
  4. 작업이 완료되면 다음 단계를 따릅니다:
    1. 원격 저장소(origin)의 Main 상태를 가져오기 (git fetch)
    2. Main 브랜치를 Feature 브랜치에 병합 (git merge)
    3. Feature 브랜치를 푸시 (git push)
    4. **Pull Request(PR)**를 통해 병합 요청

 

 

 

 

 

2. 병합(merge)

 

Merge (병합)

  • Merge : 두 개 이상의 브랜치를 하나로 합치는 작업
                   각각의 브랜치에서 개발 완료 → main 브랜치로 병합하는 과정
    • 두 버전의 합집합을 구하는 것으로 아래와 같은 세 가지 상황이 일어날 수 있다.

 

1) 빨리 감기 (Fast-forward)

  • 하나의 커밋에만 변화가 있어 새로운 상태를 만들어줄 필요 없이
    기존 커밋과 동일하게 변화가 있는 커밋으로 상태를 바꾸어주는 상황
  • main 브랜치가 기능 브랜치 중 한가지로 병합(이동)


 

2) 병합 커밋 (Merge Commit)

  • 양쪽 브랜치에 모두 변화가 있는 경우 새로운 병합 커밋이 생성됩니다.
  • 협업 시 작업 내역을 명확하게 기록하기 위해 주로 사용됩니다.


 

3) 충돌 (Conflict)

  • 같은 파일에 대해 두 커밋 모두 변화가 있어 어느 쪽으로 합쳐야 할지 충돌이 일어나는 상황.
  • 충돌이 난 부분을 확인하고 무엇을 남길지 수동으로 선택해서 해결해야함.

 

 

 

 

3. 기본 명령어


브랜치 & 병합 명령어


1) git branch

# 현재 모든 로컬 브랜치 확인
git branch

# 원격 브랜치 포함 모든 브랜치 확인
git branch -a

# 원격 브랜치만 확인
git branch -r

# 브랜치와 마지막 커밋 확인
git branch -v

# 브랜치 삭제
# 병합이 완료된 브랜치를 삭제합니다.
git branch -d <브랜치명>

 

 

2) git checkout

# 브랜치 생성 및 전환
# 새로운 브랜치를 생성하고 해당 브랜치로 전환합니다.
git checkout -b <새로운 브랜치 명>

# 브랜치 명이 기존에 있는 경우 전환, 기존에 없는 브랜치 명인 경우 새 브랜치 생성
# 새로운 브랜치 생성
git checkout <새 브랜치 명>
# 브랜치 전환
git checkout <전환할 브랜치 명>

# 특정 커밋 상태로 되돌리기 
git checkout <커밋아이디>

# 최신 커밋 상태로 변경
git checkout -
git checkout -- <파일명>

 

 

3) git merge

# 브랜치 병합
# 다른 브랜치의 작업 내용을 현재 브랜치에 병합합니다.
git merge <브랜치명>

# Fast-forward 병합 강제 방지 (새로운 병합 커밋 생성)
git merge --no-ff <브랜치명>

 

 

 

 

4. 브랜치 실습 (생성/전환/병합)

 

1) 브랜치 생성 및 전환

  • 새로운 브랜치 생성
# 현재 브랜치 확인
git branch

# 새로운 브랜치 생성 및 전환
git checkout -b feature/add-task
 
 

2) 파일 생성 및 작업

  • 새로운 파일  생성 & 작업
# 새 파일 생성 및 내용 입력
echo "console.log('Add Task Functionality');" > app.js

# 변경사항 Staging Area로 추가하고 커밋
git add app.js
git commit -m "feat: 할 일 추가 기능 구현"

 

 

3) 브랜치 전환

  • 브랜치를 전환합니다
# main 브랜치로 전환
git checkout main
 
 
Windows 탐색기에서 상태 확인:
  • 방금 생성한 app.js 파일이 메인 브랜치에는 존재하지 않는 상태로 변경됩니다.
  • Git은 브랜치에 따라 파일 상태를 자동으로 관리
feature/app-task


main


 

SourceTree를 활용한 브랜치 전환

  • SourceTree에서 브랜치 목록을 클릭하여 브랜치를 전환할 수 있습니다.
  • 브랜치 전환 시 현재 작업 디렉토리에 따라 파일 상태가 변경됨을 시각적으로 확인할 수 있습니다.

 

 

4) 브랜치 병합

  • 브랜치 병합
# 브랜치 병합 (현 브랜치와 작성한 브랜치 병합)
git merge feature/add-task

 

 

더보기
  • 병합 완료 후 브랜치 삭제
    • 기능 구현이 완료되거나 병합 후 사용하지 않는 브랜치를 삭제하는 명령어입니다.
# 작업을 완료한 브랜치 삭제 (선택사항)
# 뒤의 실습에서는 계속 같은 브랜치 사용 예정이니 삭제하신다면 다시 생성해주시길 바랍니다.
git branch -d feature/add-task

 

 

 

 

 

5. 충돌 상황과 해결 방법

 

1) 두 브랜치에서 동일 파일 수정

  • 두 브랜치에서 동일한 파일을 수정할 경우 충돌 발생
  • main 브랜치 & feature/add-task 브랜치 수정:
# main 브랜치에서 app.js 파일 수정 후 커밋
echo "console.log('Main Task Functionality');" >> app.js
git add app.js
git commit -m "fix: Main task update"

# feature/add-task 브랜치에서 app.js 파일 수정 후 커밋
git checkout feature/add-task
echo "console.log('Feature Task Updated');" >> app.js
git add app.js 
git commit -m "fix: Feature task update"
Main 브랜치




feature/add-task 브랜치

 

2) 병합을 통한 충돌 상황

  • 메인 브랜치로 돌아가 병합 시도:
# main 브랜치로 전환
git checkout main

# main 브랜치와 feature/add-task 브랜치 병합
git merge feature/add-task

 
 

3) 충돌 상황 해결

  • 충돌 해결 방법:
    • 충돌 메시지 확인
      • Git에서 충돌을 알려줍니다. 충돌 파일을 수정해야 합니다.

 

  • 파일 수동 수정
    • 충돌이 발생한 파일을 열고 다음과 같이 수정합니다:

  • 원하는 내용을 선택하여 수정 후 저장합니다.
    • <<<<<<<< 와 >>>>>>> 라인만 제거하면 저장 가능한 상태가 됩니다.

  • 수정 사항 커밋
# 수정된 파일 커밋
git add app.js
git commit

 

 

 

 

 

 

마무리
브랜치는 작업하다 한번쯤 충돌이 일어나는 만큼 확실히 이해해야합니다.