Git - 저장소에 이미 Commit/Push 된 이전 커밋 버전 삭제하기 (커밋 히스토리 제거하기)

개요

실수로 서버 정보가 담긴 설정 파일을 푸시해버렸다.

급히 설정 파일의 정보를 비우고 새롭게 푸시하였으나,

문제는 이전 커밋에는 이미 서버의 정보가 담겨있는 설정 파일이 존재한다는 것이다.

비공개 리파지토리면 상관이 없으나 이는 공개 리파지토리로 작업을 진행하기로 한 토이 프로젝트였다.

이렇게 잘못 푸시된 민감 정보가 담겨있는 이전 버전은 어떻게 없애야 할까?

 

커밋 이전 버전 확인하기

커밋 버전 확인은 크게 두 가지가 있는 것 같다.

첫 번째는 명령어를 통한 로그 확인과

두 번째는 깃허브 리자피토리에서 직접 커밋을 확인하는 방법이 있다.

 

명령어는 git log를 통해서 확인할 수 있다.

git log

 

리파지토리에서 확인하는 방법은

해당 리파지토리 페이지로 이동 후, 파일 목록 중 오른쪽 상단의 커밋 수를 누르면 된다.

커밋 이전 버전을 확인하기 위한 경로 표시 이미지
커밋 이전 버전을 확인하기 위한 경로 표시 이미지

 

그럼 다음 이미지와 같이 커밋한 이전 버전들의 목록이 뜬다.

깃허브에 이전 버전을 확인하는 목록 예시
깃허브에 이전 버전을 확인하는 목록 예시

 

특정 커밋 시점으로 되돌리기

특정 커밋 버전으로 되돌리려면 git reset이라는 명령어를 이용하면 된다.

# option #
# --soft
# --mixed
# --hard
git reset --soft #commit hash

 

명령어를 통해 특정 커밋 버전의 해시 코드를 입력하면,

입력한 커밋 버전으로 상태가 되돌아간다.

깃허브 사이트에서 버전을 확인하는 목록에서 우측을 보면 쉽게 확인 및 복사할 수 있다.

커밋 버전 복사 경로 예시 이미지
커밋 버전 복사 경로 예시 이미지

 

여기서 리셋 옵션에 따라 디렉토리의 파일이 변경될 수 있는데 주의하여야 한다.

나는 작업한 내용은 그대로 유지하고 커밋만 삭제할 예정이기 때문에 --soft 옵션을 사용하여 진행하겠다.

소프트 옵션은 파일까지 되돌아가는게 아니고 커밋 시점만 이전으로 돌아간다.

만약 특정 커밋 시점의 파일 상태까지 모두 되돌려야 한다면 --hard 옵션을 사용하자.

단, 현재 작업 중인 내용은 사라질 수 있다.

# 예시
git reset --soft e0d9adff8932b05bf864d~

 

예시 이미지에서 커밋 목록 중 'add index page'의 상태로 커밋을 되돌렸다.

 

이제 커밋 없이 강제로 푸시를 진행해준다.

git push -f

 

커밋 한 내용이 없기 때문에 커밋은 현재 작업 디렉토리의 파일이 반영되지 않고

당시 커밋을 했을 내용으로 되돌아가게 된다.

특정 커밋 상태로 되돌아 간 후, 이후의 커밋은 삭제된 예시 화면
특정 커밋 상태로 되돌아 간 후, 이후의 커밋은 삭제된 예시 화면

 

깃허브는 협업과 버전을 관리하기 위한 도구이기 때문에

커밋을 되돌릴 때는 협업하는 팀원과 충분한 대화를 한 후 진행하는 것이 바람직하다.

 

reset 옵션 설명

--soft

작업 디렉토리와 스테이징 영역이 유지된 채 커밋만 되돌아간다.

커밋을 잘못했지만, 변경된 파일들은 그대로 두고 싶을 때 사용한다.

 

예시)

  • A 커밋 -> B 커밋이 있는데, B 커밋을 취소하고 싶을 때 사용
  • B 커밋의 내용은 그대로 스테이징 영역에 남아 있어서 다시 커밋하거나 수정할 수 있다.

 

 

 

--mixed

작업 디렉토리는 유지된 채 스테이징 영역과 커밋이 되돌아간다.

커밋을 잘못했고, 다시 스테이징해서 커밋하고 싶을 때 사용한다.

 

예시)

  • A 커밋 -> B 커밋이 있는데, B 커밋을 취소하고 싶을 때 사용
  • B 커밋의 내용은 스테이징 영역에서 사라지고, 작업 디렉토리에 그대로 남아 있어서 다시 스테이징해서 커밋할 수 있다.

 

--hard

작업 디렉토리, 스테이징 영역, 커밋 모두 되돌아간다.

커밋을 잘못했고, 변경된 파일들도 모두 초기 상태로 되돌리고 싶을 때 사용한다.

해당 옵션은 되돌릴 수 없는 변경을 초래할 수 있으므로 신중하게 사용해야 한다.

 

예시)

  • A 커밋 -> B 커밋이 있는데, B 커밋을 취소하고 싶을 때 사용
  • B 커밋의 내용은 스테이징과 작업 디렉토리에서 모두 사라져서 다시 커밋할 수 없고, 변경 사항 모두 사라진다.