본문 바로가기
Git

[Git 깃] git rebase

by 까망 하르방 2022. 5. 17.
반응형
Rebase란?

• rebase는 "re" + "base" 로 재배치 하는 것이다.

• merge와 비슷한 개념이지만 commit history 결과 차이가 있다.

    rebase가 commit history 깔끔하게 정리해주는 편이다.

• rebase는 commit 이력을 변경할 수 있기에

    다른 사람이 pull 받아서 사용하고 있다면 곤란해질 수 있다.

• 다른 브랜치에서 특정 commit 만을 가져오는 것에서

    cherry-pick 활용해 볼 수 있다.

• 이전 commit 수정하는 방법으로 -i 옵션을 활용할 수 있다.

 

 

Merge 방식

merge 명령을 통해 C3, C4와 공통 조상 C2을 사용하는

3-way merge로 새로운 commit (C5)을 만들어 낼 수 있다.

 

 

Rebase 방식

rebase 명령으로 한 브랜치에서 변경된 사항을 다른 브랜치에 적용할 수 있다.

C3에서 변경된 사항을 Patch로 만들고 이를 다시 C4에 적용시키는 방법이다.

$ git checkout experiment
$ git rebase master

두 브랜치가 나뉘기 전 공통 commit으로 이동하고 나서

그 commit부터 지금 checkout 한 브랜치가 가리키는 commit까지 diff를 차례로 만들어

어딘가에 임시로 저장해 놓는다. → Patch

 

Rebase 할 브랜치(experiment)가 합칠 브랜치(master)가 가리키는 commit을 가리키게 하고

아까 저장해 놓았던 변경사항을 차례대로 적용한다.

 

그리고 나서 master 브랜치를 Fast-forward 시킨다.

$ git checkout master
$ git merge experiment

 

 

C4' commit 결과는 Merge 방식의 C5와 같은 결과를 가진다.

rebase와 merge는 커밋을 합치는 것에는 큰 차이가 없다.

하지만 rebase가 보다 깔끔한 commit history를 보인다.

 

git log로 보면 작업을 병렬로 진행하여도 rebase 이후

모든 작업이 차례대로 수행된 것처럼 보인다.

• rebase 브랜치의 변경사항을 순서대로 다른 브랜치에 적용하면서 합친다.

• merge 두 브랜치의 최종 결과만을 가지고 합친다

 

 

Rebase 활용

rebase는 브랜치를 합치는 것 외에도 다른 목적으로도 사용할 수 있다.

공통조상 C3 기준으로 serverclient 브랜치가 나뉘었다.

 

이때 아직 검증하지못한 server 브랜치는 그대로 두고

client 브랜치만 master로 합치고자 한다.

server 브랜치와 관련없는 커밋 C8C9

master 브랜치에 적용하기 위해 --onto 옵션 사용

$ git rebase --onto master server client

 

master 브랜치부터 server  브랜치와 client 브랜치의 공통 조상 commit(C3)까지 

client 브랜치에서 없애고 싶을 때 사용한다.

 

client 브랜치에서만 변경된 패치를 만들어

master 브랜치에서 client 브랜치 기반으로 새로 만들어 적용한다.

 

 

이제 master 브랜치로 돌아가서 fast-forward 시킬 수 있다.

$ git checkout master
$ git merge client

 

 

server 브랜치 구현/검증이 끝났다면

checkout 하지 않고 바로 rebase 할 수도 있다.

$ git rebase {base 브랜치명} {topic 브랜치명}

# server 브랜치 수정사항을 master 브랜치에 적용
$ git rebase master server

 

 

그리고 master 브랜치를 fast-forward 시키면 된다.

$ git checkout master
$ git merge server

 

 

이제 client와 server 브랜치는 삭제해도 된다. 

브랜치를 삭제해도 commit history는 여전히 남아 있긴 한다.

# client 브랜치 삭제
$ git branch -d client
 
# server 브랜치 삭제
$ git branch -d server

 

 

rebase 위험성

rebase 명령어로 쌓여지는 commit은 기존 commit hash와 다르다.

내용은 같더라도 hash 값이 기존과 다른 새로운 commit 인 것이다.

C4C4'의 적용 내용은 같더라도 서로 다른 commit 이다.

 

혼자 작업하고 있다면 상관없지만

다른 사람이 rebase 하기전 commit을 가지고 작업하고 있다면

동일한 내용의 commit이 2개로 보이는 등

혼란을 야기할 수 있으니 유의해야 한다.

 

 

[까망] Git 목록

본 블로그에 작성된 Git 관련 내용 URL을 정리한 곳입니다. 목록 [Git] "git add -p" 를 활용하는 이유 [Git] .gitignore 설정 [Git] learngitbranching 답안 및 풀이 - 1 [Git] learngitbranching 답안 및 풀이 -..

zoosso.tistory.com

반응형

'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

댓글