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된 상태로 파일이 업로드된 것을 확인하실 수 있습니다.
와… 무섭네요 감사합니다. 꼭 써야할때만 써야되겠네요 원격 저장소 커밋이 다 날아가는군요 ㄷㄷ
왈왈!!!으르릉 컹컹 !!
감사합니다!