깃허브(GitHub) 오류, 경고 해결하기
- error : failed to push some refs to ~ / push rejected
- warning: LF will be replaced by CRLF in ~
앞으로 마주하는 오류들을 해결할 때 마다 글을 써두는 것이 후에 같은 오류가 났을 때 나한테도 좋을 것 같아서 새로운 카테고리를 만들었다.
리눅스에서 사용하던 파일을 로컬로 옮기고 깃허브에 커밋을 하다가 push가 안돼서 꽤 애를 먹었다..
에러와 경고 둘 다 떴는데 에러를 해결하지 못하고 사고를 쳐 버렸다.
아래 해결법 작성하면서 한번 더 언급하겠지만 "강제 push"는 결코 좋은 해결책이 아니다.
나는 여러 시도를 해도 안될 때 강제 push를 하면 된다고 생각했는데, 아니었다..
push 에러가 생긴 개요(?는 이렇다.
1. 아이펠에서 제공 해 주는 클라우드 주피터 노트북에서 작성한 파일을 리눅스 환경에서 깃허브 레파지토리에 연결한 후 파일을 커밋을 함.
2. 로컬에서 파일을 관리하고 싶어서 리눅스 환경에서 깃허브에 커밋했던 주피터 노트북 파일을 로컬로 다운 받음.
3. 로컬에서 리눅스에서 연결했던 깃 레파지토리와 연결함.
4. 다운받은 파일 git add, git commit 함
4-1. add 할 때 warning: LF will be replaced by CRLF in ~ 경고가 뜸.
4-2. 오류 해결
5. git push 할 때 오류 가 뜸 : < [rejected] error : failed to push some refs to ~ >
6. 나 : ???
먼저 4-1에서 생긴 오류를 해결했던 방법이다.
< warning: LF will be replaced by CRLF in ~ >
: 해당 경고는 OS마다 줄바꿈을 바라보는 문자열이 다 다르기 때문에 Git이 볼 때 LF를 선택할 것인지 CRLF를 선택할 것인지 선택을 하지 못하기 때문에 경고를 띄우는 것이다.
여기서 CRLF는 Carriage-Return+Line-Feed로 윈도우의 줄바꿈 문자열인 \r\n을 사용하고, 커서를 다음라인 맨 앞으로 이동시킨다.
LF는 Mac, Linux의 줄바꿈 문자열인 \n을 사용한다.
하지만 나는 리눅스 환경에서 파일을 로컬로 가지고 온 것이기 때문에 내가 push 하려는 파일은 LF(Line-Feed)이기 때문에 Git이 경고를 한 것이다.
이때 명령어 한 줄만 적어주면 오류없이 add, commit, push가 가능하다.
$ git config --global core.autocrlf true
이 때 해당 프로젝트에만 적용을 시키려면 global을 빼주면 된다.
4-1 에러를 해결했으니 5번의 push rejected를 해결해야 한다.
에러문구와 함께 나타난 힌트 문구들은 아래와 같다.
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.
한번도 push에서 에러가 난 적이 없었기에 재빨리 구글링을 했고 해결책은 간단했다.
github 원격 저장소에 저장되어 있는 코드에 변경사항이 있으면 현재 업로드 하려던 코드랑 같지 않기 때문에 push rejected가 된다.
이럴땐 git pull을 해주면 된다.
$ git pull 브랜치명
현재 브런치 명을 입력하여 pull 한 후 다시 push를 하면 원격 저장소의 코드가 로컬에 반영되어 push가 된다고 한다.
여기까지가 일반적인 push 오류 해결 방법이다.
-
하지만..
나는 pull 조차 먹히지 않았다.
이유를 아직도 모르겠는데..
>글 가장 아래에 원인으로 생각되는 것과 해결방법까지 추가했다.<
그래서 강제 push 명령어를 알고 있던 나는 최후의 방법이라 생각하고 강제 push를 했다. ...
$ git push -u origin +master
위의 코드가 강제 push 명령어이다.
이 명령어를 입력한 순간 해당 깃허브의 원격 저장소가 싸그리 날아갔다....ㅋㅋㅋㅋ....
너무 당황해서 찾아보니
강제 push는 데이터 유실 문제가 있을 수 있다고 한다.
레파지토리 내의 파일만 날아간 사람도 있는데.. 나는 레파지토리가 그냥 통째로 날아가버렸다.
심지어 레파지토리가 날아갔으니 그 레파지토리를 만들고 커밋했던 모든 기록도 사라지면서 잔디도 구멍이 났다...
매일 잊지 않고 잔디를 열심히 심는 중이었는데 너무 허탈했고, 해당 레파지토리의 링크를 과제로 제출했던 상황이었기에 더이상 그 링크가 유효하지 않아졌다는 문제도 생겼다.
결국 해결을 하지 못하고.. 나는 새로운 레파지토리를 만들었다 ㅎㅎ...
+) 추가 해결법
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to http~
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
그렇다.. 이전과는 다른 hint를 동반한 push 에러가 또 났다.
또 다시 레포를 통째로 날려먹는 건 아닌지 식은땀이 줄줄 났다....
이번엔 힌트를 중심으로 에러 해결법을 찾아보았다.
먼저 push가 rejected된 원인인 master -> master (non-fast-forward) 를 알아보았다.
기존 원격 저장소(레파지토리, 레포)는 리눅스 환경에서의 로컬 저장소와 연동되어 있었지만 새로 만든 윈도우에서의 로컬 저장소와는 연동이 되어 있지 않았다.
이후 윈도의 로컬에서 원격 저장소와 연동하여 push를 하려고 하니 에러가 뜨게 된 것이다.
이러한 상황에서 로컬 저장소를 처음 생성할 때 명령어 하나를 빠트렸기 때문이라는 것을 검색하면서 알게 되었다.
$ git pull origin master
그 명령어 하나가 git pull이었다.
여기까진 위의 과정과 같다. pull을 했지만 위와 마찬가지로 당연히 해결이 되지 않았다.
이때 옵션을 추가해서 명령을 하면 해결이 된다는 글을 보았다.
$ git pull origin master --allow-unrelated-histories
이렇게 옵션을 추가하여 명령을 하면 정상적으로 pull이 동작한다.
(해당 옵션은 원격 저장소와 로컬 저장소의 병합을 허용한다는 의미이다.)
이후 다시 push를 해주면 된다.
위와는 다른 힌트를 가진 같은 에러지만 그래도 강제 push를 하지 않고 해결해서 다행이다..
아마도 위의 과정에서도 pull을 해주지 않고 뒤 늦게 pull을 하려고 하니 pull 명령어도 먹히지 않았던 것 같다.
보통은 원격저장소의 readme.md 파일이 있거나 .gitignore 파일이 있어서 에러가 난다고 한다.
하지만 나는 둘 다 원격 저장소에 없었기 때문에 생각 해 볼 수 있는 원인은
로컬과 원격을 연결하는 과정에서 pull을 해주지 않았다는 것이었다.
이미 생성된 원격 저장소(나같은 경우에는 리눅스 환경의 폴더와 원격 연결해두었던 원격 저장소)를 윈도우에서 로컬 저장소를 새로 만들어서 생성되어 있던 원격 저장소와 연결을 하려고 했기 때문에,
기존 원격 저장소와 새 로컬 저장소의 업데이트 상태가 같지 않았던 것 이다.
때문에 pull을 꼭 해주어야 하는 것 같다.
에러가 나지 않기 위한 제대로 된 새 로컬 - 기존 원격 연결 방법은
1. git init
2. git remote add origin master http~
3. git pull
인 것 같다.
나는 3번을 거치지 않고 바로 git add, git commit, git push까지 했기 때문에 에러가 났던 것 같다.. (아마도...
또 다른 에러가 생기거나 다른 해결 방법을 알아낸다면 추가 수정하겠다!