우매함의 봉우리를 넘어서며 개발하면서 기록하기

깃 커밋 수정하기(git commit rebase -i)

수정할 커밋 목표

image 그림과 같은 형태의 깃 그래프가 있다. 이때, css를 수정한 커밋테마의 색을 변경한 커밋을 합치고 깃 블로그의 버전을 올린 커밋을 제일 마지막 커밋으로 남기는 형태의 작업을 해보자.


수정 작업 진행

커밋을 수정하기 위한 방법으로 git rebase -i 명령어를 사용한다. -i 옵션 뒤에는 2가지 형태가 올 수 있다.

  1. 수정할 커밋의 이전 커밋의 깃 해시

    어디서부터 커밋을 수정할지 정했다면 그 커밋의 이전 커밋의 해시에서 앞에 7자리정도 입력한다. 위의 그림에서는 깃 블로그의 버전을 1.0.2로 버전업하라 커밋부터 커밋을 수정할 것이기 때문에 그 이전 커밋인 merge 커밋의 해시인 9c35081을 입력한다.

     git rebase -i 9c35081
    
  2. 헤드부터 수정할 커밋의 개수

    헤드가 가르키고 있는 커밋으로부터 몇 개의 커밋을 수정할 것인지 적어주면 된다. 이때는 HEAD~[숫자]의 형태로 작성하면 되며 [숫자] 자리에 수정할 커밋의 개수를 입력하면 된다. 위의 그림에서는 HEAD~3을 사용하면 된다.

     git rebase -i HEAD~3
    

위의 명령어를 입력한다면 image 그림과 같이 vim 편집기로 들어오게 된다.

먼저 커밋의 순서를 수정하기 위해 제일 위에 있는 커밋에 커서를 두고 dd를 눌러 잘라내기하고 옮기고 싶은 라인 이전 라인으로 커서를 옮겨 p를 누르면 붙여넣기가 된다.

image

커밋의 순서를 변경했다면 이제 테마 색을 변경한 커밋과 css를 수정한 커밋을 합칠 차례인데 커밋을 합치는 방법에는 두가지가 있다. 커밋 아래 적혀있는 커맨드를 잘 읽어보면 image

squash는 이전 커밋으로 현재 커밋을 녹여서 넣는 방식인데 이때, 녹일 현재 커밋의 커밋명을 그대로 가져가는 방식이다. 반면, fixup은 squash와 마찬가지로 현재 커밋을 녹이지만 현재 커밋의 커밋명을 가져가지 않고 없애버린다.

취향이나 상황에 따라 커밋명을 살릴지 없앨지 결정해서 사용하면 된다.

image

이번 포스팅에서는 squash 방식을 사용해보겠다. 커밋 앞에 pick을 squash 혹은 s로 바꿔주어 이 커밋에 squash 커맨드를 적용할 것이라 수정해주자.

모든 것이 완료 되었다면 esc를 누르고 :wq 를 입력해 저장하고 vim을 빠져나온다.

저장을 하게 되면 squash를 하여 커밋을 합치기 위한 vim이 나온다.

image

그림에서도 보면 커밋명이 2개 모두 살아있는 것을 볼 수 있다. 똑같이 저장하고 나오자:wq

모든 작업이 끝났다. 다시 깃 그래프 확인을 해보자.

git log --graph

image

처음 목표한 것과 같이 한개의 커밋안에 테마 색을 변경한 작업과 CSS를 수정한 작업이 합쳐졌고 블로그의 버전을 올린 커밋이 가장 마지막 커밋이 된 것을 확인할 수 있다.


마치며

이와 같은 방법으로 커밋의 순서를 변경하거나 합치고 수정할 수 있다. 이번 포스팅에서는 작성하지 않았지만 edit, drop, reword 등 다른 커맨드 역시 커밋을 수정하는 데 있어 유용한 방법이다. 필요한 곳에 사용할 수 있도록 숙지하면 좋을것 같다.