본문 바로가기
wecode [TIL]

[TIL] Git - rebase

by 프린벼르 2022. 3. 17.

Git - rebase 표지


Git에서 한 브랜치에서 다른 브랜치로 합치는 방법MergeRebase 다.
Merge와 Rebase의 실행결과는 같지만 커밋 히스토리가 달라진다는 차이점이 있다.

00. merge 란 ?

merge는 각 분기된 커밋을 하나의 커밋으로 다시 합치고 싶을 때 사용하는 git 명령어 이다.


01.  rebase 란 ?

merge와 비슷하게, 하나의 브랜치에서 다른 브랜치로 변경 사항을 통합하도록 설계한 것이다.
즉, rebase는 말 그대로 (re-base)로 베이스재배치(다시 정의)하는 것을 의미한다.


02. 왜 rebase 를 사용할까 ?  =>        

기준을 재지정하는 것주요 이점히스토리를 더 명확하게 얻을 수 있다는 것이다.
즉, rebase를 사용한다면, git 병합에서 필요로 하는 불필요한 병합 커밋을 제거해주기 때문이다.

merge를 사용하면 git 히스토리를 볼 때, 뿌리가 여러 개로 나눠져 있어서 히스토리를 찾아갈 때 보기가 복잡하고 어렵다는 단점이 있다.
반면에, rebase는 베이스를 다시 정의함으로써, 새롭게 커밋 라인을 정리하여 히스토리를 깔끔하게 볼 수 있게 해준다.

∴ 즉, Merge는 쉽고 안전하지만 커밋히스토리가 지저분할 수 있는 반면, Rebase는 잘 모르고 사용할 경우 위험할 수 있어 까다롭지만 커밋히스토리를 깔끔하게 관리할 수 있다.

merge를 사용하면 모든 commit 을 남기게 되지만, rebase를 사용하면 필요 없는 commit을 생략하기 때문에 master의 commit은 항상 깔끔하다.

03.  merge 와 rebase 의 차이 ?

merge & rebase 차이

feature/byul 라는 branch를 만들어서 작업한 후, master에 merge를 사용해서 병합한다면, feature/byul에서 기록한 모든 commit이 master의 commit으로 기록된다.

반면에, rebase 방식을 사용해서 병합하면, 작업을 하면서 남겼던 commit 중 불필요한 것들은 생략시키고 필요한 commit만 남겨서 master에 병합하기 때문에 master의 commit은 항상 오른쪽 그림처럼 깔끔하게 관리된다.

같은 병합이지만, 나중에 master의 commit을 볼 때 깔끔하게 볼 수 있어서 여러 명이 협업할 때 rebase를 사용하는 것이 유용하다.

(참고 : WIP"Work In Progress" 의 약자로 작업중이라는 뜻이다. 커밋은 남겨야겠고, 딱히 쓸 말 없을 때 사용)


04. rebase 하는 방법 ?

 

master(혹은 main) 브랜치우선 이동하기

pull 하기 ! => git pull origin master(혹은 main)

rebase할 브랜치로 다시 이동해주기 !! => git checkout feature/브랜치

rebase 하기 !! => git rebase -i master(혹은 main)

가장 오래된 commit을 pick한다. (다른 commit의 작업내역이 사라지는 것은 아님)
즉, 맨 위 빼고, pick을 s로 바꿔준 후 ESC누르고 :wq 누른 후 엔터 (창 빠져나오기)

현재까지 적은 commit 내역이 모두 나온다.
불필요한 내용을 모두 지우고, 현재 수정 내역에 대한 commit 메시지를 적는다.
ESC누르고 :wq누른 후 엔터 (창 빠져나오기)

성공적으로 rebase 됬다는 메시지가 보이면 => git push origin feature/브랜치이름 -f

강제로 push해야 push가 된다. (-f : 강제의 의미)

※ rebase abort : 리베이스 취소를 의미함.


05. rebase 중 충돌 해결하기

  • 충돌이 일어난 경우, rebase가 진행되지도, 끝나지도 않고 도중에 멈춰 있게 된다.
  • 터미널이 rebase가 진행중임을 알려주니 겁먹을 필욘 없다.
  • 충돌은 충돌일 뿐, 해당하는 코드를 수정 후에 아래와 같이 입력한다.
  • git add .
  • Git commit은 하지 않는다. ( 수정 사항이 없으니까 )
  • git rebase --continue를 진행한다.
  • 멈춰 있던 리베이스가 진행된다.
  • 충돌이 여러 번 나면 그 때마다 충돌을 해결하고 git add . / git rebase --continue를 반복한다.
  • 계속 해결이 안된다면, git rebase --abort로 아예 rebase를 진행하기 전 상황으로 돌아갈 수도 있다.

댓글