git에서 커밋 작성자 변경하기

singleheart·2023년 4월 9일
0

git에서 커밋을 했는데 작성자를 변경하고 싶을 때가 있습니다. 회사 업무를 하는데 외부에서 쓰는 개인 명의로 커밋하거나 반대로 사적인 작업을 하는데 회사 이메일로 커밋하는 경우 등이 있겠습니다. 동료가 세팅한 환경에서 작업하다가 커밋을 해야 하는 경우도 가끔 생기고요. 다행히 아직

커밋을 하기 전이라면

$ git commit --author="성명 <이메일@주소>"

--author 옵션으로 지정해 주면 됩니다. 하지만,

이미 커밋을 했다면

$ git commit --amend --author="성명 <이메일@주소>"

위와 같이 가장 최근 커밋의 작성자를 변경할 수 있습니다. 그런데,

벌써 여러 번 커밋했다면

이때부터 문제입니다. 이 글을 쓴 이유이기도 하고요. 두 가지 대표적인 방법이 있습니다. 

git rebase 명령어 활용

우선, 변경할 커밋 바로 앞 커밋의 해시값을 찾아야 합니다. 예를 들어 Gildong Hong 명의로 커밋해야 하는데, 실수로 badguy 명의로 커밋한 상황이라면, git log로 해시값을 찾아봅니다. 

$ git log
Sat Mar 14 17:43:48 2020 +0900 80c7efc (HEAD -> develop) fix typo  [badguy]
Sat Mar 14 17:14:25 2020 +0900 599eda2 add throw  [badguy]
Sat Mar 14 16:22:07 2020 +0900 25fea18 refactor transcript [badguy]
Sat Nov 30 15:53:10 2019 +0900 dca21eb implement transcript  [Gildong Hong]
Sun Nov 17 01:08:18 2019 +0900 545da51 update property  [Gildong Hong]

여기서 커밋 세 개를 변경해야 하는데요, 25fea18이 아니라 그 전 커밋의 해시코드인 dca21eb 기준으로 진행해야 합니다.

$ git rebase -i dca21eb

그러면 아래와 같은 화면이 나타납니다. (아래에 도움말이 표시되는데 생략했습니다)

pick 25fea18 add chapter 17 exercise 1 base code
pick 599eda2 add throw
pick 80c7efc solve chapter 17 exercise 1

# Rebase dca21eb..80c7efc onto dca21eb (3 commands)

앞쪽 세 줄의 pick을 edit 또는 e로 변경하고 저장합니다.
그리고 git commit --amend --author="성명 이메일@주소"와 git rebase --continue를 반복해 주면 됩니다.
rebase는 브랜치를 합칠 때 쓰는 명령으로 알려져 있는데요, 현재 작업중인 브랜치 자기 자신과 리베이스하는 것도 가능합니다. 지정한 커밋부터 하나씩 가져오면서 현재 브랜치에 합치는 과정이고요, 커밋의 해시코드가 동일하니 새로운 커밋이 생기지는 않고 위에서 지정한대로 author 정보만 수정하게 됩니다.
이 방법이 정석이고 안전합니다만, 커밋이 많은 경우에는 불편합니다. 그럴 때는 아래 소개하는 방법이 낫습니다.

git filter-branch 명령어 활용

이 방법은 모든 커밋을 일괄 변경하기 때문에 잘못 사용하면 매우 위험합니다. 결과에 책임을 질 수 있는 분만 따라하십시오. 
코드가 기니까 스크립트 파일로 저장한 다음 실행하시는 것을 추천합니다.

$ git filter-branch -f --env-filter '
WRONG_NAME="badguy"
NEW_NAME="Gildong Hong"
NEW_EMAIL="gildong.hong@sk.com"
if [ "$GIT_AUTHOR_NAME" = "$WRONG_NAME" ]
then
    export GIT_AUTHOR_NAME="$NEW_NAME"
    export GIT_AUTHOR_EMAIL="$NEW_EMAIL"
fi
if [ "$GIT_COMMITTER_NAME" = "$WRONG_NAME" ]
then
    export GIT_COMMITTER_NAME="$NEW_NAME"
    export GIT_COMMITTER_EMAIL="$NEW_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

실행 후 git log를 실행해 보면 author가 일괄 변경되어 있습니다.
그런데 git status를 실행해 보면 아쉽게도 git rebase를 했을 때처럼 결과가 깔끔하지는 않고, diverged 상태가 됩니다. 다만 커밋의 해시코드들은 동일하기 때문에 git rebase 명령을 한 번만 실행해 주면 깔끔해집니다.

참고

아래 깃헙 페이지에 잘 설명되어 있습니다:
https://help.github.com/en/github/using-git/changing-author-info

profile
개발자

0개의 댓글