개발팁 & 유틸

[Git] 커밋 히스토리 삭제(초기화)하여 다시 푸시하기

Git 잘못 업로드 된 commit 히스토리 관리하기

Git을 사용하여 소스코드 관리를 하는 개발자는 자신의 리포지토리(Repository)공개(Public) 상태일 때 간혹 민감한 정보가 포함된 코드가 커밋(commit)되는 경우가 있을 것입니다. 여기서 민감한 정보란 공개되어서는 안되는 암호나 특정 계정명, API 액세스 키 등이 해당될 것입니다.

아무리 공개 소스코드라고 해도 민감한 정보가 누군가에게 노출될 경우, 서버 또는 프로그램이 악의적인 공격을 받을 수 있습니다. 실제로 그런 사례가 종종 있었기 때문에 코드를 올리기 전 민감한 정보가 포함되어 있는지 점검해 볼 필요가 있습니다.

하지만 이미 민감한 정보가 푸시(push)되어 GitHub 또는 다른 SVN 서버에 업로드되어버리면 해당 부분만을 삭제하거나 수정하기 어려워 난감한 경우가 생깁니다. 이럴 때 현재 commit을 취소하고 취소한 히스토리까지를 서버에 강제 push하는 방법이 있습니다.

(아래 내용은 git 명령어가 입력 가능한 bash 프롬프트 환경을 기준으로 설명하고 있습니다.)

최근 commit을 취소하고 강제 push 하기

현재 올라간 commit 내용을 로컬 작업 패널에서 되돌리고, 다시 서버로 commit할 수 있습니다. 이 방법을 시행하기위해 개발자의 작업 내용을 서버상에 강제로 덮어쓰게 되므로 이후 작업했거나 다른 사람의 commit 내용이 지워질 수 있으므로 신중하게 진행해야 합니다.

먼저 작업 디렉토리로 이동하여 다음 명령어를 입력합니다. 이 명령어는 마지막에 실행한 커밋 내용을 되돌립니다.

$ git reset HEAD^

이후 다음 명령어로 다시 commit을 진행합니다.

$ git commit -m "커밋 메시지"

마지막으로 다음 명령어를 사용하여 push를 진행합니다. (remote 또는 branch 이름이 개발자 설정 마다 다를 수 있으니 유의) -f 옵션 대신에 branch 이름 앞에 + 기호를 붙여도 됩니다.

$ git push origin master -f

commit history를 모두 삭제하고 초기 상태로 되돌리기

민감한 정보가 포함된 코드가 이전 커밋 히스토리에 여러번 노출되었거나, 히스토리에 크게 신경쓰지 않고 히스토리를 깨끗하게 지우고 싶은 경우, 아래 방법으로 commit & push 히스토리를 모두 지울 수도 있습니다.

  • 경고: 이 방법을 사용하면 리포지토리에 있는 모든 파일과 커밋 히스토리가 삭제됩니다! 현재 작업 디렉토리에서 initial commit 상태로 업로드하게 됩니다!

먼저 현재 작업 디렉토리(.git이 존재하는 위치)에서 다음 명령어를 입력하여 commit 히스토리를 삭제합니다. 이 작업으로 작업 내용은 삭제되지 않습니다.

$ rm -rf .git

이후 git init 명령어로 초기화한 후 git add . 또는 git add -A모든 파일을 추가(Staging)합니다.

$ git init
$ git add . (또는 git add -A)

이제 현재까지의 내용을 다시 커밋합니다.

$ git commit -m "initial commit"

다음으로 리모트 서버 경로추가해주어야 합니다. 기존의 URL을 참고하여 리포지토리의 URL을 입력해주시면 되겠습니다. (rm -rf .git으로 기존 정보가 삭제되었기 때문에 git remote remove 명령어는 사용하실 필요가 없습니다.)

$ git remote add origin [저장소 URL]

마지막으로 지금까지의 작업 내용을 push해야 합니다. 여기서 기존 push할 때와는 다르게 --force 명령어를 덧붙여줍니다. 이미 서버에 존재하는 파일로 인해 발생하는 에러 메시지를 무시하고 강제로 push하겠다는 의미입니다.

$ git push -u --force origin master

작업이 완료되면 해당 리포지토리에 처음 commit된 상태로 파일이 업로드된 것을 확인하실 수 있습니다.

JooTC

안녕하세요. 테크놀로지에 관심이 많은 블로거입니다.

View Comments

Recent Posts

Zalgo 텍스트와 이를 방지하는 방법

인터넷 커뮤니티 사이트에서 게시글이나 댓글에 간혹 장난을 목적으로 작성된 특이한 글자를 볼 수 있습니다. 위…

3주 ago

리눅스 kill, killall 명령어 – 특정 프로세스 종료하기

리눅스 명령어 - kill, killall 리눅스 kill 명령어는 특정 프로세스를 종료해주는 명령어입니다. 백그라운드에서 실행되고 있는…

3주 ago

JavaScript typeof null이 ‘object’인 이유

JavaScript는 역사가 긴 스크립트 프로그래밍 언어입니다. 세월이 흐르면서 많은 자바스크립트 표준이 만들어졌고, 현재는 많은 문법적…

3주 ago

Mocha Error: Resolution method is overspecified. 해결 방법

NodeJS 테스트 프레임워크인 Mocha는 비동기 테스트를 지원합니다. 간혹 특정 테스트 스크립트를 작성하고 실행하면 아래와 같이…

4주 ago

윈도우 11 설치 시 Microsoft 계정 로그인 없이 로컬 계정 만들기

언제부턴가 윈도우 11을 처음 설치할 때 마이크로소프트(Microsoft) 계정 로그인을 강제로 요구하게 되었습니다. 물론 마이크로소프트 계정이…

6개월 ago

에어팟 프로 2 케이스 스피커 소리를 완전히 끄는 방법

애플 에어팟 프로 2 (AirPods Pro 2) 케이스에는 스피커가 내장되어 있습니다. 그런데 간혹 아무 것도…

9개월 ago