Development/Git

merge와 rebase 그리고 pull

DevKTak 2025. 7. 14. 19:19

[현재 상태]

       A --- B   ← origin/main (원격)
      /
O --- C --- D    ← main (내 로컬 브랜치)

 

  • O: 공통 조상 커밋
  • C, D: 내가 로컬에서 만든 커밋들
  • A, B: 다른 사람이 origin/main에 푸시한 커밋들

 

1. git pull origin main (기본 동작: merge)

 

 

  • 먼저 git fetch origin main 해서 A-B를 가져옴
  • 그다음 자동으로 merge 진행
       A --- B
      /       \
O --- C --- D --- M   ← main (병합 후)
                    ↑ merge commit

 

 

  • M은 C-DA-B의 결과를 병합한 자동 생성된 병합 커밋(merge commit)
  • 히스토리에 브랜치가 분기되고 다시 합쳐진 흔적이 남아요.
  • git log로 보면 머지 흔적이 보이고 Merge branch 'origin/main' 메시지가 자동으로 들어갑니다.

 

2. git pull origin main --rebase

  • 원격 커밋 A-B를 가져온 뒤
  • 내 커밋 C-D를 그 위에 재적용
O --- A --- B --- C' --- D'   ← main (rebased)
  • C-D는 삭제되고 새 커밋 C'-D'로 재작성됨
  • 결과: 최신 원격 커밋 위에 내 변경을 이어붙임
  • 리베이스 과정이 자동으로 수행됨

3. git rebase origin/main (수동)

  • 현재 브랜치가 feature이고, main 위로 올리고 싶을 때
  • 로컬 브랜치 main의 C, D 커밋을
    origin/main의 최신 커밋 B 위에 다시 적용함
O --- A --- B --- C' --- D'   ← main (rebased)
              ↑
         origin/main

 

 

  • 사용자가 직접 브랜치 지정
  • 브랜치를 정리하거나 깔끔한 PR을 만들 때 유용
  • 병합 대상이 원격이 아닐 수도 있음
  • C, D는 새 커밋 C', D'로 변경됨 (내용은 같지만 커밋 해시 다름)
  • 히스토리는 깔끔하게 직선(linear) 형태
  • origin/main은 아직 푸시 안 했으면 여전히 B에 머물러 있음

⚠️  주의할 점

이제 git push하려고 하면 이런 메시지가 뜰 수 있습니다.

hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. You may want to integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.

 

이건 로컬 커밋들이 rebase로 새로 만들어져서 원격 브랜치와 히스토리가 달라졌기 때문!

 

🔹 git rebase origin/main 실행 후:

O --- A --- B --- C' --- D'   ← main (로컬 브랜치, rebased)
              ↑
         origin/main (여전히 A-B)
  • C', D'는 원래의 C, D와 내용은 비슷할 수 있지만, 부모가 A-B로 바뀌었기 때문에 새로운 커밋이에요.
  • 이 전체 라인은 로컬 브랜치 main
  • 원격 브랜치 origin/main은 아직 B에서 멈춰있고, 아직 C', D'는 원격에 없는 상태예요.

📌 그래서 이 상태에서 push 하면?

깃은 다음처럼 반응해요:

"로컬 브랜치에는 C', D'가 있는데, 원격에는 그런 커밋이 없네?
아예 히스토리가 다르니까 그냥 push는 안 되고, force해야겠어."

즉, git push --force를 사용해야 이 로컬 C'-D'를 원격에 덮어쓸 수 있어요.

git push --force

단, 팀 작업 중이면 --force는 매우 조심해서 사용해야 해요.
다른 사람의 작업을 덮어쓸 수도 있으니까요.

'Development > Git' 카테고리의 다른 글

Git 협업을 해보자  (0) 2023.03.03
Git Pull Requests의 Merge 전략  (0) 2023.02.19
Git 기본 명령어 정리  (0) 2023.02.18