프로그래밍/Git

[Git 명령어] git merge 가이드 (충돌 해결)

분석벌레 2025. 12. 11. 13:23
728x90
Git merge 가이드 – 충돌(Conflict) 해결까지 완전 정복
Git · Merge / Conflict

git merge 가이드 – 충돌(Conflict) 해결까지 완전 정복

브랜치를 나누어 개발하는 순간, 언젠가 반드시 만나게 되는 명령이 바로 git merge입니다. 이 글은 merge의 기본 개념부터, 실제로 충돌이 났을 때 어떻게 해결하는지까지 초보자도 이해할 수 있도록 단계별로 정리한 가이드입니다.

#git #git-merge #conflict #branch

1. git merge란 무엇인가?

git merge는 간단히 말해 “두 브랜치의 변경 내용을 하나로 합치는 명령”입니다.

예를 들어:

  • main 브랜치: 배포용 안정된 코드
  • feature/login 브랜치: 로그인 기능 개발용 브랜치

로그인 기능 개발이 끝난 뒤, 그 내용을 main에 반영하고 싶다면
결국 main 브랜치에서 git merge feature/login을 실행하게 됩니다.

merge의 기준은 항상 “현재 체크아웃된 브랜치”입니다.
“내가 지금 서 있는 브랜치에, 다른 브랜치의 변경을 합치는 것”이라고 기억하면 됩니다.

2. 기본 사용법 – 어디에 무엇을 merge할까?

기본 흐름은 다음과 같습니다.

1) 먼저 결과를 담을 브랜치로 이동

git switch main
# 또는
git checkout main

2) 여기에 다른 브랜치 내용을 merge

git merge feature/login

결과적으로 main 브랜치는 feature/login의 변경 사항을 포함하게 됩니다.

3. fast-forward merge vs 3-way merge

3-1. fast-forward merge

브랜치 구조가 다음과 같다고 해봅시다.

  • main: A → B
  • feature/login: A → B → C → D

즉, feature/loginmain에서 갈라져 나와 더 앞서 나가 있고, main은 그 이후 커밋이 없는 상태입니다.

이때:

git switch main
git merge feature/login

이 merge는 단순히 main 브랜치의 포인터를 C, D까지 앞으로 “당겨 놓기만” 하면 되기 때문에 새 merge 커밋이 생기지 않습니다. 이런 형태를 fast-forward merge라고 부릅니다.

3-2. 3-way merge (non-fast-forward)

이번엔 양쪽이 서로 다른 방향으로 진행된 경우입니다.

  • main: A → B → C
  • feature/login: A → B → D

이 상태에서:

git switch main
git merge feature/login

Git은 A, B를 공통 조상으로 보고,
main 쪽의 변경(C)과 feature/login 쪽의 변경(D)을 한데 모아 새로운 merge commit(M)을 만듭니다.

결과:

  • main: A → B → C → M
  • feature/login: A → B → D

이렇게 3개 지점을 비교하여 합치는 것을 3-way merge라고 부릅니다.

4. merge conflict(충돌)는 왜 생길까?

충돌은 단순히 “같은 위치를 서로 다르게 수정했기 때문”입니다.

예를 들어, app.py의 같은 줄을:

  • main에서는 print("로그인 성공") 으로 수정했고,
  • feature/login에서는 print("Login success") 으로 수정했다면

Git 입장에서는 “둘 중 어느 걸 써야 하지?”를 스스로 결정할 수 없기 때문에, 해당 부분을 충돌 상태로 표시하고 사람에게 결정을 맡깁니다.

충돌(Conflict)은 “에러”라기보다
“Git이 대신 선택해 줄 수 없어서, 사용자에게 물어보는 상태”라고 이해하면 마음이 편해집니다.

5. merge conflict가 났을 때 보이는 모습

git merge 후 다음과 같은 메시지가 뜰 수 있습니다.

Auto-merging app.py
CONFLICT (content): Merge conflict in app.py
Automatic merge failed; fix conflicts and then commit the result.

