23년 7월 14일, 동아리 부회장님한테 카톡이 왔다. 학습용 깃허브 상태가 이상하다고 한다.
내 커밋(커밋 메시지 3492)이 모든 사람들에게 적용되어 있었다.
복구해 보자.
우선 제일 먼저 git pull [repos] [branch] 명령어로 최신화부터 해주자. 그리고 복구하는 동안 최신화가 더 이상 되지 않도록 기도해야 한다.
git log 명령어를 입력하여 커밋 로그를 확인한다. 그동안의 기록들을 볼 수 있다.
아무 키나 입력하면 이전 기록들을 더 볼 수 있고 스페이스바를 입력하면 한 번에 많이 넘길 수 있다. 나가고 싶으면 q를 누르면 된다.
문제의 커밋. 5월 28일. 무려 2달 전 기록이다.
왜 그런지는 모르겠지만 내가 한 커밋이 두 개나 들어있었다. 문득 생각해 보니 저 날 푸시가 안 돼서 무지성 반복했던 거 같은데 뭔가 잘못 건드렸나 보다.
문제가 생긴 커밋의 이전 커밋 id를 복사해야 한다. 저 아래 빨간 네모 표시 해놓은 커밋 id를 복사해 놓자. 저 id를 기준으로 rebase를 진행할 것이다. git rebase -i [커밋 id] 명령어를 입력하면 rebase 시작이다.
hint: Waiting for your editor to close the file...
error: There was a problem with the editor '(뭐시기뭐시기)'
이런 문구가 뜬다면 git config --global core.editor 'vim' 명령어를 쳐주자. git에 vim 에디터가 등록이 안 돼 있어서 생긴 오류라고 한다.
특정 커밋 id로 rebase 했을 때 다음과 같이 vim 에디터로 요런 화면이 뜰 것이다. 해당 커밋 id 다음부터의 기록이다. 아래로 갈수록 최신 커밋이다.
지우고 싶은 커밋의 pick을 drop으로 바꿔주자.
vim 에디터로 파일을 변경하고 싶다면 i를 눌러서 입력 가능한 상태로 변경하고 원하는 부분을 변경한 뒤에 esc를 눌러서 입력 가능한 상태를 해제하고 :wq를 입력해서 저장하고 나가면 된다.
얼씨구
한 번에 되길 기대한 나의 잘못이다. 검색해 보니 아직 rebase가 끝나지 않았다고 한다. 내가 vim 에디터로 수정한 이후 부분부터 충돌이 나서 아직 rebase 작업이 끝나지 않은 것이었다.
충돌(Conflict)이 났으면 git rebase --continue를 하라고 한다. git rebase --skip을 통해서도 진행할 수 있는데 잘 쓰지 않는다고 한다. 이후 몇 십 개의 커밋들을 git rebase --continue로 넘겨줬다. "왜 continue 해줬는데 계속 같은 오류가 나지?"라고 생각할 수 있지만 자세히 보면 모두 다른 커밋들에 대해 난 충돌이니까 계속 반복해줘야 한다.
rebase 과정을 마치고 나면 git push [repos] [branch] 명령어로 변경 사항을 푸시해주면 된다. 다만 그렇게 하려고 하면 당연히 위 사진처럼 error가 날 것이다. 왜냐하면 로컬 저장소는 특정 커밋을 삭제한 상태이고, 원격 저장소는 삭제하기 이전의 상태이므로 git 입장에서는 pull부터 하라고 할 수밖에 없다. 다만 우리는 pull을 하면 원래 상태로 돌아간다는 것을 알고 있으므로 하면 안 된다.
그러므로 git push [repos] [branch] --force 명령어를 사용하여 강제로 푸시해주는 방법밖에는 없다. 처음에 최신화가 되지 않도록 기도하라는 것도 이 때문이다. 내가 복구하는 사이에 다른 사람이 커밋한 내용은 사라지게 된다.
나는 다행히 그 사이에 업데이트가 없어서 무사히 고칠 수 있었다. 휴 다행
Reference
vim 에디터 오류: https://seulcode.tistory.com/142
force push: https://velog.io/@hwang-eunji/%EA%B9%83-%EB%A6%AC%EB%B2%A0%EC%9D%B4%EC%8A%A4
'Git' 카테고리의 다른 글
[Git] Github flow 실습: Member편 (0) | 2024.06.24 |
---|---|
[Git] Github flow 실습: Owner편 (0) | 2024.06.24 |
[Git] Github flow (0) | 2024.06.24 |
[git] error: src refspec main does not match anyerror: failed to push some refs to (1) | 2023.03.27 |