개요
열심히 개발해서 푸쉬를 했는데 잔디가 안심어져있다면 얼마나 화가 날까?
바로 내가 그랬다. 몇개월 전 진행했던 프로젝트의 모든 커밋의 잔디가 안심어졌던걸 뒤늦게 발견했던 것이다.
원인
잔디가 누락되는 원인으로는 여러가지가 있겠지만, 나같은 경우는 제일 흔하게 보이는 유형인 Github에 등록된 이메일 계정과 커밋할 때의 로컬 이메일 계정일 불일치해서 발생했던 문제였다.커밋이 잔디로 심어지기 위해서는 커밋에 포함된 유저 정보인 이메일이 Github에 연결되어 있어야 한다. Github에 등록되어 있는 이메일과 다르면 잔디로 심어지지 않는다.나는 개인 작업도 하고 재택도 했기 때문에 토이 프로젝트를 하는 동안 회사 계정으로 사용하는 이메일로 커밋해왔던 것..
해결
1. 로컬 유저 정보 수정
우선 앞으로 커밋들은 잔디가 잘 심어져야 하기때문에 로컬의 유저 정보를 수정한다.
자신의 Github 계정에 연결된 이메일을 모른다면 Github 우측 메뉴 > Settings > Emails 메뉴에서 확인 가능하다.
// 해당 프로젝트에만 적용
git config user.email "변경할 이메일"
git config user.name "변경할 이름"
// 모든 프로젝트에 적용
git config --global user.email "변경할 이메일"
git config --global user.name "변경할 이름"
2. 잘못 올렸던 커밋의 유저정보 일괄 수정
본 글에서는 모든 커밋 또는 특정 커밋 이후의 모든 커밋의 유저 정보를 수정해야 할 때 적합한 방법이다.
특정 커밋만 수정하는 방법은 다른 글에서 참고하길 바란다.
$ git rebase -i --root -x "git commit --amend --author='변경할이름 <변경할이메일@example.com>' --no-edit"
- git rebase: 커밋 히스토리를 재작성하게 해주는 Git 명령어이다.
- -i(--interactive): 대화형으로 커밋 히스토리를 수정할 수 있게 해주는 명령어이다.
- --root: 리포지토리의 첫 번째 커밋부터 rebase를 시작하게 해준다. 즉, 모든 커밋을 rebase한다고 보면된다.
- -x(--exec): 각 커밋마다 특정 명령을 실행하도록 지시하게 해준다. 현재는 아래 명령어를 각 커밋마다 실행하게 해준다.
- "git commit --amend --author=' 변경할이름 < 변경할이메일@example.com>' --no-edit": 각 커밋마다 실행될 명령어
- --amend: 현재 커밋을 수정한다.
- --author=' 변경할이름 < 변경할이메일@example.com>': 작성자 정보를 변경한다.
- --no-edit: 커밋 메시지를 수정하지 않고 그대로 유지해준다.
만약 특정 커밋 이후의 커밋들을 일괄 수정하고 싶으면 시작점이되는 커밋 해쉬를 --root 대신 넣자
$ git rebase -i 커밋해쉬 -x "git commit --amend --author='변경할이름 <변경할이메일@example.com>' --no-edit"
위 명령어를 입력하고 나면 아래와 비슷한 내용의 vim 에디터가 출력될 것이다.
pick 860f8d3 feat: 회원가입, 로그인, 회원 CRUD 구현
exec git commit --amend --author='greenbin <greenbin@gmail.com>' --no-edit
pick 732f7d0 feat: 회원가입 유효성검사, sort 버튼 조정
exec git commit --amend --author='greenbin <greenbin@gmail.com>' --no-edit
pick e460654 feat: 테이블 및 컬럼명 변경, 회원 정보 수정 시 버튼 disabled 활성화
exec git commit --amend --author='greenbin <greenbin@gmail.com>' --no-edit
pick eb89014 feat: Flowchart 작성
exec git commit --amend --author='greenbin <greenbin@gmail.com>' --no-edit
pick f5bd9bf feat: 비밀번호 정규식 수정
exec git commit --amend --author='greenbin <greenbin@gmail.com>' --no-edit
pick a5ad1d0 fix: 이메일 수정 안되는 문제 해결
exec git commit --amend --author='greenbin <greenbin@gmail.com>' --no-edit
pick a45b901 feat: 로그아웃 기능 추가
exec git commit --amend --author='greenbin <greenbin@gmail.com>' --no-edit
pick b4f549b fix: 잘못 적용된 속성 변경(pattern -> placeholder)
exec git commit --amend --author='greenbin <greenbin@gmail.com>' --no-edit
pick c2a4980 feat: enter 입력 시 로그인 이벤트 실행
exec git commit --amend --author='greenbin <greenbin@gmail.com>' --no-edit
다른 글에서는 수정할 커밋 줄의 pick을 edit으로 변경했을 것이다. edit으로 변경하면 해당 커밋을 수정할 수 있게 해준다. 하지만 우리는 -x 명령어를 사용해 모든 커밋의 사용자 정보를 자동으로 변경하도록 했기 때문에, edit으로 바꿀 필요가 없다. 다만, 이 방법은 특정 커밋 하나만 수정해야 할 때는 사용하기 어려울 수 있다. (방법을 아신다면 공유 부탁드립니다.)
이제 vim을 종료시킨다. vim을 종료시키면 Git은 각 커밋에 적용시킬 명령어들을 읽은 후, 스크립트를 한 줄씩 실행시킨다.
rebase는 Git 히스토리를 변경하기 때문에 아래 명령어를 통해 리포지토리에 강제로 푸시해야 한다.
$ git push --force
내 작고 소중한 잔디가 돌아왔다!
참조
https://git-scm.com/docs/git-rebase
https://www.geeksforgeeks.org/how-to-amend-a-commit-without-changing-commit-message/
https://wormwlrm.github.io/2020/09/03/Git-rebase-with-interactive-option.html
https://www.sitepoint.com/git-interactive-rebase-guide/
'Git' 카테고리의 다른 글
Git - 로컬 브랜치 이름 변경하기 (0) | 2023.08.08 |
---|---|
나의 첫 Git Flow, Git Branch 전략 세우기 (0) | 2023.03.04 |
Github - Pull request template 작성과 설정 (2) | 2022.12.18 |
Git - Commit template 작성과 설정 (0) | 2022.12.17 |
Git - Commit Message Convention 커밋 메시지 컨벤션 (0) | 2022.12.15 |