이제 app.py 파일을 열어보면, 충돌 부분이 다음처럼 표시됩니다.

<<<<<<< HEAD
print("로그인 성공")
=======
print("Login success")
>>>>>>> feature/login
  • <<<<<<< HEAD – 현재 브랜치(main)의 내용
  • ======= – 두 버전의 경계
  • >>>>>>> feature/login – merge하려는 브랜치의 내용

6. merge 충돌 해결 절차 – 단계별 가이드

1) 어떤 파일이 충돌났는지 확인

git status

예:

both modified:   app.py
both modified:   templates/login.html

2) 각 파일을 열어서 충돌 구간 찾기

에디터(VSCode 등)에서 충돌 구간은 다음처럼 보입니다.

<<<<<<< HEAD
print("로그인 성공")
=======
print("Login success")
>>>>>>> feature/login

3) 원하는 최종 코드로 직접 수정

예를 들어, 두 쪽 내용을 결합하고 싶다면:

print("로그인 성공 (Login success)")

그리고 반드시
<<<<<<<, =======, >>>>>>>
이 표식들은 모두 삭제해야 합니다.

4) 모든 충돌 파일에 대해 같은 작업 반복

충돌이 난 파일을 하나씩 열어 수정합니다.

5) 수정이 끝난 파일들을 stage에 올리기

git add app.py
git add templates/login.html
# 또는
git add .

6) merge 결과 커밋 만들기

git commit
# 또는
git commit -m "Resolve merge conflict between main and feature/login"

이제 merge가 완료되고, 히스토리에 merge commit 하나가 추가됩니다.

7. merge를 취소하고 이전 상태로 되돌리고 싶을 때

merge 도중 “이 merge 자체를 없던 일로 하고 싶다”는 생각이 들 수 있습니다. 아직 merge 결과를 커밋하지 않았다면, 다음 명령으로 merge를 되돌릴 수 있습니다.

git merge --abort

이 명령은 merge를 시도하기 전 상태로 워킹 디렉토리와 스테이지를 되돌리려고 시도합니다.

8. VSCode 등 GUI 도구로 충돌 해결하기

VSCode를 사용하면 충돌 부분이 시각적으로 구분되어 나타납니다.

  • Current Change (현재 브랜치 쪽)
  • Incoming Change (merge 대상 브랜치 쪽)
  • 둘 다 적용 (Both)

버튼을 눌러 어떤 변경을 선택할지 고를 수 있어 편리합니다. 다만 최종 코드는 항상 직접 눈으로 확인하는 것이 좋습니다.

9. 자주 쓰는 merge 패턴

1) feature 브랜치를 main에 merge하기

git switch main
git pull origin main      # main 최신상태 맞추기
git merge feature/login   # 로그인 브랜치 merge

2) main의 변경을 feature에 먼저 반영해 두기

git switch feature/login
git merge main

이렇게 feature 브랜치에서 먼저 main을 merge하여 충돌을 해결해두면,
나중에 main에 feature를 merge할 때 충돌이 줄어들 수 있습니다.

10. 한눈에 요약

개념 설명
git merge 두 브랜치의 변경을 하나로 합치는 명령
fast-forward 브랜치 포인터만 앞으로 이동, 새 merge commit 없음
3-way merge 공통 조상 + 양쪽 변경을 비교해 새 merge commit 생성
Conflict 같은 부분을 서로 다르게 수정해서 Git이 자동 결합을 못 한 상태
해결 절차 파일 열기 → 충돌 표식 제거하며 직접 수정 → git addgit commit
포기할 때 git merge --abort로 merge 시도 이전 상태로 복구
정리:
git merge는 협업과 브랜치 전략의 핵심입니다.
충돌은 오류가 아니라, Git이 대신 선택해 줄 수 없어서 개발자에게 “어느 쪽이 맞는지” 물어보는 과정일 뿐입니다. 충돌 표식을 읽고, 차근차근 수정하고, git addgit commit만 기억하면 더 이상 merge conflict는 두려운 대상이 아닙니다.