본문 바로가기

IT공부

Git Rebase 이해하기

반응형

포크한 저장소를 최신 원본과 동기화시키기 위해 rebase 명령어를 사용합니다.

REBASE 과정 및 원리

보다 쉬운 이해를 위해 상황 순서에 맞게 번호를 붙였습니다.

1. 원본 저장소 fork

우리가 원본 저장소의 코드를 내 원격 저장소로 fork하게 되면 아래와 같은 상황입니다.

2. 내 원격 저장소 clone

그리고 이렇게 fork 한 내 원격 저장소를 로컬로 clone 하여 가지고 오면 아래와 같은 상황이 됩니다.

 

 

이와 같은 상황에서  원본 저장소에서부터 가져온 커밋들을 base라고 부릅니다. 원본 저장소와 포크를 받아온 나의 원격저장소, 그리고 클론을 받은 로컬에는 모두 같은 해시값의 커밋들로 이루어집니다.

git은 base가 교체되지 않는 한, base가 같은 저장소에만 push를 할 수 있습니다.

3. 원본 저장소의 base 변경됨

이 상황에서 추가적으로 로컬에서 작업을 하여 Pull Request를 올리려고 하였는데, 원본 저장소에서도 다른 누군가에 의해 머지된 커밋들이 있다고 생각해봅시다.

위와 그림과 같은 상황일 텐데요. 이와 같게 되면 Pull Request를 올릴 수가 없게 됩니다. base로 한 저장소와 싱크가 맞지 않기 때문입니다. 이런 상황에서 rebase가 필요하게 됩니다.

4. 원본 저장소 fetch 

우선, fetch 명령어로 원본 저장소의 diff를 가져와서 로컬에 존재하는 .git에 보관합니다. 

5. 내 로컬 저장소 rebase

그리고 rebase 명령어를 통해 원본 저장소의 base들을 가져와줍니다. 그림으로 나타내면 아래와 같습니다.

6. 내 커밋 쌓기

이제 원본 저장소와 base가 같아졌으므로, 위에서 저장한 diff를 다시 쌓아주면 rebase 과정이 끝납니다.

 

REBASE 에 필요한 GIT 명령어 읽히기

우선, 현재 저장소의 원격 주소를 확인하기 위해 아래 명령어가 필요합니다.

git remote -v

 

위의 예시처럼 내 원격 저장소의 clone을 받은 경우에는, origin 이라는 이름으로 내 원격 저장소가 뜰 것입니다.

여기에 원본 저장소의 원격 주소를 추가해줍니다. upstream은 원본 저장소의 이름을 지정한 것이고, 아무 이름으로 지정해도 상관 없습니다. 

git remote add upstream {원본주소지}

이제 원본을 fetch 합니다. 위 그림에서 4번 과정에 대한 명령어입니다.

git fetch {원본 저장소} {merge 하고자 하는 브랜치명}

 

그리고 rebase 명령어를 통해 원본 저장소의 base들을 가져와줍니다. 위 그림에서 5번 과정에 대한 명령어입니다.

git rebase {원격저장소이름}/{브랜치명}

이제 원본 저장소와 base가 같아졌으므로, 위에서 저장한 diff를 다시 쌓아줘야 합니다. (=혹은 충돌 부분을 해결해 주어야 합니다.) 위 그림에서 6번 과정에 대한 명령어입니다.

git rebase --continue

 

반응형

'IT공부' 카테고리의 다른 글

DAO vs. Repository  (0) 2022.05.29
Optimistic Locking vs. Pessimistic Locking  (0) 2022.03.30
JWT 인증과 세션인증  (0) 2021.09.12
Go 언어 공부해보기  (0) 2020.06.28
HADOOP 이란  (0) 2020.02.02