git

git rebase vs. git pull —rebase

주먹불끈 2024. 5. 21. 19:00

개요

git pull —rebase 를 쓰자 는 포스팅을 썼음에도 git rebase origin/develop 이라고 쓰고 있다는 것을 자각했다(Pull Request를 develop 브랜치로 하고 있다). 그리고, 이 둘의 차이가 무엇인지 명확히 알지 못한다는 것도 깨달았다.

제대로 정리하고 넘어가자.

TL;DR

git pull --rebase origin develop 를 쓰자

상황

feat/new-fantastic-feature 브랜치에 새로운 기능 구현을 완료하고 Pull Request를 하기 직전이다.

GitHub Repository의 Default branch 설정은 develop 브랜치이다. remote의 develop 브랜치를 rebase 한 다음 깔끔하게 PR을 보내고 싶다.

git pull --rebase origin develop

이 명령은 git pull과 git rebase의 조합이라고 생각하면 된다.

  1. origin 리모트 저장소로부터 develop 브랜치의 최신 변경 사항을 로컬로 가져온다. 즉, 로컬의 develop 브랜치가 리모트의 최신 상황으로 업데이트 된다.
  2. 현재 브랜치의 커밋을 origin/develop 브랜치의 최신 커밋 뒤에 재배치한다. rebase 한다는 말이다.

git rebase origin/develop

이 명령은 현재 브랜치의 커밋을 origin/develop 브랜치의 최신 커밋 뒤에 재배치한다.

git pull --rebase origin develop 명령에서의 1, 2번 단계에서 첫번째 단계가 빠지고 두번째 단계만 실행하는 것이다.

origin develop vs. origin/develop

가끔 origin/develop 과 같은 형태의 표현을 보았었는데 정확이 이해를 하지 못하고 쓰고 있었다.

origin/develop → 로컬!

  • origin/develop는 리모트 트래킹 브랜치를 의미하며 origin은 원격 저장소의 이름, develop은 원격 저장소에 있는 브랜치의 이름이다.
  • 리모트 트래킹 브랜치는 원격 저장소의 브랜치 상태를 로컬에서 추적하는 역할을 한다. 중요한 것은 로컬이라는 것이다.
  • 예를 들어, git fetch 명령을 실행하면 origin/develop 브랜치가 원격 저장소의 develop 브랜치와 동기화, 업데이트 된다.

origin develop → 리모트!

  • origin develop는 git fetch나 git pull 명령의 인자로 사용되는 경우가 많다.
  • 마찬가지로 origin은 원격 저장소의 이름이고, develop은 원격 저장소의 브랜치 이름이다.
  • 이 표현은 주로 원격 저장소에서 특정 브랜치를 가져올 때 사용한다. 실제 리모트 브랜치이다.

비교와 차이점

핵심은 로컬의 origin/develop 브랜치가 리모트의 origin develop 브랜치보다 뒤쳐저 있을 수 있다는 것이다.

  1. 역할과 사용 맥락:
    • origin/develop: 리모트 트래킹 브랜치로, 로컬 저장소에 있는 원격 브랜치이다.
    • origin develop: 명령어의 인자로 사용되며, 원격 저장소 origin에서 브랜치 develop을 지정하는 역할을 한다.
  2. 명령어 사용:
    • origin/develop: 주로 브랜치를 참조할 때 사용한다.
      • 예: git checkout origin/develop, git rebase origin/develop
    • origin develop: 주로 원격 저장소에서 브랜치를 가져올 때 사용한다.
      • 예: git fetch origin develop, git pull origin develop

예시를 통해 좀더 익숙해지자

  • git fetch origin develop:
    • origin 원격 저장소에서 develop 브랜치를 가져와 로컬 리모트 트래킹 브랜치 origin/develop을 업데이트한다.
  • git rebase origin/develop:
    • 현재 브랜치를 origin/develop의 최신 커밋 위로 리베이스한다. origin/develop은 로컬에 있는 리모트 트래킹 브랜치이다.
  • git pull --rebase origin develop:
    • origin 원격 저장소에서 develop 브랜치를 가져와 현재 브랜치를 그 위에 리베이스한다.
    • 이는 git fetch origin developgit rebase origin/develop을 한 번에 수행하는 것과 같다.
반응형