• rebase는 "re" + "base" 로 재배치 하는 것이다.
• merge와 비슷한 개념이지만 commit history 결과 차이가 있다.
rebase가 commit history 깔끔하게 정리해주는 편이다.
• rebase는 commit 이력을 변경할 수 있기에
다른 사람이 pull 받아서 사용하고 있다면 곤란해질 수 있다.
• 다른 브랜치에서 특정 commit 만을 가져오는 것에서
cherry-pick을 활용해 볼 수 있다.
• 이전 commit 수정하는 방법으로 -i 옵션을 활용할 수 있다.
merge 명령을 통해 C3, C4와 공통 조상 C2을 사용하는
3-way merge로 새로운 commit (C5)을 만들어 낼 수 있다.
rebase 명령으로 한 브랜치에서 변경된 사항을 다른 브랜치에 적용할 수 있다.
C3에서 변경된 사항을 Patch로 만들고 이를 다시 C4에 적용시키는 방법이다.
두 브랜치가 나뉘기 전 공통 commit으로 이동하고 나서
그 commit부터 지금 checkout 한 브랜치가 가리키는 commit까지 diff를 차례로 만들어
어딘가에 임시로 저장해 놓는다. → Patch
Rebase 할 브랜치(experiment)가 합칠 브랜치(master)가 가리키는 commit을 가리키게 하고
아까 저장해 놓았던 변경사항을 차례대로 적용한다.
그리고 나서 master 브랜치를 Fast-forward 시킨다.
C4' commit 결과는 Merge 방식의 C5와 같은 결과를 가진다.
rebase와 merge는 커밋을 합치는 것에는 큰 차이가 없다.
하지만 rebase가 보다 깔끔한 commit history를 보인다.
git log로 보면 작업을 병렬로 진행하여도 rebase 이후
모든 작업이 차례대로 수행된 것처럼 보인다.
• rebase 브랜치의 변경사항을 순서대로 다른 브랜치에 적용하면서 합친다.
• merge 두 브랜치의 최종 결과만을 가지고 합친다
rebase는 브랜치를 합치는 것 외에도 다른 목적으로도 사용할 수 있다.
공통조상 C3 기준으로 server와 client 브랜치가 나뉘었다.
이때 아직 검증하지못한 server 브랜치는 그대로 두고
client 브랜치만 master로 합치고자 한다.
server 브랜치와 관련없는 커밋 C8, C9만
master 브랜치에 적용하기 위해 --onto 옵션 사용
master 브랜치부터 server 브랜치와 client 브랜치의 공통 조상 commit(C3)까지
client 브랜치에서 없애고 싶을 때 사용한다.
client 브랜치에서만 변경된 패치를 만들어
master 브랜치에서 client 브랜치 기반으로 새로 만들어 적용한다.
이제 master 브랜치로 돌아가서 fast-forward 시킬 수 있다.
server 브랜치 구현/검증이 끝났다면
checkout 하지 않고 바로 rebase 할 수도 있다.
$ git rebase {base 브랜치명} {topic 브랜치명}
그리고 master 브랜치를 fast-forward 시키면 된다.
이제 client와 server 브랜치는 삭제해도 된다.
브랜치를 삭제해도 commit history는 여전히 남아 있긴 한다.
rebase 명령어로 쌓여지는 commit은 기존 commit hash와 다르다.
내용은 같더라도 hash 값이 기존과 다른 새로운 commit 인 것이다.
C4와 C4'의 적용 내용은 같더라도 서로 다른 commit 이다.
혼자 작업하고 있다면 상관없지만
다른 사람이 rebase 하기전 commit을 가지고 작업하고 있다면
동일한 내용의 commit이 2개로 보이는 등
혼란을 야기할 수 있으니 유의해야 한다.
'Git' 카테고리의 다른 글
[Git 깃] git reset (0) | 2022.07.29 |
---|---|
[Git 깃] git rebase 위험성 (0) | 2022.05.22 |
[Git 깃] git config (0) | 2022.05.11 |
[Git 깃] git cherry-pick (0) | 2022.05.08 |
[Git] UI Application vs Terminal (0) | 2021.04.15 |
댓글