최근에 Github의 프로필을 보면서 불현듯 "예전 Repository를 정리해봐야겠다."라는 생각이 들었습니다. 최종적으로는 불필요한 Repository를 하나로 병합하는 것인데, 그 과정에서 Commit의 기록을 보니, 제 계정으로 안하고, Local 사용자의 이름으로 되어 있어서 누가 작업 했는지 명확하지 않았습니다. 그와 더불어서 옛날의 저의 Commit 습관과 코딩 습관을 보니 많이 모자랐던 것이 사실인 것 같습니다. 그래서 지금이라도 Commit의 Author만 이라도 바로 잡고자 찾아봤는데, git rebase를 사용하여 Author를 수정하고 force push를 통해 이 내용을 반영하면, Commit의 내용과 변경점, 시간을 유지하고서 Author를 가져올 수 있습니다.
이 기능은 마치 영화에서 나온 타임스톤 같은데요. 위에 기재한 용도 외 다른 이유로 Rebase를 사용하고 다른 Commit을 수행하면, 변경 전에 Pull 한 다른 컴퓨터에서는 이전과 동일하지만 변경한 컴퓨터에서는 다른 Flow가 흐르게 됩니다. 분명 같은 프로젝트인데 다른 Flow가 흐르다니... 멀티버스 같습니다. 그러므로 2명 이상과 진행하고 있는 프로젝트라면 상당한 주의를 요합니다.
이번 시나리오에서는 Github에서 예제를 Clone 한 다음, Commit의 Author을 변경해보겠습니다.
먼저 수정하고 싶은 Commit을 골라야합니다. 이를 위해 아래 명령어를 통해 모든 Commit을 보고 수정할 것을 선택합니다.
git rebase -i --root
위와 같이 Commit의 리스트가 쫙 나오는데요. vim과 동일하게 사용하셔서 자신이 수정하고 싶은 Commit 라인에 있는 'pick'을 'edit' 또는 'e'로 변경합니다. 그 후, 저장하고 나오면 Edit으로 설정한 과거의 Commit으로 변경되면서 수정할 수 있게 됩니다.
아래 명령어를 통해 Author의 정보를 변경할 수 있습니다.
git commit --amend --author="(Github ID) <email>"
위와 같이 입력하면 Author 부분이 변경되어 표출이 됩니다. 추가로 변경할 사항이 없다면, 나가줍니다.
2번 과정에서 정보를 변경하고 나갔다면 Commit이 변경된 것입니다. 그러면, 다음 Commit으로 넘어가야겠죠? 넘어가는 것은 아래 명령어로 가능합니다.
git rebase --continue
이렇게 수정하고자 하는 Commit을 2~3번 과정을 반복하면서 현재까지 와줍니다.
제가 참고한 다른 글에서는 이 내용을 소개하지 않았는데, 저는 이 과정을 수행해야 Github에 Push 했을 때 Commit의 시간이 그대로 유지되었습니다. 그래서 이 방법도 같이 소개하고자 합니다.
아래 소개할 과정을 거치지 않으면 이렇게 Github에서의 Commit의 시간이 꼬이게 됩니다. 이는 Github에서는 Commit Date를 받아오는데, git rebase를 수행하면 Commit Date가 변경되기 때문에 이와 같은 현상이 일어나는 것으로 보입니다.
위 사진은 git log --pretty=fuller
를 통해 조회한 기록인데요. AuthorDate와 CommitDate가 일치하지 않는 것을 볼 수 있습니다.
이 현상은 아래 명령어를 통해 해결할 수 있습니다.
git filter-branch --env-filter 'export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"'
위 명령어는 Filter를 통해 모든 Commit의 GIT COMMITTER DATE를 AUTHOR DATE와 일치시킵니다. git rebase의 --committer-date-is-author-date 옵션도 있지만, 이 옵션을 사용하면, Root Commit에는 반영되지 않는 문제가 있어 위와 같이 Filter를 사용하는 방법을 소개드립니다.
이렇게 변경한 내용은 강제로 Push 해야 Remote에 올라갑니다. 아래 명령어를 이용하여 Push 합니다.
git push (remote 이름) +(branch 이름)
ex) git push origin +main
이렇게 이쁘게 변경되었음을 확인할 수 있습니다. 목표가 달성되었습니다!!
하지만, 베스트 시나리오는 처음부터 실수하지 않는 것 입니다. git config를 제대로 설정합시다. ㅠㅠ 또한 Push 전에 한 번씩 확인하고, Push 하도록 해야할 것 입니다. 이번에 삽질 아닌 삽질을 하면서 Push를 남발하지 말자고 다짐하게 되었습니다.
감사합니다. 로컬에서 rebase를 통해 Author를 수정하고 푸시를 했더니, github에서 commit date가 이상해서 어리둥절 했었는데, 덕분에 문제도 해결하고, 지식도 배우고 갑니다!! :)