보통 rebase 의 경우에는 2개의 브랜치를 합쳐 1개의 브랜치로 만들 때 history를 더 깔끔하게 만들기 위해 merge 대신 자주 사용합니다!
반면에, rebase
의 특수 기능인 interactive mode
를 활용하면 다음과 같은 기능을 수행할 수 있습니다!
1) 커밋의 순서를 바꿀 때
2) 커밋의 내용/이름을 바꿀 때
3) 여러개의 커밋을 하나의 커밋으로 압축시킬 때
2번 커밋과 3번 커밋의 순서를 바꿔보도록 하겠습니다!
git rebase 에 -i or --interactice 옵션을 추가하여 대화형으로 실행할 수 있습니다. 그리고, rebase할 commit 해시값이나 상대참조값을을 지정하여 어떤 커밋을 rebase할 지 지정해주어야합니다!
git rebase -i HEAD~3
이때 위와 같이 Vi 창이 뜨게 되는데요!
2번과 3번 커밋의 위치를 바꿔줍니다.
1)
dd
명령어를 통해 해당 커밋을 잘라내준 후
2)p
명령어로 붙여넣기를 해주었어요!
그 후, :wq!
통해 저장해주고 나옵니다.
바로 성공할 수도 있지만.. 위와 같이 충돌이 일어나는 경우가 대다수 입니다..
따라서, 충돌을 해결해준 다음 명령어로 rebase를 반영해줍니다.
git rebase --continue (rebase 반영하겠다!)
git rebase --abort (rebase 하기 전으로 되돌아가기)
충돌이 여러 번 난다면 위 과정을 반복해서 수행해주면 됩니다!
깃 충돌 해결 -> git rebase --continue -> 충돌 해결 -> git rebase --continue -> ...
그럼 2번째 커밋과 3번째 커밋의 순서가 바뀐걸 확인할 수 있습니다! ⭐️
커밋 순서 바꾸는거 조금 어려웠죠..?
이번에는 정말 쉬워요!
개발을 하다보면 특정 커밋의 메세지를 바꾸고 싶을 때가 있을 거에요.
이때도 rebase -i 모드의 reword
기능을 통해 커밋 메세지를 바꿔줄 수 있습니다!
다시 아래 명령어를 기입해줍니다!
git rebase -i HEAD~3
그후 변경하고 싶은 커밋의 모드를 pick
-> reword(r도 가능)
로 바꿔주면 돼요!
그후 :wq!로 저장해주면 아래와 같이 새로운 창이 나오는데,
변경하고 싶은 메세지를 바꿔준 후 :wq! 를 기입해주면 됩니다!
그러면 아래와 같이 이름이 변경된 것을 확인할 수 있지요 😸
squash
모드를 활용하면 여러 커밋들을 하나의 커밋으로 압축시킬 수도 있어요
다시 아래 명령어를 기입해줍니다!
git rebase -i HEAD~3
그 후, 합치고 싶은 커밋들의 mode를 squash
로 바꿔준 후, base가 될 커밋에는 pick
으로 남겨줍니다.
따라서, 적어도 하나는 pick 이여야합니다..!
합쳐질 커밋이 존재해야하니까요
저는 2nd 커밋에 3rd, 4 커밋들을 병합시키겠습니다.
:wq! 로 저장을 하면 다음 창이 뜹니다.
새로운 병합된 커밋의 커밋 메세지를 남겨달라는 창입니다.(기본값 base commit의 커밋메세지)
저는 새로운 커밋메세지는 2nd + 3rd + 4
로 설정해두겠습니다.
그러면, 3개의 커밋이 합쳐진 커밋이 만들어진 것을 확인할 수 있습니다!!
이것만 보고 가주세요..!
git rebase -i (변경하고 싶은 commit 목록의 부모 커밋 해시값)
만약 현재 HEAD가 4
를 가리키고, 위 2,3,4
커밋을 변경하고 싶다고 한다고 해보자!
이때, 아래와 같이 HEAD~2 or 2의 커밋해시값을 넣어주면
git rebase -i (HEAD~2 or 2의 커밋해시값)
3, 4
만 인터렉트 창에 보이게 된다.
따라서, HEAD~2 가 아닌 HEAD~3 을 넣거나 first commit
의 해시값을 넣어줘야 내가 원하는 대로 rebase를 할 수 있다!
수정하고 마지막 커밋의 부모 커밋의 해시값으로 넣어줘야 한다.
git log
의 순서는 반대 방향이다.git log를 GUI로 표현한 사진
interactive 창
주의하도록 하자~~!! 이게 은근 헷갈린다
오늘은 실전에서 많이 사용되는 예제를 통해
rebase --interactive 모드를 배워봤습니다..!
squash
, reword
말고도 다양한 기능이 있으니 궁금하시면 공식문서를 참고하시면 되겠습니다!
사실 저는 CLI 보다는 깃 크라켄이라는 툴을 즐겨 사용하는데요
깃 크라켄을 활용하면 훨씬 쉽고 직관적으로 rebase -i 모드를 활용할 수 있습니다..!
너무 직관적이지 않나요..? 😸
TMI로 rebase interactive 모드로 깃허브 잔디도 조작할 수 있다.
필자는 옛날에 잔디 조작이 되는지 테스트하다가 방치해두었는데
다음과 같이 동료 개발자들에게 조리돌림 을 당하고 있다.
https://www.youtube.com/watch?v=ZMoB1SZ4Ceg
https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History
https://shinsunyoung.tistory.com/93
https://wormwlrm.github.io/2020/09/03/Git-rebase-with-interactive-option.html
열심히 하시는 당신은 멋쟁이