1 minute read

Rebase

  • Git에서 한 브랜치에서 다른 브랜치로 합치는 방법으로는 두 가지가 있다.
  • 하나는 Merge 다른 하나는 Rebase이다.

왜 Merge가 아닌 Rebase를 사용해야 하는가?

Git Merge problems

  • 불필요한 merge commit 생성
  • 모든 feature branch마다 “merge commit”이 남는다. 만약 main 브랜치를 공유하는 개발자가 많고, 프로젝트의 규모가 크다면, branch history가 지저분해지기 쉽다.
  • 복잡한 프로젝트 history
  • 독립된 브랜치에서 로직 하나를 작성하고 수정하더라도, 다른 작업과 그 내영기 겹쳐 구분하기 어려워진다. 이런 상황을 프로젝트의 history가 복잡하다고 표현한다.

Git Rebase

  • 불필요한 merge commit 제거
  • 같은 작업을 진행한 commit끼리 모으기
  • Git history가 상당히 깔끔해진다

Rebase 하는 방법

1. 새로운 작업을 모두 마치고 push 하기전에는

1-1 Main branch로 이동하여 remote main을 pull받는다. 1-2 내가 push할 Feature branch 로 이동한다. 1-3 ‘git rebase -i main’를 진행한다.

2. Rebase 하는 동안 squash 진행할 때에는

2-1 가장 오래된 commit을 pick한다 2-2 다른 커밋 메세지는 가장 오래된 commit을 기준으로 squash 한다. 2-3 다른 커밋의 작업 내역이 없어지는 것이 아니다. 2-4 Esc -> :wq! 로 창에서 빠져나온다.

3. 수정용 에디터가 하나 더 나타난다.

3-1 최종적으로 이 rebase된 커밋의 내용을 작성하는 부분. 3-2 현재까지 적은 커밋 메세지가 전부 나타난다. 3-3 불필요한 내용을 제거하고 현재 수정 내역에 대한 커밋 메세지를 정성껏 작성한다. 3-4 Esc -> :wq! 저장하고 에디터에서 빠져나온다

4. Rebase중 충돌 해결하기

4-1 충돌이 일어난 경우 Rebase가 진행되지도, 끝나지도 않고 도중에 멈춰 있어, 매우 당혹스럽다. 4-2 터미널이 (rebase ~ 1/6)과 같은 메세지로 rebase가 진행중임을 알려주니 겁먹지 않도록 하자. 4-3 충돌은 충돌일 뿐, 해당하는 코드를 수정 후 4-4 Git add . 4-5 ✅✅ Git commit은 하지 않는다. 수정 사항이 없으니깐 4-6 Git rebase –continue를 진행한다. 4-7 멈춰 있던 리베이스가 진행된다 4-8 충돌이 여러번 나면 그 때마다 충돌을 해결하고 git add ./ git rebase –continue를 반복한다. 4-9 계속 해결이 안된다면, git rebase –abort로 아예 rebase를 진행하기 전 상황으로 돌아갈 수도 있다.

5. Rebase 후 push 하기

5-1 Rebase는 commit history를 정리하는 역할을 한다. 5-2 같은 브랜치에서 Rebase를 할 때마다 history가 달라질 수 있다. 5-3 수정 사항이 추가로 생긴 후 다시 rebase하면 history가 무조건 달라진다. 5-4 git은 history가 다른 branch의 push를 허용하지 않는다. 5-5 ‘git push origin feature/login -f’ -f 옵션을 사용하여 force push를 진행한다.