Git - Rebase와 Merge의 차이

신혜린·2023년 2월 23일
0

wecode42

목록 보기
29/32
post-custom-banner

Merge

머지(병합)은 두 개 이상의 개발 히스토리를 하나로 합치는 작업을 뜻함.

  • 머지를 하게 되면 각각의 개발자가 작업한 히스토리가 모두 보존된다.

Rebase

리베이스는 특정 브랜치의 베이스를 재설정하여 다시 커밋을 적용시켜 커밋 이력을 재정렬하는 작업을 의미한다.

  • 새로운 커밋이 재적용되면 이전 것은 삭제된다는 특성이 있다.
    • 단점 : 리베이스는 히스토리를 재작성하기 때문에 자칫 데이터 손실이 일어나기 쉽다.
    • 장점 : 원치 않는 커밋을 지우거나, 여러 커밋들을 하나로 스쿼시하거나, 커밋 메세지를 업데이트하는 등 개발 히스토리를 깔끔하게 정리할 수 있다.

보통 git-flow 작업에 알맞음. fork해온 프로젝트를 upstream에 맞게 동기화하고자 할 때 주로 사용하는 명령어.
main/master 브랜치에서 리베이스를 실행하게 되면 main/master의 커밋 이력이 변하기 때문에 main/master 브랜치에서 다른 브랜치를 기준으로 리베이스를 실행하는 경우는 지양하는 게 좋음.

Merge vs. Rebase

  • feature 브랜치는 master 브랜치에서 파생된 브랜치
  • feature 브랜치에서 작업을 하던 도중에 누군가 c,d 커밋을 master에 푸시한 상태
  • merge -> master 브랜치를 Pull 받아와서 merge하는 방식

#feature 브랜치에서 실행
git pull -rebase origin master
  • rebase -> feature 브랜치에서 master 브랜치를 기준으로 리베이스를 실행 - 베이스가 B에서 D로 바뀜.

Interactive Rebasing

  • git rebase -i : 리베이스를 실행하기 전 내가 작업 중인 브랜치의 커밋 히스토리를 수정할 수 있게 해주는 명령어

pick: 해당 commit 그대로 유지
reword: 해당 commit의 message 변경
squash: 이전 커밋과 합쳐서 커밋을 하도록 실행
등등 여러가지 명령어는 편집기 실행 시 설명이 되어있음.

-> squash를 실행시키고자 할 때에는 가장 오래된 commit 에 pick 혹은 p를 입력해주고, 합치고자 하는 나머지 commit에는 squash 혹은 s를 입력해준다.

  • 커밋 재정렬을 완료한 뒤에는 ESC > :wq 로 편집기 창을 종료한다.
  • 종료 후에는 Push하기 - 깃은 히스토리가 다른 브랜치의 푸시는 허용하지 않기 때문에 git push origin branch -f-f 옵션을 사용하여 force push를 진행한다.

rebase 과정 중 충돌(conflict)가 일어날 시

  • 충돌이 일어난 코드 해결부터 해주기
  • 코드 수정 후 git add .
  • git rebase --continue 를 입력해서 멈춘 rebase 작업을 마저 진행시켜준다.
  • 해결이 되지 않을 시에는 git rebase --abort를 사용하여 아예 rebase를 진행하기 전 상황으로 돌아갈 수도 있다.
profile
개 발자국 🐾
post-custom-banner

0개의 댓글