git commit 후 author, email을 수정하는 방법

git 을 여러 PC 에서 사용하다보면 자칫하면 유저 네임(user.name) 이나 이메일을 의도와는 다르게 하여 commit & push 를 진행 할 수가 있다. 예를 들면 개인 노트북과 회사에서 업무로 사용하는 노트북이 있는데, 회사 노트북에는 회사에서 사용하는 유저네임이나 이메일 주소를 git 에 설정하였지만 개인 노트북에는 개인 계정의 유저네임이나 이메일 주소를 설정해놓은 상태에서 간혹 개인 노트북으로 회사 업무를 처리할때 이미 설정된 개인 유저네임과 이메일로 commit & push  가 되는 경우다. 

이때 회사의 git 레파지토리에 회사에서 사용하는 공식 유저 네임과 이메일 계정이 아닌 개인 유저 네임과 이메일 주소가 표기되어 있다면 난감한 상황에 빠진다. 뭐 개인 유저 네임이나 이메일 계정이 회사에 공개되어야 상관없다면야 문제가 없겠지만, 개인 성향상 회사에 공개하고 싶지 않다면 이미 처리해 버린 commit 과 push 를 되돌리고 싶을 것이다. 

이럴 때 commit 된 작업의 유저네임과 이메일 주소를 어떻게 바꿀까? 얼마전에 경험했던 상황을 바탕으로 commit 된 작업의 유저네임과 이메일 주소를 바꾸는 방법에 대하여 알아보기로 하자.

현재 설정된 git user.name 과 git user.email 확인하기

현재 PC나 서버의 계정에 설정된 git user.name 과 git user.email 을 확인하려면 아래 명령어를 통해 확인할 수 있다.

git config user.name     # 현재 디렉토리의 유저네임   
git config user.email    # 현재 디렉토리의 이메일

git config --global user.name       # 전체 계정의 유저네임
git config --global user.email      # 전체 계정의 이메일

위에서는 두가지 형태로 표시하였는데, 첫번째는 clone 한 디렉토리별로 유저네임과 이메일을 확인할 때 쓰는 것이고 두번째는 전체 계정의 유저네임과 이메일을 확인하는 것이다. git 은 각 브렌치 별로 유저네임과 이메일 주소를 각각 설정이 가능하다. 따라서 전체 계정의 유저네임과 이메일을 설정했더라도 특정 디렉토리에 clone 한 git branch에는 별도로 유저네임과 이메일 주소가 설정이 가능한 것이다. 

그래서 작업시 한개의 계정에서 commit & push 를 할때 유저네임이나 이메일주소를 각각 다르게 하려면 작업 디렉토리별 브렌치마다 각각 유저네임과 이메일 주소를 설정해주면 된다. 

git user.name 과 git user.email 을 의도와 다르게 설정하고 나서 commit & push 했을때 변경법

그럼 의도치 않게 git의 유저네임과 이메일을 다르게 설정한뒤 commit 과 push 를 처리했다면 이를 바꿀 방법은 있을까? 당연히 가능하다. 

먼저 상황을 한번 보자. 

$ git log
commit bdc88612d9a45a305805c54ac8fe0586abc695ad (HEAD -> master, origin/master)
Author: haha <test@codedosa.com>
Date:   Tue Apr 5 07:47:52 2022 +0900

    add a

commit b58332f048d7d5b131fa078b7220a854ee218f5f
Author: codedosa <dosacode@gmail.com>
Date:   Tue Apr 5 07:44:28 2022 +0900

    first commit

위 git log를 보면 맨 아래 commit 의 author 와 이메일은 각각 codedosa, dosacode@gmail.com 이지만 그 다음 commit의 경우에는 author 는 haha 이고 이메일은 test@codedosa.com 이다.  각 commit 마다 author 와 이메일 주소가 다른 것을 알 수 있다. 하지만 실제로 commit 은 같은 사람인 내가 한 것이고 단지 유저네임(author)와 이메일만 각각 다르게 설정하여 commit 처리를 한 것이다. 위 commit 들은 현재 레파지토리에 push 처리까지 되어 있다. 

