Project/토이 프로젝트

[Git] Git 특정 커밋 삭제 (git rebase -i)

Lea Hwang 2023. 1. 30. 13:36

토이프로젝트를 하면서 OAuth2.0으로 구글 소셜 로그인 기능 구현 후 github에 코드를 올렸습니다.(A)

분명 .gitignore에 해당 설정 파일을 추가했는데 git캐시 문제로 Credential 한 정보들이 노출되었습니다. 

 

 

 

그 후로 캐시 내용을 전부 삭제 후 다시 커밋해서 내리긴 했지만(B)

 

Credential한 정보가 담겨있는 커밋 내용(A)을 누르면 나오더군요... 아찔 합니다. github 보안팀에서도 제 메일로 "너 개인정보 노출됨! 알고 있는 거 맞아?"라는 메일이 왔습니다. 

 

 

 

 

 

과거 git을 다뤘을 때 데이터를 날려먹거나 충돌난 적이 몇 번 있었어서 다시 만지기 두려웠지만, 해야죠 ㅎㅎ

이런 일은 끔찍하지만 계속 해보면서 점점 자신감이 붙길 바랍니다. 

 

 

 


 

 

커밋 히스토리를 수정해야하는 경우

  • 커밋 메세지에 오타가 있는 경우
  • Credential 정보가 들어간 경우
  • 보여주기 부끄러운 메시지가 들어간 경우

 

 

대략적으로 찾아봤을 때 rebase, cherry-pick을 많이 사용하시는 것 같았습니다. 

 

저는 그중에서 git rebase 명령어를 선택했고, 결론적으로는 성공했습니다. 

  • 인텔리제이 터미널에서 작업

 

 

일반적으로 리베이스는 두 개의 브랜치를 합치는 용도로 git merge와 함께 쓰이는 것으로 알고 계신 분들이 많습니다. 이에 더해 HEAD 포인터를 이동시켜 과거 커밋 히스토리를 수정하는 꿀기능도 있습니다. 

 

 

 

오늘은 git rebase -i 옵션을 이용해서 커밋 히스토리를 수정해보고자 합니다. 

넉넉잡아 두 시간이 걸렸고, 그때마다 캡처를 못 해둬서 사진은 다른 블로그의 캡쳐로 대신 했습니다. 

 

 

 

 

 

git에 올린 커밋내역을 보고 싶을 때

HEAD를 이용

git rebase -i HEAD~n

n의 자리에는 숫자가 들어갑니다. 거슬러서 어디까지의 커밋내역을 보고 싶은지에 따라 달라집니다. 

 

 

그럼 터미널에서 다음과 같이 출력됩니다.

출처 : https://computer-science-student.tistory.com/540

 

[명령어][커밋 해시][커밋메시지] 순서대로 구성되어 있습니다.

이제 밑의 옵션을 보고 과거 커밋의 명령어를 수정할 수 있습니다. 

 

 

 

저는 제거할 것이므로 drop을 적용했습니다. 

출처 : https://computer-science-student.tistory.com/540

 

 

이렇게 명령어를 수정한 후에 :wq를 입력해 저장 후 종료합니다. 

저의 경우 충돌이 몇 번 나서 구글 소셜 로그인 - 깃 캐시 삭제 관련 커밋들을 전부 삭제했습니다.
그래서 다시 코드를 짜야합니다. 행복한 월요일 오후네요.

 

그 후 github에 갔더니 커밋한 내역이 사라짐을 확인했습니다. 

 

 

 

 

어라! 터미널 수정 후 esc가 안 먹네? 나 여기 갇힌 건가...?

저는 인텔리제이에서 기본 CMD 터미널을 사용하고 있습니다. git rebase -i로 옵션들을 수정하고 나가려고 하는데 :wq이나 esc를 아무리 눌러도 나가지지가 않아서 당황했습니다. 

 

 

서칭 하다 해결방법을 적용하고 나갈 수 있어서 공유합니다. 

File > Settings > Tools > Terminal에 들어가서 Configure terminal keybindings를 클릭하면 Keymap으로 넘어가는데 

 

하단에 Switch Focus To Editor를 더블클릭 > Remove Escape 해서 해제하거나 다른 단축키로 바꿔주면 됩니다.

 

 

 

 

 

주의사항

1. 전 혼자 작업하는 토이 프로젝트라서 맘 편히 git 커밋들을 삭제했지만 협업하는 상황이라면 주의해야 합니다. 

원격 리포지토리에 푸시된 커밋 히스토리를 로컬에서 리베이스 하여 다시 푸시하는 일은 지양해야 하는데요.

리베이스는 기존 커밋을 재사용하는 것이 아닌 내용이 같은 커밋을 새로 만들기 때문입니다.

 

그래서 뭐?라고 하실 수 있겠지만

원격 브랜치를 베이스로 작업하고 있는 동료들의 커밋 히스토리가 빠그라질 수 있습니다. 또는 --force 옵션을 쓴다면 동료의 시간과 눈물의 작업본을 날려먹을 수도 있습니다. 

 

 

 

2. 문제가 있는 파일 전체를 히스토리에서 삭제하는 방식이므로, 해당 파일에 Credential 외의 내역도 날리는 방법이므로 신중해야 합니다. 

 

 

3.기존 커밋 ID값도 변경됩니다. 

따라서 커밋ID 이력을 관리하는 상황이라면 추가적인 문제가 발생할 수 있습니다. 

 

 

 

 

 

가장 Best는 Credential 정보를 파일 안에 기재를 안하거나 .gitignore에 추가해야겠지만 변수는 항상 존재하니 이렇게 개인 플젝을 하면서 git 명령어를 연습하는 것도 필요하다고 생각합니다.

 

주의사항을 충분히 숙지하고 커밋 히스토리를 넘나들고 수정하는 과정을 반복한다면 더 이상 Git을 두려워하지 않을 수 있을 것 같습니다!

 

 

 

 

 

 

 

 

 

 

 

 

 

 


참고 :

Git Rebase --interactive 옵션 알아보기

Git 특정 파일에 대한 이력 삭제

인텔리제이에서 Git Bash vim exit 안 될 때