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".

충돌을 수동으로 해결 후 git rebase --continue 하라는 메시지가 뜸 
rebase in progress; onto 4e9dd84
You 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
・이때의 log를 확인해보니..

-git log --decorate --oneline --graph --all로 현재상황 확인

* 43a38df (HEAD) R1

* 4e9dd84 (master) M1

| * f5dc64d (rb) R3

| * 20fd541 R2

| * 6f0c444 R1

|/

* 3b42f60 1

-R1이 새로운 베이스 M1뒤에 잘 붙어있음.



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


+ Recent posts