interactive rebase
인터렉티브 리베이스가 의미하는 뜻은 rebase 명령어를 사용할 때 -i 옵션을 같이 사용한다는 것입니다.
이 옵션을 추가하면, git은 리베이스의 목적지가 되는 곳 아래에 복사될 커밋들을 보여주는 UI를 띄울것 입니다.
각 커밋을 구분할 수 있는 각각의 해시들과 메시지도 보여줍니다.
이를 통해 3가지를 할 수 있습니다:
- 적용할 커밋들의 순서를 바꿀수 있습니다
- 원하지 않는 커밋들을 뺄 수 있습니다. 이것은 pick을 이용해 지정할 수 있습니다
- 마지막으로, 커밋을 스쿼시(squash)할 수 있습니다.
보시는 것처럼 우리는 여러개의 버전을 만들었습니다.
버전을 만들고 보니 과거의 만든 버전이 마음에 안드는 경우가 생깁니다.
예를 들어,
- 커밋 1과 2를 바꾸고 싶다!
- 1과 2를 합치고 싶다!
- 2를 없애서 타임라인에서 삭제하고 싶다!
- 2번에서의 변경사항이 3번에서도 4번에서도 코드 상에 보이지 않게 하고싶다!
이와 같은 경우 사용할 수 있습니다. 명령어는 아래와 같습니다.
git rebase -i HEAD~{number} # head부터 number만큼 조작
or
git rebase -i {hash} # hash 다음 커밋부터 head까지 조작
1번 커밋 이후부터 head까지 조작하기 위해 git rebase -i 249b7fd를 입력해 보았습니다.
그 결과, 이와 같이 interactive rebase를 통해서 각각의 버전을 조작할 수 있는 화면이 출력 됩니다.
1.두 커밋의 순서를 바꾸고 싶다! 특정 커밋을 삭제하고 싶다!
💡 pick
p,pick <commit> = use commit
해당 커밋을 수정하지 않고 그냥 사용하겠다 라는 명령어입니다. 디폴트로 실행되는 명령어이므로 vim에서 내용을 편집하지 않고 종료한다면 아무런 변경 사항 없이 리베이스가 종료됩니다.
순서를 변경해서 저장하면 커밋의 순서가 변경되고, 해당 커밋이 포함된 라인을 지운 후, vim을 종료하면 간단하게 커밋이 삭제됩니다.
위치를 바꿔주고 저장하면,
이와 같이 순서가 변경된 상태가 됩니다.
rebase를 통해 커밋을 수정하게 되면 수정한 커밋 이후에 등장하는 모든 커밋의 hash가 모두 달라집니다.
설명을 위해, 변경되기 이전의 버전을 head(main)가 가리키게 해서 이전 상태로 돌리도록 하겠습니다.
git reset --hard 00750fc # rebase 이전 main branch가 작업중이던 커밋
2. 커밋을 병합하고 싶다!
💡 squash, fixup
squash와 s, fixup과 f는 해당 커밋을 이전 커밋과 합치는 명령어입니다. squash 는 각 커밋들의 메시지가 합쳐지는 반면, fixup 은 이전의 커밋 메시지만 남기는 차이점이 있습니다.
이 경우에는 스쿼시한 3번커밋과 2번 커밋이 하나의 커밋으로 합쳐지게 됩니다.
저장을 하면, 커밋 메세지가 뜨고 원하는 데로 새로 작성해 주면 됩니다.
그 결과 2와 3이 합쳐져서 2&3 이 된 것을 확인 하실 수 있습니다.
3.커밋의 내용과 메세지를 바꾸고 싶다!
💡 edit
e, edit <commit> = use commit, but stop for amending
커밋의 명령어 뿐만 아니라 작업 내용도 수정할 수 있게 하는 명령어
edit을 하겠다고 git에게 알려준 후 작업창을 나오게 되면, 3번 버전에서 작업이 일시적으로 멈추게 됩니다.
그럼 이제 작업중인 파일에 해당 커밋에 반영할 내용을 수정해 줍니다.
이후, 작업한 파일을 스테이지에 add 시켜주고
git commit --amend 명령어를 입력해서 커밋 메세지를 수정해줍니다.
이후 git rebase --continue 를 수행해주면 작업이 완료됩니다.
오늘은 잘 알려지지 않은 명령어인 interactive rebase에 대해 알아 보았습니다!
아래는 git의 여러가지 명령어를 실습 할 수 있는 사이트 입니다.
명령어를 입력하면 애니메이션으로 보여줘서 이해하기 쉽습니다.
Learn Git Branching
An interactive Git visualization tool to educate and challenge!
learngitbranching.js.org
참고
'git' 카테고리의 다른 글
Git : cherry-pick (1) | 2024.01.07 |
---|