-
Notifications
You must be signed in to change notification settings - Fork 1
[git] rebase
rebase는 다른 브랜치의 커밋 시퀀스를 현재 브랜치로 이동하는 작업이다.
예시로 알아보자.
현재 작업중이 두개의 브랜치가 있다.
-
feature/add-test-code
: 테스트 코드를 추가하는 브랜치 -
feature/modify-custom-userdetails
: 테스트코드를 추가하다, UserDetails 쪽 코드를 수정해야 해서 만든 브랜치
feature/modify-custom-userdetails
에서 작업을 마치고, 원래 브랜치인 feature/add-test-code
로 PR을 넣었다.
그리고 머지 직전에 테스트 코드를 추가하는 작업을 진행했고, 이는 새로 변경된 브랜치인 feature/modify-custom-userdetails
에서 진행해야 했다.
새로 추가한 테스트코드 추가 작업은 나중에 feature/add-test-code
로 옮기기 위해 feature/add-test-code-tmp
브랜치로 따로 기록을 해두었다.
이제 PR이 approve 되고, feature/add-test-code
브랜치와 feature/modify-custom-userdetails
브랜치가 머지되면 다음과 같은 상황이 된다.
이제 머지되기전 브랜치인 feature/modify-custom-userdetails
에서 작업한 내용을 현재 브랜치인 feature/add-test-code
로 옮겨야 한다.
https://www.atlassian.com/ko/git/tutorials/rewriting-history/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
의 마지막 커밋 뒤에 새로운 커밋이 생성된다.
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
지저분한 머지 없이 깔끔하게 반영된 모습이다.
나는 보통 rebase를 새로운 브랜치에서 기능을 추가하고, 원본 브랜치에 반영되기 전 원본 브랜치에서 추가해야할 작업이 있을때 새로운 브랜치에서 작업을 수행하고 나중에 rebase로 붙이는 방식으로 사용한다.
즉 위의 상황에서 사용한다.
새로운 브랜치가 원본 브랜치로 머지되기 전, 원본 브랜치에서 진행해야할 작업이 있을때 우선 새로운 브랜치에서 새로운 브랜치를 파 수행하고 (보통 구분을 위해 이름 뒤에 tmp
를 붙임) 나중에 새로운 브랜치가 머지된다면, 원본 브랜치에서 rebase 를 수행한다.
rebase는 커밋 기록을 깔끔하게 관리할 수 있다.
만약 위의 상황에서 merge를 해도 동일하게 동작하지만, 지저분한 브랜치 그래프가 만들어지게 된다.
나중에 의도를 파악하기도 힘들고, 알아보기도 힘들다.
이럴때 rebase를 사용한다면 깔끔하게 작업을 수행할 수 있다.
항상 장점만 있는것은 아니다. rebase자체가 베이스를 옮기는 것이기 때문에 만약 이전 베이스에서 나를 제외한 다른 사람이 작업을 진행했다면, 좀 복잡해질 수 있다.