Git & Etc

[Git] git rebase 란??

판교너굴맨 2022. 5. 26. 00:12

사내에서 간단하게 git rebase에 대해 설명을 하게 되었습니다.

 

Rebase는 이름 그대로 브랜치의 base를 다시 설정한다는 의미입니다.

위 그림을 보면 feature브랜치에서 a3 커밋을 베이스로 작업을 진행하고 있고, master 브랜치는 이미 상당부분 진행되었습니다.

이때 최신 master 브랜치의 작업 내용을 본인이 현재 작업 중인 feature 브랜치에도 적용하고 싶을 때 Rebase 명령어를 사용합니다. 

 

먼저 최신 master를 pull 받아 옵니다.

# master 브랜치로 이동
git checkout master
# 최신 master 받기
git pull origin master

그리고 feature 브랜치로 이동한 후에 rebase 명령어를 실행합니다.

# feature브랜치로 이동
git checkout feature
# master를 base로 rebase 명령어 실행
git rebase master

 

위 명령어를 실행하면 git log가 아래와 같아집니다.

이렇게 리베이스를 사용하면 커밋 히스토리를 간결하게 유지할 수 있습니다.

git rebase -i

이미 커밋한 히스토리를 수정하거나 삭제하는 등의 작업을 할 수 있는 interactive 옵션이 있습니다.

명령어로는 git rebae -i 커밋 해쉬, HEAD, 브랜치 등을 입력해서 사용할 수 있습니다. gti rebase -i HEAD~4 명령어를 사용합니다. 입력한 커밋의 다음 커밋부터 현재의 커밋 까지 출력 됩니다.

git rebase -i HEAD~4

 

 p, pick :  해당 커밋을 수정하지 않고 그냥 사용하겠다 라는 명령어

  • 텍스트 에디터로 들어오면 커밋에 pick 명령어가 디폴트 값입니다.
  • 커밋의 순서를 바꿀 수 있다.
  • 커밋을 지우면 커밋히스토리에서 커밋이 삭제 된다.

 

 r, reword :  커밋 메세지를 수정하기 위한 명령어

  • git reword 후 저장후 에디터를 닫으면 커밋을 변경할 수 있는 다른 에디터 창이 출력된다.

 

 e, edit :  저장후 종료하면 reword 처럼 커밋 메세지를 수정할 수 있으며, 변경할 커밋으로 checkout되어 작업을 수정하거나 커밋 사이에 커밋을 추가하는 작업을 할 수 있다.

  • 커밋 메세지를 수정하려면 git commit --amend
  • git add와 commit 명령어로 커밋과 커밋 사이에 commit을 만든 후 git rebase --continue로 진행중인 리베이스 과정을 종료한다.

 

 s, squash :  해당 커밋을 이전 커밋과 합치는 명령어이다.

  • 방금 만든 a2.5 커밋앞에 s명령어를 입력하고 저장후 종료하면 a2와 합친다는 에디터 창이 출력된다.
  • git log에서 합쳐진 커밋 메세지를 확인할 수 있다.

 

 f, fixup :  "squash"처럼 작동하지만 이전 커밋 메세지만 남기는 차이가 있다.

 

 e, exec :  리베이스를 저장후 종료할 때 실행할 쉘 명령어를 작성할 수 있습니다.

  • 예를 들어 git log등을 남길 수 있다.

 

 b, break :  해당 라인에서 리베이스를 일시중지 하는 명령어

  • a2와 a3 사이에서 break 명령어를 사용하면 해당 커밋에서 a2에서 일시중지 됩니다. 일시중지된 커밋에서 추가적인 작업이 가능한 것을 확인했습니다.
  • continue 명령어를 사용하면 재개할 수 있다.

 

 d, drop :  해당 커밋을 명시적으로 삭제하는 명령어이다

  • 커밋 리스트에서 지우는 것과 같은 기능이지만 어떤 커밋이 삭제 됐는지 출력 된다.