| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- file upload
- 개발이 취미인 사람
- AWS
- restful api
- 상속
- front-end
- back-end
- Kotlin
- react
- component
- 코틀린
- kafka
- jpa
- props
- 조건문
- Sequelize
- It
- spring boot
- Nest.js
- node.js
- 반복문
- Producer
- java
- 개발이취미인사람
- state
- SWIFT
- 개발자
- swagger
- javascript
- vue
- Today
- Total
개발이 취미인 사람
[Git] - 브랜치 병합(Merge) 방법 본문
개요
안녕하세요. 이번 시간에는 Git 브랜치 병합(Merge) 방법에 대해 알아보겠습니다. 브랜치에서 작업을 완료한 후에는 메인 브랜치에 병합하는 과정이 필요합니다. 이번 글에서는 다양한 병합 방법과 각각의 특징을 살펴보겠습니다. 혹시 이전 시간에 내용을 학습하고 오시지 못 하신 분들은 학습하고 오시는 걸 추천드리겠습니다.
[[Git] - 브랜치(Branch) 개념과 생성/삭제
- Merge란?
Merge(병합)는 두 개의 브랜치를 하나로 합치는 작업입니다. 보통 기능 개발이 완료된 브랜치를 메인 브랜치에 병합할 때 사용합니다.
병합 전:
main: A --- B --- C
\
feature/login: D --- E
병합 후:
main: A --- B --- C --- M (Merge Commit)
\ /
feature/login: D --- E
- Merge의 종류
Git에서 병합은 크게 세 가지 방식으로 이루어집니다.
종류 설명 커밋 히스토리
| Fast-Forward | 브랜치 포인터만 이동 | 선형 |
| 3-Way Merge | 병합 커밋 생성 | 분기 유지 |
| Squash Merge | 하나의 커밋으로 압축 | 선형 |
- Fast-Forward Merge
개념
Fast-Forward Merge는 병합할 브랜치가 현재 브랜치의 직접적인 연장선에 있을 때 발생합니다. 별도의 병합 커밋 없이 브랜치 포인터만 앞으로 이동합니다.
병합 전:
main: A --- B
\
feature: C --- D
Fast-Forward 병합 후:
main: A --- B --- C --- D
↑
(main)
실습
# 1. 프로젝트 초기화
mkdir merge-practice
cd merge-practice
git init
# 2. main 브랜치에서 첫 커밋
echo "# Merge Practice" > README.md
git add .
git commit -m "init: 프로젝트 시작"
# 3. feature 브랜치 생성 및 이동
git switch -c feature/login
# 4. feature 브랜치에서 커밋
echo "login()" > login.js
git add .
git commit -m "feat: 로그인 기능 추가"
echo "logout()" >> login.js
git add .
git commit -m "feat: 로그아웃 기능 추가"
# 5. main으로 이동
git switch main
# 6. 병합 (Fast-Forward)
git merge feature/login
# 출력
Updating a1b2c3d..c3d4e5f
Fast-forward
login.js | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 login.js
# 7. 로그 확인 (선형 히스토리)
git log --oneline
# c3d4e5f feat: 로그아웃 기능 추가
# b2c3d4e feat: 로그인 기능 추가
# a1b2c3d init: 프로젝트 시작
Fast-Forward 비활성화
병합 커밋을 항상 생성하고 싶다면 --no-ff 옵션을 사용합니다.
git merge --no-ff feature/login
# 에디터가 열리며 병합 커밋 메시지 입력
# 기본값: Merge branch 'feature/login'
--no-ff 사용 시:
main: A --- B --------- M
\ /
feature: C --- D
- 3-Way Merge
개념
3-Way Merge는 두 브랜치가 서로 다른 커밋을 가지고 있을 때 발생합니다. 공통 조상(Base), 현재 브랜치(Ours), 병합할 브랜치(Theirs) 세 가지를 비교하여 병합합니다.
병합 전:
main: A --- B --- C
\
feature: D --- E
3-Way Merge 후:
main: A --- B --- C --- M (Merge Commit)
\ /
feature: D --- E
실습
# 1. main 브랜치에서 시작
git switch main
# 2. feature 브랜치 생성 및 작업
git switch -c feature/signup
echo "signup()" > signup.js
git add .
git commit -m "feat: 회원가입 기능 추가"
# 3. main 브랜치로 돌아가서 다른 작업
git switch main
echo "# Updated README" >> README.md
git add .
git commit -m "docs: README 업데이트"
# 4. 현재 상태 확인
git log --oneline --all --graph
# * e5f6g7h (HEAD -> main) docs: README 업데이트
# | * d4e5f6g (feature/signup) feat: 회원가입 기능 추가
# |/
# * c3d4e5f feat: 로그아웃 기능 추가
# 5. feature/signup 병합 (3-Way Merge)
git merge feature/signup
# 에디터가 열림 - 병합 커밋 메시지 작성
# 기본값: Merge branch 'feature/signup'
# 6. 로그 확인
git log --oneline --graph
# * f6g7h8i (HEAD -> main) Merge branch 'feature/signup'
# |\
# | * d4e5f6g feat: 회원가입 기능 추가
# * | e5f6g7h docs: README 업데이트
# |/
# * c3d4e5f feat: 로그아웃 기능 추가
- Squash Merge
개념
Squash Merge는 병합할 브랜치의 모든 커밋을 하나의 커밋으로 압축하여 병합합니다. 브랜치의 세부 커밋 히스토리가 필요 없을 때 유용합니다.
병합 전:
main: A --- B
\
feature: C --- D --- E
Squash Merge 후:
main: A --- B --- F (C+D+E 압축)
* feature 브랜치의 커밋들이 하나로 합쳐짐
실습
# 1. feature 브랜치 생성 및 여러 커밋
git switch -c feature/payment
echo "payment()" > payment.js
git add .
git commit -m "feat: 결제 함수 추가"
echo "refund()" >> payment.js
git add .
git commit -m "feat: 환불 함수 추가"
echo "receipt()" >> payment.js
git add .
git commit -m "feat: 영수증 함수 추가"
# 2. main으로 이동
git switch main
# 3. Squash Merge
git merge --squash feature/payment
# 출력
Updating f6g7h8i..g7h8i9j
Squash commit -- not updating HEAD
payment.js | 3 +++
1 file changed, 3 insertions(+)
create mode 100644 payment.js
# 4. 스테이징 상태 확인 (커밋 전)
git status
# Changes to be committed:
# new file: payment.js
# 5. 직접 커밋 (메시지 작성)
git commit -m "feat: 결제 기능 추가 (payment, refund, receipt)"
# 6. 로그 확인 (선형 히스토리, 단일 커밋)
git log --oneline
# h8i9j0k feat: 결제 기능 추가 (payment, refund, receipt)
# f6g7h8i Merge branch 'feature/signup'
Squash Merge 특징
장점 단점
| 깔끔한 히스토리 | 세부 커밋 이력 손실 |
| 하나의 의미있는 커밋 | 디버깅 시 추적 어려움 |
| 리뷰하기 쉬움 | 큰 변경사항 파악 어려움 |
- Merge 전략 비교
# Fast-Forward (기본)
git merge feature/branch
# Fast-Forward 비활성화 (항상 병합 커밋 생성)
git merge --no-ff feature/branch
# Squash (커밋 압축)
git merge --squash feature/branch
git commit -m "커밋 메시지"
언제 어떤 전략을 사용할까?
상황 추천 전략
| 간단한 버그 수정 | Fast-Forward |
| 기능 개발 완료 | --no-ff (병합 커밋으로 기록) |
| 실험적 작업, 많은 WIP 커밋 | Squash |
| 오픈소스 PR | 프로젝트 정책에 따름 |
- 병합 취소하기
병합 전으로 돌아가기
# 병합 중 취소 (충돌 해결 중 등)
git merge --abort
# 병합 완료 후 취소 (커밋 전)
git reset --hard HEAD
# 병합 커밋 후 취소
git reset --hard HEAD~1
병합 커밋 되돌리기 (이력 유지)
# 병합 커밋을 되돌리는 새 커밋 생성
git revert -m 1 HEAD
# -m 1: 첫 번째 부모(main)를 기준으로 되돌림
- 실전 병합 워크플로우
실제 프로젝트에서의 병합 과정입니다.
# 1. 최신 main 브랜치 가져오기
git switch main
git pull origin main
# 2. feature 브랜치 생성
git switch -c feature/new-feature
# 3. 작업 및 커밋
# ... 작업 ...
git add .
git commit -m "feat: 새 기능 구현"
# 4. main 브랜치의 변경사항 가져오기 (선택)
git switch main
git pull origin main
git switch feature/new-feature
git merge main # 또는 git rebase main
# 5. main으로 이동하여 병합
git switch main
git merge --no-ff feature/new-feature
# 6. 원격 저장소에 푸시
git push origin main
# 7. feature 브랜치 삭제
git branch -d feature/new-feature
git push origin --delete feature/new-feature
- 병합 시 유용한 옵션
# 병합 커밋 메시지 직접 지정
git merge feature/branch -m "feat: 기능 병합"
# 병합 미리보기 (실제 병합 안함)
git merge --no-commit feature/branch
git diff --staged # 변경 내용 확인
git merge --abort # 취소
# 병합 가능 여부 확인
git merge --no-commit --no-ff feature/branch
git merge --abort
- 병합 명령어 정리
# 기본 병합
git merge 브랜치명
# 병합 옵션
git merge --no-ff 브랜치명 # 항상 병합 커밋 생성
git merge --squash 브랜치명 # 커밋 압축 (별도 커밋 필요)
git merge --abort # 병합 취소
# 병합 메시지
git merge 브랜치명 -m "메시지"
# 병합 확인
git log --oneline --graph # 그래프로 히스토리 확인
git branch --merged # 병합된 브랜치 목록
git branch --no-merged # 병합 안된 브랜치 목록
마무리
이번 시간에는 Git 브랜치 병합(Merge) 방법에 대해 알아봤습니다. Fast-Forward, 3-Way Merge, Squash Merge 각각의 특징을 이해하고 상황에 맞게 사용하시면 됩니다. 병합은 협업에서 필수적인 과정이므로 충분히 연습하시길 추천드립니다.
다음 시간에는 Rebase vs Merge 차이점에 대해 알아보겠습니다.
참고 자료
'컴퓨터공학 > Git' 카테고리의 다른 글
| [Git] - 충돌(Conflict) 해결 방법 (0) | 2025.12.22 |
|---|---|
| [Git] - Rebase vs Merge 차이점 (0) | 2025.12.21 |
| [Git] - 브랜치(Branch) 개념과 생성/삭제 (0) | 2025.12.19 |
| [Git] - .gitignore 설정 방법 (0) | 2025.12.18 |
| [Git] - Git 기본 명령어 (init, add, commit, status, log) (1) | 2025.12.16 |