시그마 삽질==six 시그마

git rebase 본문

프로그래밍/GIT

git rebase

Ethan Matthew Hunt 2020. 8. 31. 17:47

1. rebase 정의

 

Merge를 할때  base를 두 브랜치의 공통조상이 아닌 특정브랜치의 최근 커밋으로  변경해서 한개씩 merge하는것

(re-다시 Base를 정해서 작업하는것)

지정한 브랜치를 베이스로 기준으로 해서 merge하는 방법임

before

 

master
feature/c

 

if merge

 

if rebase

 

 

2. rebase 방법 예시

 

1) feature/c 브랜치로 checkout

 

git checkout feature/c

head를 c2로 변경

 

2) master 브랜치로 rebase

 

git rebase <base_branch> <feature_branch>  <---<feature_branch> 생략가능

ex) git rebase master feature/c  or  git rebase master

 

master c 공통 조상이 되는 base 커밋부터 현재 브랜치까지의 변경 사항 구해서 patch 저장(c1,c2)

head가 master로 변경됨

head가 현재 가리키고 있는 m2에  c1 변경사항을 적용하여 새로운 커밋 c1'이 생성됨

c1'에  c2 변경사항을 적용하여 새로운 커밋 c2'이 생성됨

기존 b->c1->c2 는 날라감

이제 c2가 c2'를 가리킴

 

 

3) conflict 발생시

 

(confilct 해결후) git rebase --continue 해주면됨

(conflict 해결이 안되면 해당 명령어로 merge전으로 롤백) git rebase --abor

 

 ex)

 

 

하단에서는 feature/c를(c1,c2) master(m1,m2)로 리베이스한 상황

git checkout feature/c  -> git rebase master

 

c1는 잘나가다 c2에서 컨플릭트남  수동으로 컨플릭트 조정후  조정 잘되면 git rebase --continue 하면됨

조정 실패시  git rebase --abor 하면됨

 

merge conflict 완료 후 -> git rebase --continue

 

feature/c의  결과

 

after rebase : feature/c 의 log

 

master를 checkout해서 보면 현재도 딱 m2까지만 있음(변화없음)

 

after rebase: master의 log

 

 

4) c 브랜치를 master fast-forward merge

 

(1)git checkout master

 

(2) git merge feature/c

 

c를 master로 fast-forward merge하여 완료

 

a->b->m1->m2->c1’->c2’

 

 

다른 예시 ex)

 

git merge feature/c 후 master log

 

merge 후 : master log

master push

 

 

after push

master log

 

  merge rebase
방법 최종 결과로 병합 브랜치의 변경사항을 순서대로 다른 브랜치에 적용하면서 합침
장점 -브랜치 히스토리 유지 -history가 simple해져서(merge commit도 x) 브랜치가 많을때 직관적임
단점 -히스토리 복잡 -rebase하면서 계속 merge confilct해야함

 

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

 

인텔리제이 rebase 참고하기 좋은곳 : 

https://jjjayyy.tistory.com/56

https://www.jetbrains.com/help/idea/apply-changes-from-one-branch-to-another.html#rebase-branch

 

 

 

==============하단은 인텔리제이를 사용한 git  rebase 방법 ===================

 

 

 

 

한김에 이어서 intellij 로 rebase 하는 방법을 알아보자

 

위 예시에서 master c2에서  test이라는 브랜치를 새로 만들고  test에는 t1,t2생성, 그리고 master에는 mm1, mm2를 새로 만들었다.

 

git checkout test

 

 

vcs ->rebase

 

branch는 test

onto는 base 가 될 branch  요기선 master

 

test의 상태

 

master의 상태

 

rebase 클릭시 뜨는 팝업 start rebasing 클릭

 

 

 

merge conflict 뜸.. 

 

merge conflict 완료가 되면 하단과 같이 뜸..  continue rebasing  클릭해줌... ( 수정할 필요없음. 요기 사진과 달리 필자는 .. 넣어줬음)

 

 

rebase 후 test 상태

 

rebase 후 master 상태

 

git checkout master

 

테스트 브랜치에 커서 위치시키고 마우스 우클릭 merge into Current 클릭(git merge test 해준거와 같음)

 

해준후가 옆에 로그임....

 

git push 해줌

 

푸시 후  master log 

 

 

 

 

 

 

참고:

 

같은 방식 다른 ui 

 

test 브랜치로 checkout 한 상태에서  master로 rebase 하고싶을땐

(git checkout test -> git rebase master를 하고 싶을때)

 

일단 test 계정으로 checkout하고

 

master 클릭한 상태에서  rebase current onto selected 하면됨

 

 

 

 

 

 

 

 

 

또 참고로 

 

git checkout <my_local_branch_name>

git fetch <another remote_branch> 

git rebase <another remote_branch>

 

  (conflict 해결 후) git rebase --continue

  (conflict 해결이 안되면 해당 명령어로 merge전으로 롤백) git rebase --abor

 

git push origin <my_local_branch_name>   이런 초식도 있음

========

 

 

 

커밋메시지 합치기

git rebase -i HEAD~2

https://korband.tistory.com/33


pick 과거
pick 최근

pick 과거
s 최근

wq


커밋메세지 한개 주석

wq

 

'프로그래밍 > GIT' 카테고리의 다른 글

fork repository에 원본 repository 수정분 반영하기  (0) 2020.10.18
git tag  (0) 2020.10.18
git 기본 명령어  (2) 2020.08.20
git status , git diff  (0) 2020.08.20
git stash (임시저장)  (0) 2020.08.20
Comments