Skip to content

[git] rebase

Jae-Hyeon Kim edited this page Jun 14, 2024 · 1 revision

rebase는 다른 브랜치의 커밋 시퀀스를 현재 브랜치로 이동하는 작업이다.

예시로 알아보자.

현재 작업중이 두개의 브랜치가 있다.

  • feature/add-test-code : 테스트 코드를 추가하는 브랜치
  • feature/modify-custom-userdetails : 테스트코드를 추가하다, UserDetails 쪽 코드를 수정해야 해서 만든 브랜치
스크린샷 2024-06-14 10 34 58

feature/modify-custom-userdetails 에서 작업을 마치고, 원래 브랜치인 feature/add-test-code 로 PR을 넣었다.

그리고 머지 직전에 테스트 코드를 추가하는 작업을 진행했고, 이는 새로 변경된 브랜치인 feature/modify-custom-userdetails 에서 진행해야 했다.

새로 추가한 테스트코드 추가 작업은 나중에 feature/add-test-code 로 옮기기 위해 feature/add-test-code-tmp 브랜치로 따로 기록을 해두었다.

스크린샷 2024-06-14 10 36 58

이제 PR이 approve 되고, feature/add-test-code 브랜치와 feature/modify-custom-userdetails 브랜치가 머지되면 다음과 같은 상황이 된다.

스크린샷 2024-06-14 10 31 14

이제 머지되기전 브랜치인 feature/modify-custom-userdetails 에서 작업한 내용을 현재 브랜치인 feature/add-test-code 로 옮겨야 한다.

스크린샷 2024-06-14 10 38 38

https://www.atlassian.com/ko/git/tutorials/rewriting-history/git-rebase

이러한 그림이 된다.

즉 다른 브랜치에서 수행한 커밋 시퀀스를 현재 브랜치로 옮기는 작업이다.

git rebase 사용

다른 브랜치(feature/add-test-code-tmp) 에서 수행한 작업을 현재 브랜치 (feature/add-test-code) 로 옮겨보자.

커밋을 옮길 브랜치로 이동한다.

git checkout feature/add-test-code-tmp

rebase 를 수행한다.

git rebase feature/add-test-code

rebase 가 성공적으로 수행되면 feature/add-test-code 의 마지막 커밋 뒤에 새로운 커밋이 생성된다.

스크린샷 2024-06-14 10 45 21

feature/add-test-code 브랜치로 이동해 fast-forward 머지를 수행해준다.

git checkout feature/add-test-code
git merge feature/add-test-code-tmp

필요에 따라 불필요한 브랜치는 제거한다.

git branch -d feature/add-test-code-tmp
스크린샷 2024-06-14 10 49 16

지저분한 머지 없이 깔끔하게 반영된 모습이다.

언제 써야하는가

나는 보통 rebase를 새로운 브랜치에서 기능을 추가하고, 원본 브랜치에 반영되기 전 원본 브랜치에서 추가해야할 작업이 있을때 새로운 브랜치에서 작업을 수행하고 나중에 rebase로 붙이는 방식으로 사용한다.

즉 위의 상황에서 사용한다.

새로운 브랜치가 원본 브랜치로 머지되기 전, 원본 브랜치에서 진행해야할 작업이 있을때 우선 새로운 브랜치에서 새로운 브랜치를 파 수행하고 (보통 구분을 위해 이름 뒤에 tmp 를 붙임) 나중에 새로운 브랜치가 머지된다면, 원본 브랜치에서 rebase 를 수행한다.

장점

rebase는 커밋 기록을 깔끔하게 관리할 수 있다.

만약 위의 상황에서 merge를 해도 동일하게 동작하지만, 지저분한 브랜치 그래프가 만들어지게 된다.

나중에 의도를 파악하기도 힘들고, 알아보기도 힘들다.

이럴때 rebase를 사용한다면 깔끔하게 작업을 수행할 수 있다.

단점

항상 장점만 있는것은 아니다. rebase자체가 베이스를 옮기는 것이기 때문에 만약 이전 베이스에서 나를 제외한 다른 사람이 작업을 진행했다면, 좀 복잡해질 수 있다.

Clone this wiki locally