본문 바로가기
junior developer :)/developer

git push error (Updates were rejected because the remote contains work that you do)

by ㅁ윤슬ㅁ 2023. 10. 19.
728x90
반응형

작업물을 push하려고 시도중에 다음과 같은 오류사항이 생겼다.

hint에 맞게 pull도 다시 해보고, 생각나는 여러가지 방법을 시도해 봤지만 해결되지 않았다.

아래와 같은 방식으로 어떻게든 해결은 했지만 완벽하게 이해하지는 못 해서 내용을 정리해보는 시간을 가져보려고 한다.

문제 1. git pull --rebase
처음 문제 상황은 git pull origin main 명령어가 정상적으로 실행되지 않았다는 것이였다.
동료분들이 작업하신 코드를 합치기 위해 종종  git pull origin main을 하곤 했는데 이때 문제가 생긴건지 해당 명령어에서 오류가 발생했다.

이 때 git pull --rebase를 진행했고 pull이 잘 된 것을 확인할 수 있었다.

먼저 git pull 의 경우는 협업을 할 때 로컬 브랜치와 원격 저장소에 있는 브랜치 간의 변경사항을 합치는 역할을 한다.

git pull 명령어를 입력했을 때 가지고 온 변경사항은 로컬 브랜치의 끝에 merge되고 원격 저장소와 로컬 브랜치 간에 별도 병합 커밋이 생성된다.

하지만 git pull --rebase명령은 로컬 브랜치의 변경사항을 임시저장한 뒤 원격 저장소에서 변경사항을 가지고 온 다음 로컬 브랜치의 임시 저장한 변경 사항을 다시 적용한다.

그렇기 때문에 로컬 브랜치가 원격 저장소의 최신 상태로 갱신되면서 git 히스토리가 더 깔끔해지는 것이다.

위 문제의 경우 정확히 어디서 충돌이 발생했는지는 모르겠지만 , 충돌로 인해 pull 명령어에서 오류가 발생했고 rebase를 하니 해결이 되는 듯 보였다.

문제 2. 

 pull 해온 원격 저장소의 변경 사항과 함께 또 변경한 코드를 push하려고 하자 오류가 발생했다.

힌트에서는 pull을 해보라고 했지만 그래도 해결이 안되는 상태,,


해결방안 

git switch -c "new branch"

임시로 새로운 브랜치를 만든 뒤 그곳에 변경사항을 저장한 뒤 pull 을 진행하니 새로운 브랜치에서는 오류없이 잘 작동되는 것을 확인할 수 있었다.

강제로 push하는 git push origin +branch 방법도 있지만 git에서 오류를 내는 것은 괜히 내는 것이 아니기 때문에..
왠만하면.. 안하는 것이 좋다.

그 이유로는 pull --rebase를 사용하면 로컬 브랜치의 이력을 수정하게 되는데, 이 경우 로컬 브랜치의 이력과 원격 저장소의 이력이 다르게 될 수도 있다.
이 경우에 원격 저장소에 변경사항을 push하려고 하면 git에서 거부할 수가 있고
이 경우 강제 push나 새 브랜치를 만드는 방식으로 해결할 수 있다고 한다.

내가 경험했던 오류도 이 문제로 인한 오류였다.

하면 할 수록 어려운 git... 오늘도 하나 더 배워갑니당 ㅎㅎ

728x90
반응형