티스토리 뷰

💻/Git

[Git] Interactive Rebase

eungding 2024. 5. 25. 18:33
728x90
반응형

Git의 rebase --interactive  (또는 간단히 rebase -i) 기능은

브랜치의 커밋 히스토리를 재정렬하거나 수정할 수 있는 강력한 도구입니다. 

이를 통해 커밋을 수정, 삭제, 합치기, 분할하거나 순서를 바꿀 수 있습니다. 

 

주요 명령어는 6가지

 

  • pick: 커밋을 그대로 유지합니다.
  • reword:  커밋 메시지를 수정합니다.
  • edit:  커밋을 수정합니다. 이를 선택하면 해당 커밋에서 작업을 멈추고 수정할 수 있습니다.
  • squash: 이전 커밋과 합칩니다. 두 커밋의 메시지를 병합할 수 있습니다.
  • fixup:  이전 커밋과 합치되, 커밋 메시지는 유지하지 않습니다.
  • drop:  커밋을 삭제합니다

 

[ Fork ]

GUI 툴인  Fork 로 실습을 해보겠습니다.

pick 은 유지이기 때문에 실습에서 제외하겠습니다. 

 

 

 

 

Rebase 는 원하는 커밋의 이전 커밋 (parent) 을 지정해서 하는데,

포크는 원하는 커밋을 선택하면 알아서 이전 커밋으로 위치 지정을 해주는 단축메뉴를 제공합니다.  

 

 

 

위처럼 단축메뉴 사용해도 되고

원칙적으로 이전  커밋 눌러서 Interative Rebase 눌러줘도 동일합니다. 

 

 

 

 

 

[1] fixup > 커밋 흡수시키기 

 

상황)

뉴진스앱 만든다고 해보자. 

공통으로 쓰는 MemberView 를 추가하고 MinjiView 를 추가했다. 

근데 MemberView 의 폰트변경이 필요해서 추가커밋했다. 

 

 

폰트변경 히스토리를 리뷰어가 알 필요가 없다.

'MebmerView 추가 커밋' (f20918a) 으로  'MemberView 의 폰트변경 커밋' (dbb37a2) 을 넣어버리자.

 

수정할 커밋 바로 아래의 커밋을 기준으로

Interactive Rebase 를 누른다.

 

 

 

Fixup 은 Previous 커밋에만 가능하기 때문에 

 

 

 

커밋을 아래로 이동시켜주고 (드래그드랍)

 

 

 

Fixup 을 선택해준다. 

 

 

Rebase 버튼 눌러주면 원하는 커밋 히스토리로 잘바뀐 것을 볼 수 있다. 

커밋 ID는 바뀌고 메타 정보 (시간) 은 남아있다. 

 

그 위의 커밋도 다시 쌓아주는 셈이라서 ID가 같이 바뀌지만 메타 정보는 그대로다. 

(아래 실습하는 다른 명령어들도 모두 동일하게 위의 커밋 ID들이 다 바뀐다.) 

 

 

 

 

 

[2] squash > 커밋 합치기

 

상황)  padding 커밋 여러개를 하나로 합치고 싶다. 

 

 

 

바로 아래 커밋에서 Interactive Rebase 를 선택해주고 

 

 

 

스쿼시도 떨어져있는 커밋은 안되기 때문에

trailing padding 커밋의 위치를 이동해주고 3개 squash, 가장 밑은 reword 를 선택해서 통합 커밋 메세지를 작성해준다.

 

(참고로 fixup과 다르게 commit description 에 합친 커밋 메세지들이 쭉 나오는데 저는 지운 것임!) 

 

 

 

깔끔하게 하나로 잘 합쳐짐! 

 

 

 

 

 

[3] Drop > 커밋 삭제 

 

상황)

중간에 있는 커밋을 제거하고 싶다. 

 

 

Interative Rebase 창 열어주고 Drop 누르면 

 

 

잘 지워짐. 

 

 

 

 

 

[4.1] edit  >  커밋 작업내용 바꾸기 

 

상황) MemberView 커밋이 중간에 있다. 해당 커밋의 작업내용을 바꾸고 싶다! 

 

Interative Rebase 창 열어주고 Edit 누르면 

 

 

 

작업내용, 커밋메시지를 다 변경할 수 있도록 나온다.

 

 

 

여기서 Circle 을 Rectangle 로 바꾸고

Amend Last Commit > Continue Rebase 를 눌러주면 

 

 

 

 

아무일 없었다는 듯이 중간 커밋의 작업내용이 잘 바뀌었다.

 

 

 

 

[4.2] Edit  > 커밋 쪼개기

 

상황) 마음을 바꿔서 padding 커밋을 horizontal, veritcal 로 나누고 싶다

 

 

Interative Rebase 창 열어주고 Edit 누르고

 

 

 

첫번째 커밋은 vertical 로 커밋메시지 바꾸고 ammend commit

두번째 커밋은 horizontal 로 커밋메세지 해주고 commit  (amend 선택하면 이전 vertical 수정사항까지 다 나와서 안눌러줌!) 

 

 

 

 

 

Continue Rebase 해주면 

커밋 잘 나눠진 것을 볼 수 있음. 

 

 

 

 

[5] Reword  > 커밋 메세지 변경하기 

 

상황)

커밋 메세지에 오타있어서 수정하고 싶음 

 

 

 

 

 

 

 

 

 

 

 

[ 정리 잘된 블로그 ]

 

https://wormwlrm.github.io/2020/09/03/Git-rebase-with-interactive-option.html#edit

 

Git Rebase --Interactive 옵션 알아보기 - 재그지그의 개발 블로그

대화형으로 Git 커밋 히스토리를 수정할 수 있게 해주는 Interactive 옵션에 대해 알아봅니다.

wormwlrm.github.io

 

 

반응형
댓글