[Git] git push 에러 발생 / 해결 (git init)
🚨ERROR / 문제 상황
각 조별로 미니 프로젝트를 진행함에 있어 다른 사람이 작업했던 것을 다운받아서 작업해야 하는 상황,
해당 작업 내용을 clone 하여 다운받아 작업을 진행하였고, git add, commit, push를 진행 시 문제가 발생하였다.
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'https://github.com/...'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
에러 힌트에 push 전에 git pull을 다시 하라는 내용이 있어서 git pull을 진행하였다.
git pull을 해보았지만 여전히 동일한 에러가 발생, git pull과 push를 반봅하다보니 git pull이 작동하는 경우가 있었다.
그러나 에러 메시지가 달라졌을 뿐, 문제 해결은 되지 않았다.
From https://github.com/...
* branch main -> FETCH_HEAD
fatal: refusing to merge unrelated histories
🛠️ 문제 해결 시도
1. 로컬 저장소(내 PC)와 원격 저장소(Github)의 프로젝트 히스토리 병합 후 재시도
"fatal: refusing to merge unrelated histories" 의 에러는 로컬 저장소의 히스토리와 머지하려는 원격 저장소의 히스토리가 일치하지 않는다. (혼란이 있다.) 라는 에러라고 한다.
이를 위해서는 두 저장소의 프로젝트 히스토리를 병합하는 방법을 사용해보았다.
git pull origin 브런치 --allow-unrelated-histories
그러나 에러는 해결되지 않았다. > 실패
2. 일치하지 않는 히스토리 내용을 삭제 후 재시도
히스토리 내역에서 확인된 불일치 폴더, 파일을 삭제한 후 다시 git add 부터 commit, push를 진행해보았다.
하지만 여전히 에러는 해결되지 않았다. > 실패
💡 문제 해결
로컬 저장소의 프로젝트 폴더, 파일을 모두 삭제하고 다시 git clone 후 push를 진행
문제가 발생하면 프로그램 삭제 후 재설치가 가장 확실한 방법이듯, 이것 역시 동일한 방법으로 해결을 시도해봤다.
내 PC의 프로젝트 폴더, 파일을 완전히 삭제,
이후 작업 폴더를 생성, git clone > git pull > git add > git commit > git push 를 진행
결과는 문제가 해결되었고, git push가 정상 작동 되었다.
❓무엇이 문제였을까? 문제 원인
결론 먼저 얘기하자면 git init의 잘못된 사용 때문이다.
git clone을 통해 원격 저장소의 프로젝트를 복제를 하게 되는데, 이미 해당 프로젝트에는 git init 선언이 된 상태였다.
다만, 나는 이제 git을 배운지 하루밖에 안된 상황,
강의에서 배웠던 아래의 내용을 철저히 지키고자 하였고, 이게 문제의 원인이 된 것으로 파악된다.
git init
- 코드 관리를 시작하는 명령어 (initialize / 초기화하다, 초기 세팅하다)
- 프로젝트 시작 전 딱 한 번만 입력 (여러 번 입력해도 문제되진 않지만 한 번만 하자)
즉, git clone을 하기 전에 생성해둔 로컬 저장소의 작업 폴더에서 git init을 먼저 선언 후 이후 git clone을 하여 복제한 상황
이로 인해 로컬 저장소의 git 프로젝트와 원격 저장소(Github)의 git 프로젝트가 서로 다른 프로젝트로 인식한 것이다.
※ 추가 문제 사항
git init을 선언 시, 해당 폴더에 숨긴 폴더로 .git이 생성된다고 한다.
그러나 나는 상위 폴더에 .git이 있으면 하위 폴더도 추적한다는 사실을 몰랐고, 하위 폴더에도 git init을 선언하였다.
다만, 상위 폴더에도 .git 폴더가 있고 하위 폴더에도 .git이 있는게 뭔가 이상함을 감지하였고,
선언했던 git init을 초기화를 하고 다시 상위 폴더인 최초 작업 폴더에 git init을 재선언하였다.
#로컬 저장소의 .git 디렉토리 삭제 / git init 초기화
rm -rf ./.git
이처럼 잘못된 git init 명령어 사용으로 인해 에러가 발생하였고,
해당 작업 폴더를 모두 삭제 후 git clone 이후 git init을 선언하지 않고 git add,commit,pull,push를 진행하니 정상 작동 됨을 확인할 수 있었다.
🔑 결론
git clone을 할 때는 별도의 git init을 선언하지 않고 바로 push를 진행할 수 있음을 알 수 있었다.
- 이미 해당 프로젝트에 git init이 선언된 상황
- 물론 .git 폴더가 있는지는 항상 확인해볼 것