Back

git filter-branch

오래된 커밋 메세지에 오타를 발견하고 이를 수정하려고 git rebase를 사용했다.

사용법도 잘 몰라서 구글에 검색해서, 하라는 대로 git rebase의 reword라는 것을 사용했다.

나중에 github에서 커밋 히스토리를 봤는데 해당 저장소의 모든 커밋의 날짜가 저 rebase를 했던 시간으로 변경이 되어있었다.

식은땀도 나고, 큰일 난 것 같아 되돌릴 방법을 찾던 중 이상한 것을 발견한다.

모든 커밋의 날짜가 동일한 시간으로 변경이 된 줄 알았는데, git log를 통해 보이는 date는 내가 실제로 커밋했던 시간으로 모두 설정이 되어있었다.

한 줄기 희망의 빛이 보이는 것 같았다.

내 로컬에는 정상적이나, 깃허브에서 정상적으로 보이지 않는 것 같다는 생각에 변경 기록을 만들어 force push를 해봤으나 변경되지 않는다. os 환경, 각종 터미널 환경까지 변경을 해보고 시도를 해봤다.
신기하게 git clone 을 통해 새롭게 프로젝트를 받아 git log를 봤을 때도 그대로 내가 실제로 커밋했던 시간으로 설정이 되어있었다. 하지만 이런 곳에서 force push를 해도 결과는 같았다.

그리고 검색 도중 아래와 같은 내용을 보게 된다.

Troubleshooting commits on your timeline - GitHub Docs

AuthorDate라는 것과 CommitDate라는 것이 존재하며, github에서는 CommitDate 기준으로 커밋 히스토리에 표시를 해준다고 한다.

또한 아래와 같은 명령어를 통해 각 커밋별로 해당 date를 확인할 수 있다는 것을 확인했다.

git show --pretty=fuller
git log --pretty=fuller

확인을 해보니, 원인을 찾게 되었다.

내 모든 커밋들의 CommitDate가 rebase를 하던 시간으로 변경이 되어있었다.

그리고 검색을 통해 아래와 같은 답을 찾게 된다.

GIT: change commit date to author date

short answer에서 아래의 git filter-branch를 사용하면 된다고 말한다.

git filter-branch --env-filter 'export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"'

당시에는 filter-branch가 뭔지 몰라서 이게 맞나 싶기도 하고, 커밋 메세지 하나 바꾸려고 무지성으로 따라 하다가 날짜가 모두 바뀌어버린 경험을 한 직후라 무서워서 바로 진행하지 못하고 검색을 좀 해봤다.

여러 검색을 통해 이것을 사용해도 된다고 느꼈고, 약간 어차피 망한 거 그냥 해보자 하고 시도를 했었다.

바로 처리가 되지 않고, 뭔가 로딩하는듯한 내용이 터미널에 보였으며 아 몰라 하고 force push 했더니, 모든 문제가 해결되었다.

마음을 진정시키고 이 git filter branch에 대해 알아보게 되었다.

Git - git-filter-branch Documentation

사용자 필터링 도구를 통해 새롭게 commit 내용을 변경해주는 도구인데, 내가 사용했던 commit date를 author date로 변경하는 것 말고도 여러 가지 기능들이 존재한다.

처음 rebase를 하기 전에 stash 해놓은 것들이 있었는데 git filter branch를 사용하니, 불러오지를 못해서 이것저것 해보다가 결국 stash가 사라졌다. 뭘 변경했는지 기억이 나지 않아 찝찝하긴 하지만, 그래도 내 commit date를 모두 정상적으로 바꿔준 것만으로도 감사함을 느끼고 만족해야겠다.