여기서 author 가 “haha” 인 커밋의 author 와 이메일 주소를 바꿔서 레파지토리에 push 까지 해보도록 하자. 

“git rebase” 명령을 이용하여 바꿀 커밋을 선택하여 실행한다. 커밋은 마지막 “HEAD” 를 기준으로 선택하면 되는데 여기서 바꿀 커밋은 HEAD 이다. 만약 바꿀 커밋이 HEAD를 기준으로 한단계 아래 있다면 “HEAD~1” 이 된다. 

git rebase -i HEAD 
# 커밋이 한단계 아래라면 
git rebase -i HEAD~1

위 명령어를 입력하면 다음과 같이 edit 창이 뜬다. 여기서 e 를 입력한다음 수정할려는 commit ID 를 입력하고 :wq 를 해서 저장하고 빠져나온다.

noop
e bdc88612d9a45a305805c54ac8fe0586abc695ad  # 수정할 커밋 ID
# Rebase bdc8861..bdc8861 onto bdc8861 (1 command)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#

저장하고 빠져나갔으면 다음과 같은 화면이 나타난다.

$ git rebase -i HEAD
interactive rebase in progress; onto bdc8861
Last commands done (2 commands done):
   noop
   edit bdc8861
No commands remaining.
You are currently rebasing branch 'master' on 'bdc8861'.
  (all conflicts fixed: run "git rebase --continue")

nothing to commit, working tree clean
The previous cherry-pick is now empty, possibly due to conflict resolution.
If you wish to commit it anyway, use:

    git commit --allow-empty

Otherwise, please use 'git rebase --skip'
Could not apply bdc8861...

메시지를 보니 conflict 가 난다고 한다 이때 “git rebase –continue” 를 한번 해준다. 

$ git rebase --continue
Successfully rebased and updated refs/heads/master.

위와 같이 나온다면 git rebase 상태로 전환이 완료된 것이다. 다음에는 아래와 같이 git commit 명령어와 –amend 옵션을 통해 변경할 author 와 email 주소를 입력해 준다. vi 에디터가 나타나는데 :wq를 눌러서 저장하고 빠져나가면 아래와 같이 메시지가 나타난다.

$ git commit --amend --author="codedosa <dosacode@gmail.com>"
[master 49dd75f] add a
 Author: codedosa <dosacode@gmail.com>
 Date: Tue Apr 5 07:47:52 2022 +0900
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a

위와 같이 메시지가 나오면 HEAD 커밋의 author와 email 주소가 좀전에 입력한 정보로 바뀌어 있을 것이다. 현재는 HEAD 의 작업용 branch 만 변경이 되어 있을 것이다. 이걸 원격 레파지토리에 push 를 해주면 된다. 

git push -f origin master

git push 에서 -f 옵션을 줘서 강제로 push 를 해준다. 그럼 원격 레파지토리에도 변경한 author와 email 주소가 업데이트 되어 있을 것이다. 

$ git log
commit 49dd75f3c44d3f7c78017b900ad4438b2b332b61 (HEAD -> master, origin/master)
Author: codedosa <dosacode@gmail.com>
Date:   Tue Apr 5 07:47:52 2022 +0900

    add a

commit b58332f048d7d5b131fa078b7220a854ee218f5f
Author: codedosa <dosacode@gmail.com>
Date:   Tue Apr 5 07:44:28 2022 +0900

    first commit

확인해 보니 마지막 커밋이 바꾸려고 했던 author 와 email 로 업데이트 되어 있음을 알 수 있다.

'코드도사(codedosa.com)'에는 쿠팡파트너스 등의 제휴링크가 포함되어 있으며 수수료를 제공받을 수 있습니다.