Programming/Git

[Git] Rebase로 브랜치 병합하기 / Rebase vs Merge 차이

728x90

 

 

 

 

 

1. Rebase란?

re-base, 베이스를 재배치하는 명령어

한 브랜치에서 다른 브랜치로 합치는 Merge가 아닌 다른 방법

 

 

🔎 Merge vs Rebase

master에서 merge 실행하면,

다음 그림처럼 n3라는 브랜치를 병합하는 새로운 커밋이력이 생성됩니다

 

master에서 rebase를 실행하면,

다음 그림처럼 rebase_branch를 base로 커밋을 재정렬합니다

 

Rebase를 하면 commit 이력이 깔끔해집니다

하지만 rebase를 실행하면 커밋도 새로 생성되고 이력도 재정렬되기 때문에 커밋트리가 달라지므로

master에서 rebase를 실행하는 것은 피하도록 하자❗

 

 

 

 

 

2. Rebase의 사용

 

2.1 새 브랜치에 소스 반영

rebase_branch 를 새로 따서 2개의 commit을 진행했습니다

네트워크 그래프를 확인하면 다음과 같이 확인할 수 있습니다

 

 

 

2.2 rebase

rebase_branch를 기준으로 master의 base를 변경합니다

master 브랜치에서 다음 명령어를 실행했습니다

git rebase {base가 될 branch명}

 

충돌이 없다면 다음 실행모습처럼 rebase에 반영되었던 commit들이 master에도 반영됩니다

choco@LAPTOP-K5UE8036 MINGW32 /d/7.Git Repositories/TEST-PROJECT (master)
$ git rebase rebase_branch
Successfully rebased and updated refs/heads/master.

choco@LAPTOP-K5UE8036 MINGW32 /d/7.Git Repositories/TEST-PROJECT (master)
$ git log
commit 15c5f7a3506ea6460e27292404975acc26238ed0 (HEAD -> master, origin/rebase_branch, origin/master, origin/HEAD, rebase_branch)
Author: syunWin <tus302@naver.com>
Date:   Sun Sep 25 21:04:12 2022 +0900

    rebase - Second Commit

commit db113cb314bc4e507b956df7a91551c1b6897ea2
Author: syunWin <tus302@naver.com>
Date:   Sun Sep 25 21:03:39 2022 +0900

    rebase - First Commit

 

네트워크 그래프에서도 rebase_branch가 master에 자연스럽게 합쳐진 것을 볼 수 있습니다

 

 

 

 

 

3. Rebase 중 Conflict 발생

 

3.1 rebase 명령어 실행

Rebase 명령어 실행 중 다음과 같이 Conflict가 발생하는 경우가 있습니다

같은 소스에 대한 변경사항이 있는 등의 상황이겠죠

git rebase rebase-branch

 

choco@LAPTOP-K5UE8036 MINGW32 /d/7.Git Repositories/TEST-PROJECT (master)
$ git rebase rebase-branch
Auto-merging RebaseFile.txt
CONFLICT (content): Merge conflict in RebaseFile.txt
error: could not apply 549f183... master - Last Commit
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 549f183... master - Last Commit

choco@LAPTOP-K5UE8036 MINGW32 /d/7.Git Repositories/TEST-PROJECT (master|REBASE 1/1)
$

 

 

 

3.2 Rebase 취소

다음 명령어로 Rebase를 취소합니다 (포기..)

git rebase --abort

 

 

 

3.3 Conflict 해결

 

3.3.1 Confilct 파일 수정

파일을 열어 Conflict가 발생한 부분을 수정하고 저장합니다

 

 

3.3.2 Rebase 재개

다음 명령어를 통해 Rebase를 진행하고, 원격 저장소에 push합니다

git add .
git rebase --continue
git push -f origin master

 

choco@LAPTOP-K5UE8036 MINGW32 /d/7.Git Repositories/TEST-PROJECT (master|REBASE 1/1)
$ git add .

choco@LAPTOP-K5UE8036 MINGW32 /d/7.Git Repositories/TEST-PROJECT (master|REBASE 1/1)
$ git rebase --continue
[detached HEAD 1525446] Rebase master - rebase-branch
 1 file changed, 1 insertion(+)
Successfully rebased and updated refs/heads/master.

choco@LAPTOP-K5UE8036 MINGW32 /d/7.Git Repositories/TEST-PROJECT (master)
$ git push -f origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 379 bytes | 379.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To <https://github.com/syun32/TEST-PROJECT.git>
 + 549f183...1525446 master -> master (forced update)

choco@LAPTOP-K5UE8036 MINGW32 /d/7.Git Repositories/TEST-PROJECT (master)
$

 

 

 

 

 

 

 

 


References

📌 https://git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-Rebase-%ED%95%98%EA%B8%B0

📌 https://brunch.co.kr/@anonymdevoo/7

 

 

 

 

 

 

728x90