Git Rebase 를 활용해 커밋 내용을 조작해보자 👻

Murjune·2024년 5월 5일
4

Git

목록 보기
1/2
post-thumbnail

보통 rebase 의 경우에는 2개의 브랜치를 합쳐 1개의 브랜치로 만들 때 history를 더 깔끔하게 만들기 위해 merge 대신 자주 사용합니다!

반면에, rebase 의 특수 기능인 interactive mode 를 활용하면 다음과 같은 기능을 수행할 수 있습니다!

1) 커밋의 순서를 바꿀 때
2) 커밋의 내용/이름을 바꿀 때
3) 여러개의 커밋을 하나의 커밋으로 압축시킬 때

1) 커밋 순서 변경하기

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번째 커밋의 순서가 바뀐걸 확인할 수 있습니다! ⭐️


2) 커밋 이름 변경하기

커밋 순서 바꾸는거 조금 어려웠죠..?
이번에는 정말 쉬워요!

개발을 하다보면 특정 커밋의 메세지를 바꾸고 싶을 때가 있을 거에요.

이때도 rebase -i 모드의 reword 기능을 통해 커밋 메세지를 바꿔줄 수 있습니다!

다시 아래 명령어를 기입해줍니다!

git rebase -i HEAD~3

그후 변경하고 싶은 커밋의 모드를 pick -> reword(r도 가능)로 바꿔주면 돼요!

그후 :wq!로 저장해주면 아래와 같이 새로운 창이 나오는데,
변경하고 싶은 메세지를 바꿔준 후 :wq! 를 기입해주면 됩니다!

그러면 아래와 같이 이름이 변경된 것을 확인할 수 있지요 😸


3) 여러 커밋 합치기!

squash 모드를 활용하면 여러 커밋들을 하나의 커밋으로 압축시킬 수도 있어요

다시 아래 명령어를 기입해줍니다!

git rebase -i HEAD~3

그 후, 합치고 싶은 커밋들의 mode를 squash로 바꿔준 후, base가 될 커밋에는 pick 으로 남겨줍니다.

따라서, 적어도 하나는 pick 이여야합니다..!
합쳐질 커밋이 존재해야하니까요

저는 2nd 커밋에 3rd, 4 커밋들을 병합시키겠습니다.

:wq! 로 저장을 하면 다음 창이 뜹니다.

새로운 병합된 커밋의 커밋 메세지를 남겨달라는 창입니다.(기본값 base commit의 커밋메세지)
저는 새로운 커밋메세지는 2nd + 3rd + 4 로 설정해두겠습니다.

그러면, 3개의 커밋이 합쳐진 커밋이 만들어진 것을 확인할 수 있습니다!!


⭐️⭐️⭐️ 주의할 점

이것만 보고 가주세요..!

1) 수정하고 싶은 목록의 마지막 커밋의 부모 커밋으로 해시값으로 넣어줘야 한다.

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를 할 수 있다!

수정하고 마지막 커밋의 부모 커밋의 해시값으로 넣어줘야 한다.

2) interactive 창의 커밋 순서와 git log 의 순서는 반대 방향이다.

  • git log를 GUI로 표현한 사진

  • interactive 창

주의하도록 하자~~!! 이게 은근 헷갈린다

후기

오늘은 실전에서 많이 사용되는 예제를 통해
rebase --interactive 모드를 배워봤습니다..!

squash, reword 말고도 다양한 기능이 있으니 궁금하시면 공식문서를 참고하시면 되겠습니다!

사실 저는 CLI 보다는 깃 크라켄이라는 툴을 즐겨 사용하는데요

깃 크라켄을 활용하면 훨씬 쉽고 직관적으로 rebase -i 모드를 활용할 수 있습니다..!

너무 직관적이지 않나요..? 😸


TMI로 rebase interactive 모드로 깃허브 잔디도 조작할 수 있다.

필자는 옛날에 잔디 조작이 되는지 테스트하다가 방치해두었는데

다음과 같이 동료 개발자들에게 조리돌림 을 당하고 있다.

Reference

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

https://medium.com/@slamflipstrom/a-

https://medium.com/@slamflipstrom/a-beginners-guide-to-squashing-commits-with-git-rebase-8185cf6e62ec

profile
열심히 하겠슴니다:D

1개의 댓글

comment-user-thumbnail
2024년 5월 8일

열심히 하시는 당신은 멋쟁이

답글 달기