1. rebase의 동작원리
・feature브랜치가 처음 파생된 아래 표시된 빨간점이 feature 브랜치의 base라고한다. rebase란 저 베이스를 옮기는 것을 의미한다.
・base 이후부터 feature 가 만든 커밑까지의 플로우가 임시저장소에 격납. 격납된 부분을 fetch라고 부름
・base 이후부터 feature 가 만든 커밑까지의 플로우가 삭제되고 feature는 master의 최신 커밑으로 checkout됨
・임시저장소의 fetch에서 커밑 하나하나를 master브랜치로 옮겨 master의 최신 커밑과 병합을 시킴
2. rebase 실행해보기
[지금까지의 플로우]
master 브랜치에서 1을 커밑
rb브랜치 생성
rb 브랜치에서 R1을 커밑
rb 브랜치에서 R2를 커밑
master 브렌치로 체크아웃
master 브렌치에서 M1을 커밑
master 브렌치에서 M2를 커밑
・$ git log --decorate --all --oneline --graph
rb의 base는 1인데, rebase해서 rb의 base를 M2로 바꾸어 줄 것임
* 1a65c2a (HEAD -> master) M2
* 338f6a1 M1
| * 8a1ca73 (rb) R2
| * a283221 R1
|/
* 8c33afd 1
・git rebase master
git rebase master : branch가 rb에 존재할 때, rb의 베이스를 변경
git merge rb : branch가 master 에 존재할 때, rb를 master로 병합시킴
$ git log --decorate --all --oneline --graph
* f9c53a8 (HEAD -> rb) R2
* b0d3c67 R1
* 1a65c2a (master) M2
* 338f6a1 M1
* 8c33afd 1
・git checkout master
・git merge rb
master 브랜치는 rb이상 가지고 있는 커밑이 없으므로 fast-forwarding
$ git log --decorate --all --oneline --graph
* f9c53a8 (HEAD -> master, rb) R2
* b0d3c67 R1
* 1a65c2a M2
* 338f6a1 M1
* 8c33afd 1
3. rebase의 충돌
[지금까지의 플로우]
master 브랜치에서 1을 커밑(f1.txt파일의 첫번째 줄에 A작성)
master 브렌치에서 M1을 커밑(f1.txt파일의 첫번째 줄에 A작성 + 2번째줄에 M1작성)
rb브랜치 생성
rb 브랜치에서 R1을 커밑(f1.txt파일의 첫번째 줄에 A작성 + 2번째줄에 R1작성)
rb 브랜치에서 R2를 커밑(f1.txt파일의 첫번째 줄에 A작성 + 2번째줄에 R2작성)
rb 브랜치에서 R2를 커밑(f1.txt파일의 첫번째 줄에 A작성 + 2번째줄에 R3작성)
$ git log --decorate --oneline --graph --all
* f5dc64d (HEAD -> rb) R3
* 20fd541 R2
* 6f0c444 R1
| * 4e9dd84 (master) M1
|/
* 3b42f60 1
・git rebase master
-2번째 줄의 내용이 모두 상이하므로 rebase시 충돌 발생
First, rewinding head to replay your work on top of it...
Applying: R1
error: Failed to merge in the changes.
Using index info to reconstruct a base tree...
M f1.txt
Falling back to patching base and 3-way merge...
Auto-merging f1.txt
CONFLICT (content): Merge conflict in f1.txt
Patch failed at 0001 R1
The copy of the patch that failed is found in: .git/rebase-apply/patch
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
rebase in progress; onto 4e9dd84You are currently rebasing branch 'rb' on '4e9dd84'.(all conflicts fixed: run "git rebase --continue")Changes to be committed:(use "git reset HEAD <file>..." to unstage)modified: f1.txt
-git log --decorate --oneline --graph --all로 현재상황 확인
* 43a38df (HEAD) R1
* 4e9dd84 (master) M1
| * f5dc64d (rb) R3
| * 20fd541 R2
| * 6f0c444 R1
|/
* 3b42f60 1
・git rebase --continue
-R1의 둘째줄과 R2의 둘째줄이 겹치기 때문에 또 오류 메시지 뜸
-수동으로 수정 후 log 확인. R2가 R1 뒤에 잘 붙어있음.
* f75f8de (HEAD) R2
* 43a38df R1
* 4e9dd84 (master) M1
| * f5dc64d (rb) R3
| * 20fd541 R2
| * 6f0c444 R1
|/
* 3b42f60 1
・git rebase --continue
-R2의 둘째줄과 R3의 둘째줄이 겹치기 때문에 또 오류 메시지 뜸
-수동으로 수정 후 log 확인. R3가 R2 뒤에 잘 붙어있음.
* a0c8cb4 (HEAD -> rb) R3
* f75f8de R2
* 43a38df R1
* 4e9dd84 (master) M1
* 3b42f60 1
'DevOps > Git' 카테고리의 다른 글
GIT사용시 곤란할 경우 메뉴얼 31선 (0) | 2018.08.08 |
---|---|
[Git]Git 모델링 (0) | 2018.03.24 |
[Git]git remote, git push, git clone, 하나의 원격저장소를 2개의 지역저장소가 사용하는 방법(push와 pull) (0) | 2018.03.24 |
[Git]branch의 원리, Head의 원리,되돌아가기 - reset과 checkout, reset의 soft,mixed,hard (0) | 2018.03.24 |
[Git]fast-forward 병합과 recursive 병합 (0) | 2018.03.24 |