노트북 세 대에서 git이 꼬일 때…stale main에서 딴 브랜치가 PR에 과거 코드를 끌고 오는 이유
컴퓨터를 바꿀 때 pull을 건너뛰고 브랜치를 따면 PR에 예전 커밋이 섞인다. 다중 기기 워크플로에서 실제로 막힌 지점과 rebase·wip 브랜치 대응을 정리한다.

블로그 레포를 노트북·데스크톱·클라우드 에이전트 VM에서 번갈아 열다 보면, 가끔 “분명 고친 코드가 PR에는 없고 예전 파일이 돌아온다” 는 상황이 난다. 원인은 대부분 복잡한 merge conflict가 아니라, B 기기의 main이 A 기기에서 이미 머지된 최신 상태를 따라가지 못한 채 브랜치를 딴 것이다. 노션에 정리해 둔 다중 기기 git 메모를 바탕으로, 실제로 막혔던 패턴과 대응만 추려 적는다.
사실: 증상은 이렇게 보인다
전형적인 흐름은 다음과 같다. A 노트북에서 feature/blog-automation 브랜치로 글쓰기 규칙을 수정하고 main에 머지했다. 다음 날 B 데스크톱에서 git checkout main만 하고 pull을 잊은 채 feature/hero-image-fix를 만든다. B에서 고친 건 frontmatter 한 줄인데, PR diff에는 이미 A에서 삭제한 옛 스크립트가 다시 살아 있거나, 카테고리 상수와 충돌하는 예전 consts.ts 조각이 끼어 들어온다.
에이전트 워크트리 환경에서는 한 단계 더 헷갈린다. 격리된 worktree의 main이 원격과 어긋나 있으면, 에이전트가 “최신 main에서 브랜치를 땄다”고 로그에 남겨도 실제 base commit이 하루 전일 수 있다. 사람이 눈으로 git log --oneline -3을 안 보면 PR 단계에서야 발견한다.
이유: pull 없이 브랜치를 따면 base가 과거에 고정된다
git은 브랜치를 만들 때 현재 HEAD가 가리키는 커밋을 출발점으로 삼는다. main이 원격보다 10커밋 뒤처져 있으면, 새 feature/*도 그 10커밋 이전 세계에서 출발한다. 이후 git push와 PR 생성은 정상적으로 보이지만, GitHub가 비교하는 base는 “옛 main → 새 브랜치”이므로 이미 main에 합쳐진 변경을 되돌리는 diff가 PR에 섞일 수 있다.
노션 메모의 “규칙 1: 컴퓨터를 바꾸면 무조건 git pull origin main”은 과장이 아니다. fetch만 하고 merge/rebase를 안 하면 로컬 main은 여전히 옛 상태다. git status가 clean이어도 원격 대비 behind일 수 있으므로, 작업 시작 루틴에 git fetch origin && git status -sb를 넣는 편이 낫다.
rebase를 쓰는 팀이라면 PR 전에 git rebase main으로 브랜치 바닥을 최신화해야 한다. 이미 push한 브랜치면 --force-with-lease가 필요하다. 메모에 적힌 대로, force push는 브랜치를 혼자 쓸 때만 하고, 공유 브랜치에서는 merge commit을 받아들이는 쪽이 안전하다.
평가: 습관 하나와 임시 브랜치 하나면 대부분 끝난다
실무에서 효과가 큰 조합은 두 가지다.
첫째, 기기 전환 시 고정 문장: checkout main → pull → 새 브랜치. main에서 직접 커밋하지 않는다. 블로그 자동화처럼 cron이 main에 바로 push하는 예외가 있어도, 사람이 손대는 수정은 브랜치로 분리하면 롤백이 쉽다.
둘째, 미완성 작업은 wip/ 브랜치로 push. 퇴근 전 PR까지 못 올리면 wip/2026-08-10-hero처럼 올려 두고 다음 기기에서 git fetch && git checkout wip/...로 이어간다. 노션 메모의 “PR 전 rebase”는 wip를 main에 합치기 직전에 한 번 돌리면 된다.
feature 브랜치를 머지 후 재사용하지 말라는 메모도 맞다. 같은 이름으로 두 번째 작업을 시작하면 PR diff에 지난번 머지 커밋까지 섞여 리뷰가 불가능해진다. 브랜치 삭제 비용은 거의 없다.
부연: 어디에 안 쓰는지
혼자 쓰는 사이드 프로젝트에서 한 기기·한 브랜치만 쓴다면 이 글의 절차는 과하다. 반대로 에이전트 + 로컬 + 노트북이 같은 repo를 건드리면 pull 생략 한 번이 배포 롤백으로 이어질 수 있다.
git pull --rebase와 merge 중 팀 규칙이 정해져 있지 않다면, 블로그 정적 레포처럼 충돌이 드문 곳은 pull 시 rebase를 써도 된다. 다만 이미 열린 PR 브랜치를 rebase한 뒤 force push할 때는 CI가 다시 도는지 확인한다.
API 토큰·내부 호스트명·고객사 실명은 글에 넣지 않았다. 노션 시드에 있던 배포 토큰 예시는 전부 마스킹·삭제했다.
출처
- Notion 시드: «깃을 밀어내고 작업» — 다중 기기 pull·wip 브랜치·rebase 절차 (공개 가능 요지만)
- 내부 실측: 블로그 레포에서
git fetch origin && git status -sb로 behind 커밋 수 확인, worktree 격리 환경에서 base commit 시각 대조