[Git] Merge & Rebase

Woomin Wang ·2025년 5월 9일
0

[Git]

목록 보기
2/2
post-thumbnail

WiSoft Git 세미나에서 MergeRebase에 대해 학습하였습니다.

우선 Git-visualizing 도구를 활용해 merge와 rebase 명령어를 실행하며, 각 명령어에 따른 커밋 이력의 구조 변화를 시각적으로 확인했습니다. 이후에는 VS Code를 사용해 실제 상황을 구성하고, 직접 명령어를 실행해보며 실습을 진행하였습니다.

Git-visualizing 도구에서 사용된 Master 브랜치는 Main 브랜치로 명명하여 이해를 통일했습니다.

처음에 Merge와 Rebase의 주체와 대상 개념이 혼동되어 이를 먼저 정리한 뒤 학습을 이어갔습니다.

Git merge vs rebase: 주체 / 대상 정리

  • merge: 현재 브랜치(주체)에 다른 브랜치(대상)의 변경사항을 끌어온다.
  • rebase: 현재 브랜치(주체)를 다른 브랜치(대상)의 최신 커밋 위에 다시 쌓는다.

구분명령어주체 (현재 브랜치)대상 (인수 브랜치)결과 요약
mergegit checkout main
git merge feature
mainfeaturemain 브랜치에 feature의 변경사항이 병합됨
rebasegit checkout feature
git rebase main
featuremainfeature 브랜치를 main 뒤에 다시 쌓음

Merge


✔️ 입력한 명령어

git checkout master
git merge feature

main 브랜치로 feature 브랜치를 merge하면, 결과적으로 새로운 병합 커밋이 생성됩니다. 즉, main 브랜치(주체)가 feature 브랜치(대상)의 변경사항을 끌어와 자신의 이력에 통합하는 방식입니다.

Rebase


✔️ 입력한 명령어

git checkout feature
git rebase master

feature 브랜치를 main 브랜치를 기준(base)으로 다시 커밋을 쌓습니다. 즉, feature 브랜치(주체)가 main 브랜치(대상) 위로 올라가는 구조입니다.

rebase는 기존 커밋을 재사용하지 않고, 새로운 커밋 객체를 생성합니다. 이때 생성되는 커밋들은 기존 커밋과 동일한 내용이라 하더라도 해시값이 달라지며, 기존 feature 브랜치의 커밋 이력은 사라지고 새로운 이력으로 대체됩니다.

브랜치 이력 맞추기

✔️ 입력한 명령어

git checkout master
git merge feature

이후 main 브랜치에서 git merge feature를 실행하면, 두 브랜치가 선형 관계일 경우 Git은 fast-forward 방식으로 병합을 수행합니다.
이는 새로운 병합 커밋 없이, main 브랜치의 포인터를 feature 브랜치의 최신 커밋으로 단순히 이동시키는 방식입니다.

✅ Fast-forward란?

fast-forward는 브랜치 간 병합 시, 현재 브랜치의 커밋 이력이 대상 브랜치의 이력에 포함되어 있을 경우, 즉 두 브랜치가 선형 관계일 때, 새로운 병합 커밋 없이 포인터만 이동시키는 방식입니다.


VS-Code: 실습

✔️ 입력한 명령어

# main 브랜치의 상태
echo "console.log('Hello from main');" > index.js
git add index.js
git commit -m "feat: 초기 main 커밋"

# feature 브랜치 생성 및 커밋
git switch -c feature

echo "console.log('Feature A');" >> index.js
git add index.js
git commit -m "feat: Feature A 추가"

echo "console.log('Feature B');" >> index.js
git add index.js
git commit -m "feat: Feature B 추가"

# main 브랜치에서 추가 작업
git switch main

echo "console.log('Hotfix from main');" >> index.js
git add index.js
git commit -m "fix: main 브랜치에서 hotfix"

현재 저장소에는 mainfeature 두 개의 브랜치가 존재합니다. main 브랜치와 feature 브랜치가 서로 다른 커밋 이력을 가지며, feature 브랜치는 기능 개발 커밋 2개를, main 브랜치는 핫픽스 커밋 1개를 포함하고 있는 상태입니다.

feature 브랜치에서 main 브랜치를 기준으로 rebase 했습니다.
앞서 살펴본 대로, 기존 커밋들이 새로운 해시값을 가진 커밋으로 대체되었으며, feature 브랜치의 기존 커밋 이력은 사라진 것을 확인할 수 있습니다.

main 브랜치로 switch한 후, feature 브랜치를 merge 했습니다. 이미 feature 브랜치에 main 브랜치의 이력이 포함되어 있어, 선형적 구조가 되어 fast-forward 방식으로 병합이 이루어졌습니다. 결과적으로 main 브랜치의 포인터만 변경된 걸 확인할 수 있습니다.

Rebase 충돌 해결 과정

RebaseMerge에 비해 충돌 발생 가능성이 더 높습니다.
위 상황에서는 Feature A 추가, Feature B 추가 두 커밋이 각각 main 브랜치와 충돌할 경우, 각 커밋마다 충돌을 해결해야 합니다. rebase 과정에서는 커밋을 다시 적용하면서 여러 단계에서 충돌이 발생할 수 있으며, 각 충돌을 수동으로 해결한 후 git rebase --continue를 통해 계속 진행해야 합니다.


참고사항

profile
Backend Developer

0개의 댓글