Git merge
더 많은 작업
깃 머지(Git merge)는 두 개 이상의 브랜치의 변경 내역을 하나로 합치는 작업이다. 즉, 별도로 개발된 브랜치들의 커밋 흐름을 하나의 브랜치에 병합하여 통합된 히스토리를 만드는 방법이다.
머지는 공통 조상 커밋을 기준으로 각각의 브랜치 변경사항을 비교한 뒤, 공통 조상 이후의 변경을 한쪽 브랜치(현재 브랜치)에 반영하는 방식이다.
간단한 예를 들어보자:
A --- B --- C (feature)
/
D --- E --- F (main)
위 상태에서 `feature` 브랜치를 `main` 브랜치로 병합한다고 하면:
git checkout main
git merge feature
결과적으로는:
A --- B --- C (feature)
/ \
D --- E --- F ----------- M (main)
여기서 M은 새롭게 생성된 병합 커밋이다. 이 병합 커밋은 양쪽 브랜치의 변경을 모두 포함한다.
만약 대상 브랜치가 병합하려는 브랜치를 이미 포함하고 있다면, Git은 단순히 브랜치 포인터를 앞으로 이동시키는 **fast-forward** 방식을 사용할 수 있다. 이 경우 별도의 병합 커밋 없이 브랜치가 “이어 붙는다”.
git merge --ff-only feature
병합 커밋 없이 브랜치가 뒤따라붙는 형태가 된다.
병합 대상 브랜치가 공통 조상 이후로 변경이 있다면, Git은 새로운 병합 커밋을 생성한다. 이는 두 브랜치의 변경 내역을 모두 포함하는 새로운 커밋이다.
git merge feature
여러 커밋을 하나로 합쳐서 병합하고 싶을 때는 `--squash` 옵션을 사용한다. 이는 실제로는 병합(commit)을 하지 않고, 변경 사항을 staging 한 뒤 수동으로 커밋하게 한다.
git merge --squash feature
git commit
단, 이 방식은 커밋 히스토리를 병합하지 않으며 브랜치 간 관계도 유지되지 않는다.
브랜치 간 변경 사항이 겹치면 병합 충돌이 발생한다. 이 경우 Git은 자동 병합을 멈추고 충돌 파일을 표시한다. 사용자는 충돌을 수동으로 수정한 뒤 아래 명령으로 병합을 완료해야 한다:
git add <충돌 수정한 파일>
git commit
머지를 중단하고 이전 상태로 되돌리고 싶다면:
git merge --abort
- 기능 브랜치를 `main` 브랜치에 통합할 때 유용하다.
- `--no-ff` 옵션을 사용하여 병합 커밋을 강제로 남기면 브랜치 병합 이력을 추적하기 쉽다.
git merge --no-ff feature
- 자주 병합하면 충돌 가능성을 줄일 수 있다.
- 병합 전에 항상 `git fetch`로 최신 상태를 반영하고, `git status`를 확인하는 습관이 좋다.
- Git 공식 문서 — git‑merge 매뉴얼
- Scott Chacon & Ben Straub, Pro Git (Apress)