Rebase

JINSOO PARK·2021년 10월 7일

지옥에서 온 git

목록 보기
6/7

merge vs rebase

  • merge
    마스터 브렌치(M)의 최신 커밋과 Feature 브렌치(f)의 최신 커밋과 그 공통의 조상인 브렌치를 비교하여 (3 way merge)를 통해 병합해주고 그럴 수 없는 경우 conflict를 내서 사람이 병합 하게 한다.
    이렇게 되면 f브렌치는 자신의 하위 커밋과 마스터의 하위 커밋을 모두 가지게 되어 f브렌치의 입자에서는 m브렌치를 병합한 것이 라고 할 수 있다.

  • rebase
    m브렌치와 f브렌치가 공통으로 가지고 있는 조상이 f브렌치의 입장에선 base가 된다. 여기서 rebase를 한다는 얘기는 앞서 말한 base를 바꾼다는 말이 된다.

  1. rebase를 실행하게 되면 f브렌치의 커밋들이 임시 저장소로 들어가게 된다.
  2. f브렌치는 마스터의 최신 커밋으로 checkout하게 된다.
  3. 임시 저장소에 있던 f브렌치의 커밋과 현재 마스터 브렌치가 병합을 하게 된다.
  • 공통점: 둘다 마스터의 커밋과 feature의 커밋을 가지고 있음
  • 차이점
    merge
    단점: 병렬로 뻣어나가서 지저분하다.
    장점: 비교적 안전하고 쉽다.
    rebase
    단점: 위험하고 어렵다.
    장점:직렬로 나아가기 때문에 history를 한눈에 파악하기 쉽다.

실습해보기

마스터에서 파일을 하나 만들고 커밋 -> 브렌치 생성 후 새로운 파일을 만들고 커밋 후 또한번 수정 후 커밋 -> 다시 마스터로 넘어가서 또다른 파일 생성 후커밋 -> 같은 파일을 수정 후 커밋

jinzz@DESKTOP-I8KEDHO MINGW64 /c/rebasetest (master)
$ git log --decorate --all --oneline --graph
* 53d9851 (HEAD -> master, origin/master, origin/HEAD) master branch2
* 531da3a master branch
| * 12d4e2c (origin/feature, feature) feature made 2
| * 1d3727b feature made 1
|/
* 7c5f2fd master base

git log --decorate --all --oneline --graph
로 확인 해보면 브렌치가 나뉘어진걸 알 수 있음.

이 상태에서 현재 feature브렌치의 base는
7c5f2fd master base 이다.

feature 브렌치에 체크아웃 상태에서 rebase를 해본다.

$ git rebase master

그리고 다시 로그를 확인해 본다.

* 6722852 (HEAD -> feature) feature made 2
* 9ba89a7 feature made 1
* 53d9851 (origin/master, origin/HEAD, master) master branch2
* 531da3a master branch
| * 12d4e2c (origin/feature) feature made 2
| * 1d3727b feature made 1
|/
* 7c5f2fd master base

마스터의 가장 최신 브렌치였던
53d9851 (origin/master, origin/HEAD, master) master branch2
의 위로 feature브렌치가 올라간 것을 알 수있다.
즉 마스터의 가장 최신 브렌치를 base로 reabse한 것이다.

다시 마스터로 체크아웃 후
git merge feature를 통해 합병
로그를 확인해 보면

* 6722852 (HEAD -> master, feature) feature made 2
* 9ba89a7 feature made 1
* 53d9851 (origin/master, origin/HEAD) master branch2
* 531da3a master branch
| * 12d4e2c (origin/feature) feature made 2
| * 1d3727b feature made 1
|/
* 7c5f2fd master base

6722852 (HEAD -> master, feature) feature made 2
feature 브렌치와 마스터 브렌치가 모두 머물고 있는걸 알 수 있다.

*rebase 시 conflict 가 났을 때
해당 파일을 vim 으로 수정해 주어야 한다.

<<<<<<< HEAD // 현재 해당하는 브렌치의 내용

======= // 구분자

>>>>>>> exp // 병합한 브렌치

충돌 해결 후

git rebase --continue

를 통해 다시 rebase를 해준다.

profile
개린이

0개의 댓글