이미 저장소에 push한 git author, email 변경방법 총정리

이미 git 원격저장소에 push완료한 commit들에 대해 작성자, 이메일을 변경하는 방법을 총 정리했어요. 주의해야 할 점까지 정리해서 차근차근 쉽게 따라할 수 있도록 알려드릴게요.

history 일괄 수정하는 방법

먼저 HEAD에서 git log을 찍었을 때 나오는 모든 commit의 작성자, 이메일을 수정하는 방법은 다음의 명령어를 쳐주시면 됩니다.

git filter-branch -f --env-filter 
"GIT_AUTHOR_NAME='cjs'; 
GIT_AUTHOR_EMAIL='cjs0308cjs@naver.com'; 
GIT_COMMITTER_NAME='cjs'; 
GIT_COMMITTER_EMAIL='cjs0308cjs@naver.com';" HEAD
git author 일괄 수정하는 방법

위 명령어 입력한 후 git log를 확인해보면 다음과 같이 Author과 email이 일괄적으로 모든 커밋들이 수정되었음을 확인할 수 있습니다.

git author 일괄 수정한 후 결과

특정 commit만 수정하는 방법

수정할 대상 commit 범위 지정하기

1. HEAD부터 최신 커밋 n개 범위 지정

만약 위 log에서 step 4, step 3의 author를 수정하고 싶을 경우라고 가정해봅시다. 즉, HEAD로부터 2개를 수정하는 것이지요. 이럴경우 아래의 git rebase 명령어를 입력해줍니다.

git rebase -i HEAD~2

2. 과거 Commit 이후로부터 모두 지정

만약 commit이 많을 경우 n개 갯수를 세기 어렵잖아요. 이럴 경우 수정할 대상 바로 직전의 커밋 hash를 복사하셔서 다음과 같이 입력하시면 됩니다.

git rebase -i 638ba7bf0f7a3435f96d26077461ae4c8474431a

위 638ba7로 시작하는 hash는 step2의 커밋 hash입니다. 이렇게 입력하면 그 이후의 step3, step4 커밋이 수정할 rebase 대상으로 인식하게 됩니다.

수정할 대상 commit 선택하기

git author rebase로 수정하는 방법과 문자열 일괄 수정하기

git rebase를 입력하면 위와 같은 화면이 나오는데요. step 3,4에 대한 commit 이 pick 된 것을 확인할 수 있지요. 이 2개의 커밋중에 원하는 커밋만 pick이라는 문자를 e(edit)으로 수정하면 됩니다.

여기서 조금 고급 기술을 소개해드릴게요. 저는 둘 다 수정할 것이므로 vim 기능 중에 [:%s/pick/e] 라는 수식을 이용하여 pick이라는 문자열을 모두 e 문자열로 변경해주었어요. 이 기능이 어렵다면 하나씩 pick 문자열을 e나 edit으로 수정해주셔도 좋습니다.

vim 수정하고 wq로 저장하고 나오는 방법

e로 수정을 완료하였다면 :wq를 사용하여 저장 후 종료해주세요.

commit 내용 수정하기

이 상태에서 git log를 확인해보면 HEAD가 가리키는 곳이 step 3으로 변경된 것을 확인할 수 있어요. 이제 git commit –amend 명령어를 사용하여 과거 commit을 수정할 수 있어요.

우리는 author를 수정할 것이므로 다음의 명령어를 입력합니다.

git commit --amend --author="test <test@email.com>"
git commit --amend 명령어 사용법

이어서 vim 화면이 나오면 그상태 그대로 :wq로 저장 후 종료해주세요. git log를 확인해보면 변경이 된 것을 볼 수 있어요. 만약 vim 화면을 보고싶지 않다면 git commit에 –no-edit이라는 옵션을 하나 더 넣어주시면 됩니다.

rebase된 내용 저장하기 + 수정하기 반복

이제 step3 수정사항을 저장할 차례입니다. 다음의 명령어를 입력하여 다음 수정해야할 commit으로 넘어가봅시다.

git rebase --continue
git rebase --continue 사용방법 소개

