Skip to main content

[git rebase] 과거 커밋했던 내용 수정하기


아래와 같은 방법을 이용하게 되면 과거에 잘못 커밋했던 내용을 수정할 수 있다.



1. 커밋 해시 확인

수정하고 싶은 커밋의 바로 직전의 커밋 해시를 복사한다.



2. git rebase --interactive

git rebase --interactive 커밋 해시를 입력한다.

예시

git rebase --interactive 896fd2887bda7eb9533b3bf5144b321aceea5e5c

만약 첫 커밋을 수정하고 싶다면 --root를 입력해준다.

git rebase --interactive --root

3. pick => edit 수정

이후 vi 에디터가 실행되게 되는데, i를 눌러 입력모드로 전환하고, 가장 최상단줄의 pick을 edit로 바꾸고 esc -> :wq를 입력해서 저장하고 빠져나온다.

image



4. 변경하고 싶은 파일 수정

작업 디렉토리에 들어가서 잘못 커밋한 내용들을 바로잡는다.



5. 다시 커밋하기

git status로 변경사항을 한번 확인해주고, git add를 사용하여 변경사항들을 추가해준다.

git status
git add .

이후 git rebase --continue를 입력하면 커밋메세지를 수정할 수 있는 에디터가 뜨는데, esc -> :wq를 입력해서 빠져나오면 수정한 커밋부터 현재의 커밋까지 수정된 내용이 적용된다. (커밋해시값 전부 바뀜)

git rebase --continue

하지만 종종 리베이스 도중에 충돌이 나게되면 에러가 뜨면서 멈추게 되는데, 이때 상태를 파악하면서 git add 또는 git rm 을 이용하여 충돌을 해결한뒤 다시 리베이스를 진행하면 된다.

git status
git add 파일1.txt
git rm 파일2.txt
git rebase --continue


6. git push

이제 리베이스를 성공했다면, 깃허브에 푸시하게 되는데, 이때 원격 저장소와 다른 내용이 들어가 있게 되어 충돌이 일어나게된다.

이럴때는 + 를 덧붙이게 되면 강제로 로컬에 있는 자료로 덮어 씌우게 된다.

git push origin +master


7. GIT_COMMITER_DATE 수정하기

rebase를 끝마치고 깃허브에서 커밋 히스토리를 조회하게 되면, 아래 사진과 같이 커밋 날짜별로 분류가 되는게 아니라 당일 날짜로 분류가 되게 된다. (뿐만 아니라 과거 시점에 커밋을 하는 것도 마찬가지로 COMMITER_DATE는 현재가 된다.)

image


이때 아래 코드를 git bash에 입력하고 다시 푸시하면, GIT_AUTHOR_DATE 기준으로 GIT_COMMITER_DATE가 수정되게 된다. (주의: 커밋해시가 전부 변경되게됨)

git filter-branch -f --env-filter \
'if [ "$GIT_AUTHOR_DATE" != "$GIT_COMMITTER_DATE" ]
then
export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
fi'

image