개발을 하다 보면 로컬에서 작업 중인 파일과 원격 저장소의 최신 커밋이 충돌하는 상황을 꽤나 자주 볼 수 있다.
로컬에서 수정한 파일을 커밋하지 않은 상태에서 git pull을 시도할 경우에 충돌이 발생한다.
우선 시나리오를 간단하게 생각해보자.
원격 저장소에 A 커밋이 추가되고 내가 수정 중인 파일도 그 커밋에 포함되어 있는 파일이다.
로컬 -> 로컬 워킹 디렉토리에서 3개의 커밋을 완료한 후이고 수정 중인 파일이 있다. 이 파일은 아직 커밋되지 않았다.
원격 -> 이미 3개의 커밋이 추가된 상태에서 A 커밋이 추가되었는데 거기에 내가 수정 중인 파일이 포함되어 있었다.
로컬에서 작업 중이던 파일을 수정하고 있던 중 원격 저장소에 A 커밋이 추가된 사실을 인지했다. 너무 오래 git pull을 하지 않았다고 생각하고 원격 저장소의 최신 커밋을 가져오려고 한다. 그래서 git pull 명령어를 실행했다.
충돌 발생
로컬에서 수정한 파일과 원격 저장소에서 A 커밋으로 수정된 파일이 같은 파일이기 때문에 당연히 충돌이 발생한다.
fetch는 성공적으로 수행되지만 merge가 불가능한 상태가 된다.
충돌 메시지는 보통
error: Your local changes to the following files would be overwritten by merge:
<file-path>
Please commit your changes or stash them before you merge.
Aborting
요런 상태로 난다. 원격 저장소엔 A 커밋이 있는데 로컬에는 A 커밋이 없기 때문에 병합할 대상이 없다고 판단한다.
기본적으로 git에서 풀을 땡겨올 때 충돌이 나는 상황에선 우리가 흔히 알고 있는 비교 UI가 보이지만 지금 로컬에선 커밋 자체가 없는 상황이라 비교 대상이 없어서 확인하기 쉽지 않다.
두 가지 해결 방안으로 해결해볼 수 있다.
충돌 해결 1 : 로컬 작업을 커밋한 후 병합
먼저 로컬에서 수정한 파일을 먼저 커밋한다. 현재 로컬 워킹 디렉토리에서 수정한 파일이 있고 이를 아직 커밋하지 않은 상태이다.
로컬 커밋을 먼저 생성한 후 병합을 시도할 수 있다.
git add . # 수정한 모든 파일을 스테이징
git commit -m "로컬 수정 사항 커밋"
이렇게 하고 git pull을 해서 원격 저장소에서 최신 커밋을 가져오면 이땐 우리가 흔히 알 수 있는 UI 충돌 창이 나타난다.
<<<<<<< HEAD
// 로컬 수정 사항
=======
# 원격 저장소의 A 커밋 수정 사항
>>>>>>> origin/main
이렇게 UI가 뜨면 이 부분을 수동으로 수정해서 두 내용을 병합한 후 다시 add로 변경 사항을 스테이징 한 후 커밋을 완료할 수 있다.
git add <충돌 해결된 파일>
git commit -m "충돌 해결"
이제 충돌 해결 후 새 커밋을 완료하면 다시 git push origin main을 하면 원격 저장소에 변경 사항을 푸시할 수 있다.
충돌 해결 2 : 로컬 수정 사항 백업 후 원격 저장소에서 최신 내용 반영
두 번째 방법은 로컬 수정 사항을 백업한 후 원격 저장소에서 최신 변경 사항을 먼저 반영하는 방법이다.
이렇게 하면 원격 저장소의 최신 상태를 우선 반영하고 나중에 로컬 수정 사항을 복원할 수 있다.
먼저 로컬에서 수정한 파일을 git stash 명령어로 임시 저장할 수 있다. 이렇게 하면 로컬에서 수정한 내용을 백업해두고 워킹 디렉토리를 깨끗하게 만들 수 있다.
그 후 git pull을 통해 원격 저장소에서 최신 커밋을 로컬에 반영한 후 git stash pop으로 로컬 수정 사항을 다시 복원하면 된다!
이때 충돌이 발생하면 수동으로 충돌을 해결하고 커밋을 진행하면 되는 것이다.
git stash
↓
git pull origin main
↓
git stash pop
↓
git add <스테이징 할 병합 파일>
git commit -m "충돌 해결"
↓
git push origin main
이런 순서대로 진행하면 된다. 보통 stash를 많이 쓴다고 한다.
git은 보면 볼 수록 재밌고 사용하기 쉬운 것 같다. 이제 팀 프로젝트를 통해서 github에 더 익숙해져야겠다.
'Git, CICD > Git,Github' 카테고리의 다른 글
| 폴더 이름 하나 바꿨다가 Git 이력 다 날릴 뻔한 썰푼다. (0) | 2025.10.20 |
|---|---|
| Git에 엉뚱한 폴더까지 올라간다? (2) | 2025.08.28 |
| [github] 프로젝트 협업하기 (1) | 2024.12.27 |
| git의 branch 생성과 커밋, 병합 연습 (4) | 2024.10.12 |
| [Git] 오류 해결 Updates were rejected because the remote contains work that you do... (0) | 2024.09.16 |