github에서 커밋 이력을 살펴보던 중,
이전 커밋 내역에 깃헙에 올리고 싶지 않은 정보가 올라가있는 것을 발견했습니다.
별 생각 없이 github의 commits페이지에서 그 파일 자체를 삭제했습니다.
로컬에서 작업을 더 해주고, 변경사항을 반영해서 아예 새로 올리자는 마음에서 였습니다.
이후, 해당 프로젝트 작업을 계속 해준 뒤 깃헙에 push하려던 순간,
아래와 같은 에러를 마주하였습니다.
에러 메세지를 살펴보니, push를 할 수 없는 상황인데,
remote(원격 저장소)가 local엔 없는 work(작업)을 포함하고 있기 때문이라고 합니다.
에러 메세지만 읽었을 땐, 무슨 말인지 잘 와닿지 않습니다.
차근 차근 생각해보겠습니다.
우선 이곳에서 말하는 remote는 원격 저장소로서 github를 의미하고,
local은 개발중인 환경이니 git을 의미하며,
work는 git에서 수행되는 commit, push, delete등의 모든 동작을 포괄한다는 것은 쉽게 이해할 수 있습니다.
그럼, github에서는 발생한 동작이 git에서는 발생하지 않아 push를 할 수 없다는 상황으로 에러 메세지를 해석할 수 있습니다.
잘 생각해보면, 제가 커밋된 파일을 삭제한 곳은 git terminal이 아닌,
github입니다.
즉, 원격 저장소에선 삭제를 해주었지만, 정작 로컬 git에서는 삭제가 반영되지 않아, 원격과 로컬 저장소에서의 이력에 충돌이 발생한 것입니다.
이를 해결해주기 위해,
아래의 명령어를 사용해줄 수 있습니다.
git pull origin main
위 코드는 원격과 로컬 환경의 작업 이력을 맞춰줍니다.
조금 더 자세히 정리하면, 원격 저장소의 최신 변경 사항을 그대로 가져와 로컬 저장소에 반영해줍니다.
그럼 자연스레 원격과 로컬의 변경사항 불일치 문제가 해결될 것입니다.
위의 코드를 수행해봤더니, 아래와 같은 메세지가 떴습니다.
현재의 브랜치가, remote 뒤에 있다고 합니다.
아직 push가 제대로 수행되지 못하고 있습니다.
아래의 코드를 통해 문제를 해결해줄 수 있습니다
git pull --no-rebase origin main
git pull은 기본적으로 merge 방식으로 변경사항을 관리합니다.
하지만, 아래와 같은 설정이 활성화 되어 있다면, 기본적으로 rebase방식을 사용합니다.
git config --global pull.rebase true
git pull origin main
작업중인 터미널에 아래와 같은 명령어를 입력해보겠습니다
git config --global pull.rebase
만일 true가 응답값으로 온다면, 현재 git이 pull동작을 수행할 때
기본적으로 merge가 아닌 rebase방식을 사용하도록 설정되어 있다는 의미입니다.
rebase방식을 사용하는 것과 사용하지 않는 것의 차이는
아래 사진과 같이 chat GPT가 깔끔하게 정리해주었습니다
핵심만 적어보면, rebase방식의 경우 로컬 브랜치의 변경사항을 원격 브랜치의 변경 사항 뒤에 이어붙입니다. 이 방식의 경우, 로컬과 원격에서 우연히 같은 파일의 같은 부분을 서로 다른 내용으로 변경한 경우, 충돌로 인해 rebase가 중단될 수 있습니다.
결론적으로, --no-rebase옵션을 주어 git pull을 수행해주면,
무조건적으로 로컬 및 원격 브랜치를 merge시켜주어 충돌 문제를 해결해줄 수 있습니다.
이후엔 git add, commit, push를 다시 수행해줍니다.
정상적으로 push가 완료된 것을 확인할 수 있습니다.