Git
Git Commit 이력 변경 - 작성자(Author), 커밋 날짜(CommitDate) 변경하기
Github 레포에 공부하고 코드를 작성해서 올리다가 히스토리를 확인했다.
아차.. 일도 개발 공부도 회사 PC로 하다 보니 레포에 커밋들이 회사 Github 계정으로 들어갔다.
개인 계정으로 넣을 레포를 생성했으면 로컬 git config를 개인 계정으로 변경하고 했어야 하는데...
이와 같이 Commit 작성자(Author)를 잘못 넣은 경우나 실제 코드는 이전에 작성했는데 깜빡하고 커밋을 안 해서 같은 날 여러 개를 올리게 되어 Commit 날짜를 변경하고 싶은 경우 아래와 같이 수정하면 커밋 이력을 변경할 수 있다.
1. Git Config 작성자 변경
1. git config로 해당 레포의 작성자를 다른 계정으로 변경한다.
$ git config --local user.name jiae
$ git config --local user.email hirlawldo413@gmail.com
위와 같이 명령어를 bash shell에서 치면 해당 레포만 git 계정 정보를 변경할 수 있다.
(모든 레포에서 사용하는 깃헙 계정을 변경하고 싶다면 --local이 아니라 --global 옵션을 사용한다.)
혹시나 기존 계정 정보가 남아있어서 반영이 안되면 git credential-osxkeychain erase 명령어로 날려버릴 수 있다.
나는 위 명령어를 bash 스크립트로 만들어두고 계정 정보를 바꾸어야 하는 레포에서 실행한다.
2. Git Comment 작성자 변경
(1) git log로 현재 git history 상황을 확인한다.
$ git log
슬프게도 개인 계정이 아니라 회사 계정이다. 커밋 이력의 작성자(Author) 정보를 변경해야 한다.
변경해야 하는 커밋이 HEAD로부터 몇 번째인지 확인한다.
(2) git rebase -i 명령어로 commit 이력을 변경할 커밋들을 선택한다.
$ git rebase -i HEAD~1
git rebase -i HEAD~8로 작성하면, HEAD(가장 최신 커밋)로부터 8개까지의 커밋을 변경할 수 있다.
$ git rebase -i --root
만약 맨 첫 커밋부터 변경해야 한다면 git rebase -i --root 명령어를 사용한다.
위 git rebase -i 명령어를 사용하고 나면 아래와 같이 변경할 커밋의 목록들이 나온다. 기존에는 pick로 되어있는데, 수정이 필요한 놈을 e로 변경한 뒤 :wq로 창을 나온다.
위 창에서 나오게 되면 아래와 같이 커밋을 ammend(수정)할 것인지, 다음 커밋으로 넘어갈 것인지(continue) 선택하라고 한다.
$ git rebase -i HEAD~8
ad8f1e1... [Factory] 팩토리 메서드 패턴 예제 추가 (치킨 공장) 위치에서 멈췄습니다
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
$ git commit --amend --author="jiae<hirlawldo413@gmail.com>"
해당 커밋의 작성자를 수정하고 싶다면 git commit --amend --author="Author Name<author@email>" 명령어를 쓰면 작성자를 수정할 수 있다.
Commit 메시지 내용을 변경하고 싶다면 아래와 같이 변경할 커밋 메시지 창이 떴을 때 메시지를 변경한 후 :wq로 저장한다.
변경이 완료되었다면 `git rebase --continue` 로 변경할 다음 커밋으로 넘어간다.
3. Git Comment 날짜 변경
$ GIT_COMMITTER_DATE="Jan 15 22:00:00 2022 +0900" git commit --amend --date "Jan 15 22:00:00 2022 +0900”
날짜를 변경하고 싶다면 위와 같이 GIT_COMMITER_DATE 변수를 설정한 뒤 git commit --amend --date 옵션으로 시간을 변경해준다.
커밋 날짜를 변경한 뒤 git log --pretty=fuller 명령어로 정상적으로 `CommitDate`가 원하는 날짜로 바뀌었는지 확인한다. (이 값이 실제 github의 커밋 날짜로 찍힌다.)
정상적으로 원하는 Commit 날짜로 변경되었다면 git rebase --continue 명령어로 수정할 다음 커밋으로 넘어간다.
4. 수정한 커밋 반영하기
git push --force
모든 커밋을 전부 수정했다면 git push --force로 넣는다. 단, 만약 개인 레포가 아니라면 본인 혼자 쓰는 브랜치에 해당 사항을 반영하자.
(만약 공용으로 함께 쓰는 브랜치에 force push를 했다간 다른 팀원들에게 몰매 맞을 수 있으니 주의한다.)
git에 반영하고 나면 정상적으로 github에 변경된 작성자와 시간이 반영된 것을 확인할 수 있다.
** 주의사항 **
만약 앞에 GIT_COMMITER_DATE 옵션에 값을 주지 않는다면, AuthorDate만 수정되는 것이기 때문에 실제 github에 올라갔을 때에는 시간이 변경되어 있지 않은 참사가 일어날 수 있다.
마무리
다른 개발자가 매일매일 TIL을 작성할 수 있는 꿀팁이 있다고 했을 때 굳이 그게 필요한가 싶어서 테스트해보진 않았는데 이번에 레포에 계정을 잘못 넣으면서 겸사겸사 Commit 뭉쳐서 들어간 애들도 쪼개고 시간도 함께 수정해봤다.
귀찮은 작업이니 다음부터는 계정 변환이든 Commit이든 그때그때 잘 쓰자.
처음에 커밋 날짜를 변경했었는데 왜 변경이 안 되는 거지 하면서 한참 헤맸다. 혹시 나같이 삽질하는 사람을 위해 **주의사항**도 작성해두었으니 참고하자.
참고 자료
1. git-scm) git log 보는 여러 가지 방법
https://git-scm.com/docs/git-log#_history_simplification
2. stackoverflow) git commit 메시지 수정하는 방법
https://stackoverflow.com/questions/454734/how-can-one-change-the-timestamp-of-an-old-commit-in-git