Git - Rebase

JUGNMIN LEE·2021년 3월 3일
0
post-thumbnail

Git에서 한 브랜치에서 다른 브랜치로 합치는 방법으로는 두 가지가 있다. 하나는 Merge 이고 다른 하나는 Rebase 다. 요번 블로깅은 Rebase가 무엇인지, 어떻게 사용하는지, 좋은 점은 뭔지 알아 본다.

Git Rebase

불필요한 merge commit이 생성된다
모든 feature branch 마다 merge commit 이 남게되어 만약 main 브랜치를 공유하는 개발자가 많고 프로젝트 규모가 크다면 history가 지저분해지기 쉬워진다.

복잡한 프로젝트 history
독립된 브랜치에서 로직 하나를 작성하고 수정하더라도, 다른 작업과 그 내역이 겹쳐 구분하기 어려워진다 이런 상황을 프로젝트의 history가 복잡하다고 표현하기도 한다.

이러한 단점들을 Rebase가 보완해준다
merge commit이 안생기며 같은 작업을 진행한 commit끼리 모여진다.

rebase는 내 commit의 base를 변경하여 commit history를 바꾼다

conflict는 commit과 commit 사이에서 일어나는 작업 내용 사이의 충돌이므로, 다른 브랜치가 메인에 머지했던 커밋 이력들과 함께 한번에 충돌 날 가능성이 있다.

브랜치에서 작업할때 커밋하는데 리베이스 전에는 커밋의 개수는 상관없다 하지만 브랜치마다 커밋을 2개 ~ 3개씩 maximum을 잡고 rebase를 해야한다


rebase 진행 방법




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

  1. Main branch로 이동하여 remote main을 pull 받는다.
  2. 내가 push 할 Feature branch 로 이동한다.
  3. git rebase -i main 를 진행한다
  4. 그러면 새로운 에디터가 나타난다

Rebase 하는 동안 squash 진행할 때에는?

  1. 가장 오래된 commit을 pick 한다.
  2. 다른 커밋 메세지는 가장 오래된 commit을 기준으로 squash 한다.
    (오래된 커밋에게 앞에 pick을 냅두고 그 이후에 commit은 앞에 s를 남긴다)
  3. 다른 커밋의 작업 내역이 없어지는 것이 아니다.
  4. esc -> :wq! 로 창에서 빠져나온다.
    (무조건 저장하고 창을 끄면 된다)

수정용 에디터가 하나 더 나타날때에는 ?

  1. 최종적으로 이 rebase된 커밋의 내용을 작성하는 부분이다.
  2. 현재까지 적은 커밋 메세지가 전부 나타난다.
  3. 불필요한 내용을 제거하고 현재 수정 내역에 대한 커밋 메세지를 정성껏 작성한다.
    (최종적으로 남는 commit 이기 때문에 해당 커밋이 무엇을 의미하는지 정확히 남겨야한다)
  4. esc -> :wq! 로 창에서 빠져나온다.
    (무조건 저장하고 창을 끄면 된다)

성공적으로 rebased가 되면?

  1. 성공했다면 git log 명령어 로 깔끔해진 커밋 메세지가 확인된다.
    (새로운 해쉬를 가지게 된다)

Rebase 후 push 할때 ?

  1. Rebase는 commit history 를 정리하는 역할을 한다
  2. 같은 브랜치에서 Rebase를 할 때마다 history가 달라질 수 있다.
  3. 수정 사항이 추가로 생긴 후 다시 rebase 하면 history가 무조건 달라진다.
  4. git은 history가 다른 branch의 push를 허용하지 않는다.
  5. 'git push origin feature/login -f' 와 같이 -f 옵션을 사용해서 force push를 진행한다
    (최초 push할 때는 필요없고 이미 해당 브랜치에 PR이 올라가 있을때에 사용한다.)

Rebase 중 충돌 해결할때?

  1. 충돌이 일어나면 진행되지도 않고 끝나지도 않고 멈춰있을때 당황하지말자
  2. 터미널이 (rebase ~ 1/6)과 같은 메세지로 rebase가 진행중임을 알려준다.
  3. 충돌을 수정한 후
  4. git add .
  5. git commit은 하지 말자 수정 사항이 없으니
  6. git rebase --continue를 진행한다
  7. 멈춰 있던 리베이스가 진행된다.
  8. 충돌이 여러번 나면 그때마다 충돌을 해결하고
    git add . / git rebase --continue를 반복하자
  9. 계속 해결이 안된다면, git rebase --abort를 진행하여 rebase를 진행하기 전 상황으로 돌아갈 수도 있다.
    (rebase를 끝났는데 예전으로 돌아가고 싶을때 git reflog를 하면 된다)

rebase 됬는지 안됬는지 확인하려면
방금 내가 커밋한게 메인에서 가장 최근 커밋 뒤에 붙어 있으면 정상적으로 rebase가 된거다

ps. 요약하면 무조건 커밋 2~3개당 1rebase 진행하며 지속적으로 git log를 찍어보는 습관이 중요하다.

profile
Frontend Developer

0개의 댓글