프로그래머스 풀이를 GitHub에 올리기 위해 VSCode로 README.md를 수정하고 터미널에서 push를 했더니 이런 에러가 떴다.
git push origin main
! [rejected] main -> main (fetch first)
error: failed to push some refs to 'https://github.com/masondev1024/codingchallenges.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally.
원인은 원격 저장소(GitHub)와 로컬 저장소의 커밋 히스토리가 달라졌기 때문이다.
[GitHub 원격] A → B → C (GitHub Actions가 README 자동 업데이트)
[로컬] A → B → D (내가 VSCode에서 README 수정)
나는 로컬에서 README를 수정하는 동안, GitHub Actions가 원격 저장소의 README를 자동으로 먼저 업데이트해버렸다.
그 결과 로컬과 원격의 히스토리가 달라져서 git이 "너 로컬에 없는 커밋이 원격에 있는데 그냥 덮어쓰면 안 됨!" 이라고 거부한 것이다.
git pull origin main --no-rebase
git push origin main
--no-rebase 옵션은 원격의 변경사항을 merge 방식으로 가져온다.
충돌 없이 합쳐지면 바로 push까지 완료된다.
git pull origin main --rebase
README.md와 submit.sh 두 파일에서 충돌이 나서 실패.
git push origin main --force
이번엔 토큰에 workflow 권한이 없다는 에러 발생.
.github/workflows/ 파일을 push하려면 GitHub Personal Access Token에 workflow 스코프가 필요하다.
git pull origin main --no-rebase
git push origin main
| 상황 | 해결법 |
|---|---|
| 원격에 내가 모르는 커밋이 생겼을 때 | git pull 먼저 하고 push |
| rebase 도중 충돌났을 때 | git rebase --abort 로 취소 |
| workflow 파일 push 안 될 때 | GitHub 토큰에 workflow 스코프 추가 |
💡 push 전에 항상 pull 먼저 하는 습관을 들이자.
특히 GitHub Actions처럼 자동으로 커밋을 만드는 워크플로우가 있다면 더욱!
단순히 README 하나 수정하려다가 git 에러 3방을 맞았지만, 덕분에 아래 개념들을 확실히 이해했다.
--rebase vs --no-rebase (merge) 의 차이앞으로는 git pull 먼저, git push 나중에 하는걸로 기억하자!