이제 HEAD가 step 4를 가리키는 것을 확인할 수 있어요. Step4 커밋도 똑같이 git commit –amend 명령어로 author를 수정한 후 git rebase –continue 명령어를 입력해주세요.

git rebase --continue 사용법과 최종 결과물

마지막 edit까지 수정하면 위와같이 Successfully rebased and updated 라는 메시지가 나옵니다. 이어서 git log를 확인해보면 step3,4 모두 Author이 정상적으로 수정된 것을 확인할 수 있습니다. 이제 원격지에 push하기만 하면 됩니다.

git push 전 주의사항

gitlab이든 github든 원격저장소에 이미 push한 상태에서 작성자, 이메일을 수정하기 위해서는 git push에 -f (강제) 옵션은 불가피합니다. -f옵션을 사용하게 되면 이전에 push했던 commit history는 삭제되고 새로운 정보가 입력되는 것과 다름없습니다. 혼자 작업하는 기록을 위한 저장소라면 상관없겠지만, 누군가 해당 저장소에서 소스 코드를 같이 사용하고 있다면 -f 옵션을 사용했을 경우에는 소스 코드를 새로 clone을 받아야함을 알려주어야 합니다.

만약 -f옵션으로 커밋을 변경하였음에도 알리지 않는다면 다른 사람이 피해를 보게 됩니다. 이런 상황이 왔을 경우 다른 사람이 수정해서 push를 할 때 실패하거든요. 왜냐하면 원격저장소의 git은 이제 전혀 다른 상태이기 때문입니다. 예전의 git을 저장하고 있는 로컬 저장소에서 아무리 원격저장소의 git을 pull하거나 push하려고 해봐도 오류를 내뱉을 수 밖에 없습니다

해결하는 방법은 git clone을 통해 소스 코드를 새로 받으면 됩니다. 혹은 다른 임시 브랜치를 생성하여 push한 후 merge 작업을 진행하면 수습은 할 수도 있어요. 그치만 merge를 통해 해결할 경우 git history가 상당히 꼬이게됩니다. 그러니 협업중인 모든 사람에게 소스코드를 다시 clone 받을 것을 공지하거나 요청해야합니다.

추천하는 또다른 방법

다른 branch를 생성하여 push하는 방법을 추천드립니다. 그리고나서 이전의 branch를 regacy로 남겨두었다가 추후 아무도 사용하지 않는것을 확인한 후 삭제하면 안전합니다. github에서 브랜치 삭제하는 방법은 [여기]를 참고해주세요.

예를들어 master 브랜치라면 master-v2라는 브랜치를 생성해셔 push하는 것이지요. 다음과 같이 git checkout 명령어를 입력하면 현재 HEAD가 새로운 브랜치(master-v2)를 생성하며 바라보게 됩니다.

git checkout -b master-v2

git push 하기

새로운 브랜치 생성을 안했을 경우

혼자 사용하여 브랜치를 새로 생성하지 않을 경우에는 다음과 같이 -f를 입력하면 됩니다.

git push -f [원격저장소(origin)] [브랜치명(master)]

이경우에 만약 -f옵션 없이 진행할 경우 에러가 발생하게 됩니다. 참고로 원격저장소가 origin이 아닌 경우도 있습니다. git remote -v로 원격저장소 이름을 확인해보세요.

새로운 브랜치를 생성했을 경우

git push [원격저장소(origin)] [브랜치명(master-v2)]
git push하는 방법 소개

저는 master-v2라는 명칭 대신에 js-dev라는 브랜치명을 사용하였고, 정상적으로 push가 완료되었습니다.

github에 생성한 branch가 들어간 것을 확인

push한 원격저장소 github에서도 확인해보면 방금 push한 js-dev branch가 정상적으로 올라간 것을 확인할 수 있었습니다. github에서 이전에 사용하던 branch를 삭제하는 방법은 [여기]를 참고해주세요.


이번 시간에는 제가 알고있는 git author를 수정하는 방법을 총 정리해보았습니다. 즐겨찾기 해두시고 자주 놀러와주세요 🙂

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다