!주의: 해당 옵션을 이용하려면 먼저 원격 저장소를 망가뜨리는 상황을 피하기 위해 주의해야 할 점을 확인해주세요
--interactive는 많은 명령에서 공유하고 있는 옵션입니다. add, reset, rebase 등등에서 이용할 수 있으며, 사실 다른 주제에서 다루었던 --patch도 --interative옵션의 하위 옵션 중 하나죠.
기능이 많기 때문에 git은 --interative를 위한 별도의 인터페이스까지 제공합니다. 대부분 공통적으로 사용하는 부분은 사실 Pro Git의 Git 도구 - 대화형 명령파트를 참고하는 것이 더 좋을 것 같습니다.
본문에서 취급하는 범위는 git rebase의 --interactive옵션 중에서도 단일 브랜치 내의 히스토리를 수정하는 것으로 한정하겠습니다.
rebase의 기본 동작은 기존 커밋들의 복사본을 작성해서 rebase대상 브랜치에 적용하는 것입니다. 때문에 일반적으로는 다른 브랜치와 3-way merge하는 대신 히스토리를 좀 더 깔끔하게 다듬어서 push하고 싶을 때 주로 사용합니다.
하지만 rebase는 하나의 브랜치에서 다수의 커밋 히스토리를 변경할 때도 사용할 수 있습니다.
!주의: rebase명령을 사용하면 아무런 변경점이 없어도(전부 pick인 상태로 진행해도) 커밋의 해시값이 변경됩니다. rebase지정한 커밋이 모두 복사본으로 반환되기 때문입니다. 거듭 강조하지만 이미 push한 커밋에는 적용하지 마세요
git rebase -i HEAD~2
rebase의 interative인터페이스입니다. 각각의 주석으로 설명되어있습니다.
!주의: 최신 커밋일수록 하단에 표시됩니다. 가장 오래된 커밋이 최상단에 있습니다.
여기에서 0e05e23커밋의 메세지를 바꿔보겠습니다.
/* 0e05e23커밋의 pick을 r 또는 reword로 수정하고 저장, 종료합니다. */
pick 1e8dafa why pull?
pick 8e80114 meadnign
reword 0e05e23 does fetch meaning?
이제 다시 지정한 편집기로 커밋 메세지 편집창이 뜰 겁니다. 커밋 메세지를 편집하고 저장 후 종료합니다.
충돌이 발생했다면 git status명령을 사용했을 때 다음과 같은 화면이 표시될겁니다.
git rebase에는 다른 여러 옵션도 있습니다. --abort같은 경우 rebase를 중단하고 명령을 내리기 이전 상태로 돌아갑니다.
rebase가 완료되면 git log나 사용중인 툴을 통해 히스토리가 변경된 것을 확인할 수 있습니다.