반응형

코인거래소의 API를 연동할 일이 생겨서, 작업을 해서 최종적으로 github에 올리게 되었는데, 이전 직장에서 사용하던 git 사용 습관상 master branch는 건드리지 않고, master branch를 새롭게 clone떠서 다른 branch로 만든 후 push, 그 후 master branch의 내용을 다른 branch와 rebase 하는 작업을 하다보니..


rebase 특성 상, commit 을 일렬로 쭉 나열하기 때문에, 테스트간 API Key를 넣어서 로컬에서 commit했던 이력도 전부 다 github에 올라가게 되버리는 참사가 일어나게 되었다. 


이게 SVN만 사용하다보니, 로컬 commit이 같이 push가 될거라고는 생각을 못했는데, 치명적인 실수였던 것 같다.


당장 Key가 노출되었기 때문에, 거래소 API Key는 바로 삭제처리하고, 조금 더 완벽하게 하기 위해 github에 이미 올라간 API Key가 노출된 commit(HEAD 기준 바로 전 커밋)도 같이 없애 보기로 하였다.


아래와 같이 작업을 계획했고, 그 결과 자연스럽게 내가 노출한 Commit을 Commit을 안한거처럼 보이게 할 수 있었다.


1. remote repo 현재 버전을 로컬에 clone

$ git clone <Remote REPO URL>

2. 로컬에서 git rebase 명령어를 통해 HEAD와 바로 전 Commit을 합침

$ git rebase -i HEAD~2   # HEAD 포함 2개까지의 Commit을 하나의 Commit으로 만들겠다.
# 위 명령어를 치면 editor가 열리며 아래와 같이 해당되는 Commit들이 목록에 보여짐
# 아래부터는 전부 Editor 메시지
pick 111111 HEAD 바로 이전 Commit
pick 222222 HEAD Commit

# HEAD 바로 이전 Commit과 HEAD를 합치기로 했으므로, HEAD 부분의 커밋에 해당하는 라인의 가장 앞에 있는 pick을 squash로 바꿔주고, 저장 후 빠져나온다.
pick 111111 HEAD 바로 이전 Commit
squash 222222 HEAD Commit

# 이제 다시 editor가 뜨며, 새로운 commit 메시지를 입력하라고 나온다. 2개의 Commit을 자연스럽게 합치고, 메시지를 뭘로 할지 결정해서 입력해주고, 저장 후 빠져나온다.
# 주의사항이 있다면, 주석을 제외한 모든 텍스트가 Commit 메시지가 된다.
# This is the 1st commit message:
HEAD 바로 이전 Commit

# This is the commit message #2:
HEAD Commit

3. remote repo에 push (github 정책 상 커밋 이력을 수정하게 되면 다른 사용자가 pull을 받은 경우 conflict이 날 수 있기 때문에, 기본적으로 허용을 안한다고함.. 이런 경우 --force 옵션을 사용하여 강제로 덮어버릴 수 있다.)

$ git push origin master --force



반응형
,