brunch

매거진 개발노트

You can make anything
by writing

C.S.Lewis

by April Mar 07. 2021

Git 커밋 합칠 때 필요한 vim 단축키

git  커밋을 합칠 때 반드시 알아두어야 하는 필수 vim 단축키

Git 을 사용하다보면 작성한 커밋들을 합쳐야 하는 경우가 있다. 특히 Jira를 기반으로 Jira 와 동일하게 하나의 커밋만 작성하는 경우 혹은 master 브랜치에 커밋 히스토리를 재구성하는 경우 등 커밋 히스토리를 수정해야하는 상황을 마주하게 된다.


Git 커밋을 수정하려면 git rebase -i HEAD~{수정할 커밋 수} 명령어를 실행해야 한다. 이 명령어를 실행해 편집 모드에 진입하게 되면 기본으로 설정된 에디터가 뜬다. (나는 주로 맥과 리눅스를 사용해서 기본으로 설정된 vim 에디터를 사용했다. 윈도우 사용자는 다를 수 있다.)


이렇게 편집 모드에 진입하고, git 커밋을 합치려고 할 때 두 가지 경우가 있을 수 있다.

위/아래 커밋을 하나로 합치는 경우

합치려는 커밋이 바로 위에 없는 경우


 


Case1) 위/아래 커밋을 하나로 합치는 경우



1. 명령어

 git rebase -i HEAD~{수정할 커밋 수}

git rebase 명령어를 이용해 현재 HEAD 에서 커밋을 합칠 곳까지의 위치를 정해준다.


2. Pick, Squash

항상 최신 커밋에 이전 커밋을 합치는 것이므로 에디터 상위에 있는 커밋은 pick 으로 남겨두고, 이전에 커밋한 커밋메시지를 squash(또는 s) 해준다. 이 때, squash 명령어를 입력하기 위해서 에디터를 insert 모드로 변경하고, 저장 후 종료해주어야 한다.


1) 에디터 Insert 모드

i

에디터에서 i 를 입력한다.


2) 저장 후 종료

:wq!

수정 후 ESC 버튼을 눌러 Insert 모드를 종료하고 위의 명령어를 입력해 저장 후 해당 편집을 종료한다.


3. 메시지 편집

메시지 편집에서 필요한 커밋 메시지 하나만 남긴다. 이 때, 인서트 모드로 들어가 필요없는 메시지를 삭제할 수도 있지만 vim 에서는 한 줄 삭제 명령어를 제공하고 있다.


1) 한 줄 삭제

dd

한 줄 삭제 명령어는 Nomal Mode 에서 진행해야 한다.


2) 저장 후 종료

:wq!

2-2) 에서 한 것과 동일하게 저장 후 종료를 한다.


 


Case2) 합치려는 커밋이 바로 위에 없는 경우



1. 명령어

 git rebase -i HEAD~{수정할 커밋 수}

git rebase 명령어를 이용해 현재 HEAD 에서 커밋을 합칠 곳까지의 위치를 정해준다.


2. 합칠 커밋 위치 이동 후 Pick, Squash

커밋을 합치기 위해 합칠 커밋의 위치를 이동시키고, squash를 해준다. 3번 예제를 보면 dcqef4f 커밋이 4975f27 커밋의 아래로 이동했음을 알 수 있다. 


1) 한 줄 복사

yy

Normal Mode에서 커서를 dcqef4f 커밋으로 이동시키고 위의 명령어를 입력해 한 줄을 복사한다.


2) 붙여넣기

-p

4975f27 커밋의 아래에 위의 명령어를 입력해 1) 에서 복사한 커밋을 붙여넣는다.


3) 한 줄 삭제

dd

다시 원래 커밋이 있던 곳으로 커서를 이동시켜 위의 명령어를 입력해 한 줄을 삭제한다.


만약 N줄 복사/삭제를 하고 싶다면 nyy/ndd 해주면 된다.
2줄 복사 및 삭제 =>  2yy/2dd


4) 수정 및 저장 후 종료

항상 최신 커밋에 이전 커밋을 합치는 것이므로 에디터 상위에 있는 커밋은 pick 으로 남겨두고, 이전에 커밋한 커밋메시지를 squash(또는 s) 해준다. 이 때, squash 명령어를 입력하기 위해서 에디터를 insert 모드로 변경하고, 저장 후 종료해주어야 한다.


3. 메시지 편집

위에서 했던 것과 동일하게 메시지를 편집하고 rebase 를 종료하면 된다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari