[GitHub] 원격 저장소에 올라간 커밋 강제로 삭제하기

2020. 2. 6. 19:18프로그래밍/깃 Git

Problem

깃헙 원격 저장소에 커밋을 push했는데, 이후에 해당 커밋을 잘못 올린걸 알게 되어서 원격 저장소에서 삭제하고 싶다.
Github에 커밋을 올리기 전과 완전히 동일한 상태로 되돌려 놓으려면 어떻게 해야할까?

Solution: 로컬에서 커밋을 되돌린 후 Github에 강제로 푸시

원격 저장소에서 삭제하고 싶은 커밋을 로컬 저장소에서도 삭제해서 이전 커밋히스토리로 되돌리고, 이 커밋 히스토리를 원격 저장소에 강제로 push하면 된다.

  1. 로컬에서 내가 되돌리고 싶은 커밋으로 되돌린다. HEAD1는 최신 커밋 1개, HEAD2는 최신 커밋 2개이다.

    git reset --hard HEAD~1
  2. force push로 깃헙에 강제로 push한다.

    git push -f origin master

원격 저장소의 커밋보다 뒤쳐져있는 과거의 로컬 저장소의 커밋 히스토리를 푸쉬하게 되므로 만약 그냥 git push origin master을 하면 에러가 발생한다. 하지만 우리는 이 뒤쳐져 있는 로컬 저장소의 커밋 히스토리를 원격 저장소의 커밋 히스토리로 강제로 덮어씌워야 하므로 강제를 의미하는 -f 또는 --force를 명령어에 추가해야 한다.

하지만 이 방법은 원격 저장소에 내가 만들었던 커밋을 깔끔하게 삭제할 수는 있지만, 원격 저장소에서 삭제되기 전에 다른 사람이 해당 브랜치의 커밋을 pull로 땡겨갔다면 그 사람의 로컬 저장소에는 내가 삭제한 커밋이 남아있다게 된다는 문제가 있다. 그 커밋들이 원격 저장소에서 삭제된걸 모르는 상태에서 내가 삭제한 커밋에 그 사람이 새로 작업한 커밋들을 추가해서 함께 push를 하면 내가 삭제했던 커밋까지 다시 원격 저장소에 올라오게 된다.

그러므로 이 방법은 해당 브랜치를 나 혼자 작업할 때만 사용하는 것이 좋을 것이다.