본문 바로가기

GIT

git push origin master 에러 발생하는 이유

평소처럼 github에 새로운 repository를 생성하고 푸시할 파일들이 있는 디렉토리에 가서 

1) git init

2) git add .

3) git commit -m "커밋 메세지"

 

순서대로 진행해주었다.

여기까지만 해도 별 문제 없이 진행되는 듯 싶었다.

 

! [rejected] master -> master (fetch first) error: failed to push some refs to 'https://github.com/ ' hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (e.g., 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.

 

github에 커밋을 푸시하기 위해 레포지토리 주소를 기존 워킹 디렉토리에 추가하고, git push origin master를 해주는데 갑자기 위와 같은 에러가 발생했다...

 

에러 내용을 읽어보니, 원격저장소에 로컬에서 커밋되지 않은 뭔가가 있어서 update를 거부당했다고 한다. 그리고 주로 같은 referecne를 다른 repository에 푸시할 때 발생한다고 하니 여기서 멘붕이 왔다... 방금 새로 만든 레포지토리고, 첫 커밋인데 도대체 뭐가 문제야ㅠㅠ 이럴 땐 바로 구글에 도움을 요청해보는 게 현명하다.

 

에러 복붙을 해보니 첫 페이지부터 바로 해결법을 찾을 수 있었다. 구글이 짱이다.

https://wikim.tistory.com/201

 

ㅎ......까먹고 있었다.

평소랑 다르게 이번 레포지토리는 설명을 좀 하고 싶은 게 있어서 README.md 를 추가해줬는데 그게 문제였다.

README.md 파일도 하나의 커밋으로 보기 때문에 로컬 저장소는 이 사실을 몰라 에러가 발생한 것이였다.

 

여기서 해결 방법!

 

git push -f origin master 

 

강제로 푸시해주면 된다.

 

그치만 잘 아는 것도 없으면서 호기심만 왕성한 나는 문득 궁금해졌다.

pull 해서 원격 저장소 내용을 당겨오면 로컬 저장소도 이를 인식할 테고, 그럼 강제푸시 안 해도 해결되는 거 아닌가?!(밑에서 이 고민은 해결된다.)

 

 

내 마지막 고민은 이것이였다.

github에서 레포지토리를 생성할 때 README.md 를 유저들이 추가할 수 있도록 해주면서, 로컬 저장소에서는 강제로 푸시하는 리스크를 감수해야만 하도록 만들었다고? 당연히 아니겠지 싶어 다시 구글 검색을 해보았다.

 

https://stackoverflow.com/questions/23304688/issue-pushing-to-a-github-repository-created-with-initialize-repo-with-a-readme

 

역시 사람 생각하는 거 다 똑같다. 이 사람은 심지어 위에서 내가 말한 pull도 시도해보고 다른 에러까지 얻어 고민이 2개가 됐다. 총 4개의 질문을 내가 궁금했던 점을 아주 잘 찝어서 물어봐줬다.

 

 

1. 왜 GitHub에서 README 파일을 추가한 상태로 원격 저장소를 생성하면, 로컬 저장소에 이 레포지토리를 연결하려 할 때 에러가 발생하나?

GitHub에서 README.md 를 추가하고 커밋하면, 이게 첫 커밋이 되는 거야. 만약 이미 로컬 저장소가 있다면 로컬에서의 첫 번째로 하려는 커밋이랑 다르니까.. 서로 일치하지 않는 거임.

 

2. 왜 pull 하면 에러 해결이 안되나?

아마도 위에서 얘기한 거 때문이거나, 원격 리퍼런스가 정확히 추가되지 않아서 그럴듯, 너가 어떻게 add 했는지에 달림.

 

이 부분은 밑에 답변도 읽어 봤는데, 글쓴이가 branch 를 제대로 지정해주지 않아 에러가 발생한 거라고 한다.

git pull origin master 로 원격 저장소에서 README.md 불러와서 다시 로컬에서 GitHub로 push하는 방법도 가능한 듯 하다. 근데 --set-upstream 을 계속 써서 push 해야 된다는 얘기도 있고 내가 직접 이 방법을 통해 문제를 해결한 게 아니라 좀 더 찾아봐야겠다.

 

3. 왜 직접 GitHub에서 README 파일 다운 받아서 내 로컬 저장소에 add 했음에도, 여전히 push도 안되고 원격 저장소 연결도 안되나?

Git은 그런 식으로 작동하는 거 아님; Git은 하나의 체인에서 연속되는 큰 리스트 형태의 커밋이야. 각 커밋은 한 개 혹은 두 개의 부모 커밋이 존재하고, 커밋 ID들은 각각 연속되지는 않음.

 

글쓴이는 직접 GitHub에서 README.md 를 다운 받아서 로컬 저장소에 저장했는데, 우리가 보기에는 같은 내용의 파일이라도 원격 저장소의 README.md 와 다운 받아서 로컬에 저장한 README.md 는 같지 않다는 소리를 하고 있다.

 

4. 이러한 에러들이 발생하지 않고 README 파일을 추가한 GitHub 레포지토리와 로컬 저장소를 연결하는 방법은 뭐냐?

 

만약 이미 로컬 저장소가 존재한다면, README 를 추가한 상태로 시작하는 원격 레포지토리는 안 돼. 만약 README가 있는 레포지토리면, 원격 저장소 복제(git clone) 한 다음에 너 수정사항들 폴더에 추가하고, 커밋하고, 그 다음에 push 해야 돼. README 파일이 들어있는 레포지토리로 시작하는 건, 새 프로젝트를 원격 저장소에서 먼저 시작하고 나중에 복제해서 로컬 저장소에서 실행할 때만 하는 거임. 이미 로컬 저장소 만든 거면 그 옵션 사용하지 마.

 

 

-------------------------------------------------------------------

결론

1. README.md 추가한 원격 레포지토리를 만들었으면, 로컬 저장소를 따로 만들지 말고(git init) 원격 저장소를 복제해 사용하자. (git clone <url>)

 

2. 만약 이미 로컬 저장소를 만들었는데 README.md 가 들어있는 레포지토리에 연동하고 싶다면 두 가지 방법이 있다.

   

1) git push -f origin master (강제 푸시) 

 

2) git pull origin master

   git push --set-upstream origin master

   (로컬 저장소로 pull한 뒤 원격 저장소로 다시 push) 

 

 

 

 

 

 

 

 

 

 

 

'GIT' 카테고리의 다른 글

remote: Invalid username or password.  (0) 2023.01.08