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 로 업데이트 되어 있음을 알 수 있다.