머지 충돌이 나는 이유와 해결 절차를 익히고 git rebase의 기초와 merge와의 차이를 이해한다.
충돌 해결과 리베이스
여러 사람이 같은 파일의 같은 부분을 다르게 고치면 충돌(conflict) 이 납니다. 충돌은 오류가 아니라, Git이 "어느 쪽이 맞는지 모르겠으니 네가 정해라"라고 묻는 것입니다. 충돌 해결과 함께 이력을 정리하는 리베이스를 배웁니다.
학습 목표
- 머지 충돌이 나는 이유를 안다.
- 충돌을 해결하는 절차를 따라 한다.
git rebase기초를 이해한다.- merge와 rebase의 차이를 구분한다.
충돌이 나는 이유
Git은 대개 변경을 자동으로 합칩니다. 하지만 두 브랜치가 같은 파일의 같은 줄을 서로 다르게 바꿨다면 자동으로 판단할 수 없어 충돌이 발생합니다.
git switch main
git merge feature/login
# CONFLICT (content): Merge conflict in index.html
# Automatic merge failed; fix conflicts and then commit the result.
충돌 해결 절차
git status로 충돌 난 파일을 확인합니다.
git status
# both modified: index.html
- 충돌 파일을 열면 Git이 양쪽 내용을 표시해 둡니다.
<<<<<<< HEAD
<h1>현재 브랜치(main)의 내용</h1>
=======
<h1>합치려는 브랜치(feature)의 내용</h1>
>>>>>>> feature/login
<<<<<<< HEAD~=======: 현재 브랜치의 내용=======~>>>>>>> feature/login: 합치려는 브랜치의 내용
- 직접 편집해 최종적으로 원하는 코드만 남깁니다.
<<<<<<<,=======,>>>>>>>표시줄은 모두 지웁니다.
<h1>최종으로 결정한 내용</h1>
- 해결한 파일을 스테이징하고 커밋해 머지를 마무리합니다.
git add index.html
git commit # 머지 커밋 완성 (메시지는 보통 자동 생성)
머지를 중단하고 처음 상태로 돌아가려면
git merge --abort
git rebase 기초
merge가 두 갈래를 합치는 머지 커밋을 만든다면, rebase는 한 브랜치의 커밋들을 다른 브랜치 끝으로 옮겨 다시 쌓아 일직선 이력을 만듭니다.
git switch feature/login
git rebase main # feature 의 커밋들을 최신 main 위로 다시 올림
merge 결과: rebase 결과:
main ●──●──◆ (머지 커밋) main ●──●──●'──●'
\ / (feature 가 main 뒤로 일직선)
feature ●●
리베이스 중에도 충돌이 날 수 있는데, 위와 같은 방식으로 해결한 뒤 다음으로 진행합니다.
git add <파일>
git rebase --continue # 다음 커밋으로 진행
git rebase --abort # 리베이스 취소
⚠️ rebase는 커밋 해시를 새로 만들며 이력을 바꿉니다. 이미 push해서 남과 공유한 커밋은 rebase하지 마세요. 협업자의 이력과 어긋납니다.
merge vs rebase
| merge | rebase | |
|---|---|---|
| 이력 모양 | 갈래가 보이는 그래프 | 일직선 |
| 머지 커밋 | 생김 | 없음(깔끔) |
| 원본 커밋 | 보존 | 새로 다시 만듦 |
| 공유된 커밋에 사용 | 안전 | 위험 |
정해진 정답은 없습니다. 협업 이력을 그대로 남기고 싶으면 merge, 로컬에서 내 브랜치를 깔끔히 정리해 PR을 올리고 싶으면 rebase를 쓰는 식으로 팀 규칙을 따릅니다.
요약
충돌은 같은 줄을 다르게 고쳤을 때 나며, 충돌 표시(<<<<<<<)를 직접 정리한 뒤 add → commit으로 마무리합니다. rebase는 커밋을 다시 쌓아 일직선 이력을 만들지만, 공유된 커밋에는 쓰지 않습니다. 다음 강좌에서는 GitHub로 협업하는 흐름을 배웁니다.
댓글 0
“Git & GitHub” 강좌에 대한 댓글입니다.