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
'Programming > Git' 카테고리의 다른 글
[Git] Squash Commit / Merge : 여러 개의 Commit 합치기 (1) | 2022.09.25 |
---|---|
[Git] 원격 저장소까지 반영된 commit 되돌리기(Git Reset) (0) | 2022.09.25 |
[Github] Issue 및 Issue Branch 생성하여 프로젝트 관리하기 (0) | 2022.09.24 |
[Git] Cherry-pick 변경사항 다른 브랜치에 반영하기 / 충돌(Conflict) 해결 (0) | 2022.09.24 |
[Git] 윈도우에 Git 설치 및 사용자 이름/이메일 등록 (0) | 2022.09.18 |