Git

Git error해결방법: Your local changes to the following files would be overwritten by merge

Posted by Geuni's Blog on April 28, 2022

로컬에서 수정한 소스와 원격지 소스와 충돌이 있을때 해당오류가 발생한다.

1
2
3
4
error: Your local changes to the following files would be overwritten by merge:
	README.md
Please commit your changes or stash them before you merge.
Aborting

우리가 pull명령으로 원격지 소스를 가져올때 git는 우리의 로컬repository와 working directory를 업데이트 하게 된다. 우리가 로컬에서 소스 수정을 했는데 원격지 창고에서도 파일변경이 발생햇다. 이때 pull할려면 로컬소스 버전을 미리 저장을 해야된다. 이는 git가 로컬소스 보호를 목적으로 만든 기능이다. 열심히 코딩한 소스가 pull명령 하나로 날라간다면 누구든 억울할것이다.

오류 재현:

나의 원격지 창고에 README.md파일이 하나 있다고 하자. 내용을 아래와 같다.

1
init

clone명령으로 로컬에 소스를 땡긴후 원격지 소스를 바로 수정한다(다른 누군가가 push했다고 가장). 현재 원격지 소스내용은 아래와 같다.

1
2
init
<remote>에서 추가한 내용

그리고 로컬파일에 아래와 같이 한줄 추가하자.

1
2
init
<local>에서 추가한 내용

이어서 pull해보자

1
git pull origin main

아래와 같은 오류가 뜨게 된다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
➜  test git:(main) git pull origin main
remote: Enumerating objects: 8, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), 1.28 KiB | 164.00 KiB/s, done.
From github.com:your_repo/test
 * branch            main       -> FETCH_HEAD
   8859462..0970015  main       -> origin/main
Updating 8859462..0970015
error: Your local changes to the following files would be overwritten by merge:
        README.md
Please commit your changes or stash them before you merge.
Aborting

해결방법:

오류메시지에서 이미 해결방법을 제시했다. commit 혹은 stash를 명령을 이용할수 있다.

해결방법1,commit

소스가 commit해도 될 수준이라면 commit > pull > 충돌해결 > commit & push 순서로 해결하면 된다.

1
2
git add README.md
git commit -m "update README.md"
1
git pull origin main

현재 README.md 내용은 아래 같다

1
2
3
4
5
6
7
8
<<<<<<< HEAD
init
<local>에서 추가한 내용
=======
init  
<remote>에서 추가한 내용
>>>>>>> 0fa467e983cdfa2bb31450f2979570954ac9346a

현재단계에서 충돌해결후 원격지에 push하면 된다.

1
2
3
git add README.md
git commit -m "Resolved conflict"
git push -u origin main

해결방법2,stash

stash명령에 대한 git홈페이지 소개는 아래와 같다.

Use git stash when you want to record the current state of the working directory and the index, but want to go back to a clean working directory

깨끗한 working directory를 원하지만 로컬 변경내역을 저장하고 싶을때 해당 명령을 쓰라는 얘기다. 주로 소스가 commit할 준비가 안된 상황에서 branch변경 혹은 현재와 같이 충돌난 소스를 땡겨야 할때 쓰게된다.

위와 같은 case로 원격지 창고와 로컬에서 같은 파일내용을 편집한 상황이다.

1
2
init  
<local>에서 추가한 내용

git stash명령을 실행하면 로컬변경이 숨겨진것을 확인할수 있다. 이때 git status명령으로 깨끗한 working directory를 확인할수 있으며 당연히 pull가능하다.

1
git pull origin main

원격지 소스는 이미 땡겨왓다. 이어 git stash pop명령을 실행하면 파일내용이 아래같이 변한것을 확인할수 있다.

1
2
3
4
5
<<<<<<< Updated upstream
<remote>에서 추가한 내용
=======
<local>에서 추가한 내용
>>>>>>> Stashed changes

이제 충돌 해결후 commit해주자.(충돌해결건은 따로 commit을 하나 따주는게 좋다)