C.W.K.
Stream
Lesson 03 of 05 · published

Merge 모양: fast-forward와 three-way

~22 min · merge, graph

Level 0Untracked 새싹
0 XP0/47 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

merge 모양 두 가지, 멘탈 모델 하나

모든 git merge 는 두 모양 중 하나로 끝나. fast-forward: source 가 분기한 뒤로 target branch 가 안 움직였으면 Git 이 target pointer 를 source 의 tip 으로 그냥 밀어. 새 commit 없음. three-way (진짜) merge: 양쪽 다 움직였으면 Git 이 parent 가 둘인 새 commit 을 만들어 — 너 거 + 상대 거 — Y 자로 history 를 합쳐. graph 자체가 어느 쪽인지 알려줘: 직선 vs 다이아몬드.

fast-forward 는 보통 다른 사람이 안 건드린 branch 에서 작은 기능 끝낼 때 나와. main 그대로인 상태에서 git merge feature 하면 main pointer 만 이동. 단점은 branch 의 존재가 뒤에서 안 보임 — 'feature branch 였다' 신호가 history 에 없고 그냥 더 긴 직선이야. 일부 팀은 fast-forward 가능해도 --no-ff 로 merge commit 강제 — '이게 한 작업 단위였다' 기록 보존하려고.

three-way merge 는 양쪽 다 움직였을 때. Git 이 가장 최근 공통 조상 (common ancestor) 을 base 로 잡고, base 에서 양쪽으로 diff 계산해서 합쳐. diff 가 다른 줄 건드리면 자동 merge. 같은 줄 건드리면 conflict — 다음 레슨이야. merge commit 메시지 default 는 "Merge branch 'feature' into main" — 의미 있는 merge 면 의미 있는 메시지로 교체.

알아둘 flag 두 개. git merge --ff-only 는 fast-forward 불가능하면 거부 — script 에서 merge commit 만들기 싫고 loud 하게 실패시키고 싶을 때. git merge --squash 는 source branch 의 모든 변경을 가져다 target 위에 commit 하나로 stage — branch 의 개별 commit 이 noisy 하고 main 엔 깨끗한 commit 하나만 원할 때.

Code

Fast-forward: pointer 밀기·bash
# main: A - B - C
# feature:        \- D - E   (C 에서 분기)
# main 은 분기 후 안 움직임.

git switch main
git merge feature
# 결과 (fast-forward):
# main: A - B - C - D - E

# 결과 확인:
git log --oneline --graph -n 5
three-way 와 squash 변종·bash
# 양쪽 다 움직임:
# main:    A - B - C - F
# feature:        \- D - E

git switch main
git merge feature                  # parent F + E 인 merge commit G 생성
git merge --no-ff feature          # FF 가능해도 merge commit 강제
git merge --ff-only feature        # FF 불가능하면 거부 (script 친화)
git merge --squash feature         # feature 변경 전체를 commit 하나로 stage
git commit -m "Squashed feature"   # stage 된 변경 commit

# 결과 확인:
git log --oneline --graph --all -n 10

External links

Exercise

scratch repo 에서 fast-forward 시나리오 세팅: main 에서 feature 분기, commit 두 개 추가, main 엔 commit 안 하고 main 에서 git merge feature. git log --oneline --graph 로 직선 확인. git reset --hard 로 merge 전으로 돌아가, 이번엔 main 에 commit 하나 먼저 추가하고 merge. 다이아몬드 모양 확인. FF 케이스에서 git merge --no-ff feature 돌려서 차이 관찰.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.