Git Commit History 마음대로 변경하기

Hyunwoo Lee·2024년 1월 2일
0
post-thumbnail

앗! 실수로 회사 계정으로 커밋했다!

Bulb-Talk 프로젝트를 처음 시작할 때, 첫 커밋의 Author가 회사 계정으로 설정되어있는 채로 커밋한 바람에 회사계정이 영원히 contributer로남게되었다


문제의 최초 commit.

사실 개인 레포지토리에 컨트리뷰터에 누가 있든 별로 상관은 없다. 누가 보는 것도 아니고, 굳이 커밋 히스토리 최 하단을 보지도 않는다.
하지만 불편하다!

불편하면 자세를 고쳐앉아!
하지만 개발자는 자세가 아니라 문제를 고쳐야지!

불편한 일이 생겼을 때, 자세를 고쳐앉는 건 하수다.
엔지니어는 문제를 고친다.

저 멀리있는 Commit을 어떻게 고칠까?

최신 commit이라면 git commit --amend 명령어로 바로 수정이 가능하지만, 저 멀리 있는 커밋은 그럴 수 없다.
이 때 사용하는 것이 rebase이다.

Rebase

Rebase는 깃에서 사용하는 branch 관리 전략중 하나로, 비슷한 전략중 하나로 Merge가 있다.

Merge와 Rebase의 차이는 위 그림 하나로 요약된다.
merge가 두개의 branch를 합치는 전략이라면, rebase는 기존 branch에 새로운 commit을 끼워 넣는다.

merge는 branch의 생성과 삭제가 명확하게 보이지만 갈수록 branch가 늘어나 복잡해보인다는 단점이 있고, rebase는 branch가 하나만 남기 때문에 간결해 보인다는 장점이 있다.
자세한 내용은 공식 문서에 잘 나와있다.

우리는 브랜치를 여러개 만들 것이 아니기에, 이러한 내용을 몰라도 되지만, rebase의 commit을 '끼워 넣는다' 라는 기능에 주목하면, 우리의 잘못된 최초의 commit을 수정할 수 있다는 점을 알게된다.

처음으로 Rebase 해보자!

git rebase -i  --committer-date-is-author-date --root

-i : interactive. 대화형
--committer-date-is-author-date: Author date와 committer date를 일치시킨다. rebase를 하게되면, committer date가 현재로 변경된다. 그럼 지금까지 했던 모든 commit 시간이 현재 시간으로 변경되기 때문에, commit history가 예쁘게 나오지 않는다. 이를 방지하기 위해 위 옵션을 넣어줘야한다.

--root: 최초 commit으로 이동한다. --root대신 커밋id를 넣어서 해당 커밋으로 이동할 수도 있다.
위 명령어를 통해, 첫 커밋으로 바로 rebase가 가능하다.

그럼 위와 같은 창이 뜨는데, 여기서 첫번째 commit의 pick을 edit으로 수정한다.

이 외에도 다음 작업도 가능하다.

  • 커밋 순서 변경
  • 커밋 합치키
  • 커밋 분할
  • 커밋 메세지 편집
  • 커밋 삭제 및 건너뛰기
$ git log
commit fbf8a34fe14438794facdc6e046fa344b8517afd (HEAD)
Author: company <company@company.com>
Date:   Sun Jul 30 21:38:40 2023 +0900

    [ADD] First Commit

git log 확인 결과 첫 커밋으로 돌아온 것을 알 수 있다!

이제 amend를 통해 commit을 수정할 시간이다.

git commit --amend --author="harrier999 <harrier999@github.com>"

만약 --committer-date-is-author-date 옵션을 주지 않고 Rebase하면, 위 이미지처럼 commit 시간이 현재 시간과 동일하게 통일된다. 꼭 옵션을 넣어주자


git log 명령어에서는 정상적으로 Date가 출력된다.
그런데 왜 github에서는 시간이 다르게 보일까?


git log에서 보여지는 시간은 CommitDate가 아닌 AuthorDate이다.
반면에 github에서 보여지는 시간은 CommitDate이다.
git log --pretty=fuller 명령어를 이용하면 AuthorDate와 CommitDate를 모두 볼 수 있다.

어떻게 Commit, Author Date를 변경할 수 있을까?

author를 변경했더니 commit date가 초기화되고, 그대로 냅두자니 author가 계속 남아있는게 불편하다. 좋은 방법이 없을까?

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

filter-branch라는 명령어를 이용해 AuthorDate를 CommitDate과 동일하게 만들 수 있다.

하지만 filter-branch는, 모든 commit 내역을 한 번에 수정하는 강력하지만 위험한 툴이기 때문에 사용을 권장하지 않는다.

대신에, 처음 rebase를 할 때부터 commit date를 변경하지 않도록 설정할 수 있다.

git rebase -i --committer-date-is-author-date --root

이 옵션을 추가한 후 rebase를 하면 committer date가 변경되지 않는다.

정리

git rebase -i --committer-date-is-author-date --root
git amend --author="harrier999 <harrier999@github.com>"
git rebase --continue
git push -f

g

profile
10분만 쉬어요

0개의 댓글