[현재 상태]
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-D와 A-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 |