1) 증상 요약 → 원인 매핑
- 너는 master로 push/pull, 팀은 main 사용
- 원인: 로컬 기본 브랜치 이름이 master이고 업스트림도 origin/master로 연결. 원격에는 main과 master가 둘 다 존재.
- 로그 근거: git remote show origin에 HEAD branch: main, Remote branches: main tracked, master tracked, master pushes to master (local out of date).
- git pull --rebase가 “unstaged changes”로 실패
- 원인: 워킹트리에 커밋되지 않은 변경이 있어서 rebase/merge가 덮어쓸 위험이 있으니 Git이 안전하게 중단.
- git merge origin/main이 “would be overwritten by merge”로 중단
- 원인: 로컬에서 수정한 파일(core/views.py 등)이 있고, 머지하면 로컬 변경이 사라질 상황. Git이 보호 차원에서 거부.
- __pycache__/… .pyc가 충돌/변경 대상으로 잡힘
- 원인: .pyc/__pycache__가 저장소에 추적되도록 커밋된 상태이거나 .gitignore가 늦게 추가됨 → 빌드 아티팩트가 계속 변경 감지/충돌 유발.
2) 개념 흐름으로 보는 올바른 절차
A. “팀 표준 브랜치(main) 맞추기”
- 개념: *업스트림(추적 대상)*은 로컬 브랜치가 “기본적으로 pull/push할 원격 브랜치”를 뜻합니다. 팀 표준이 main이면 로컬도 main으로 통일하고 업스트림을 origin/main으로 맞춥니다.
실행 순서
git fetch origin git branch -m master main # 로컬 master → main으로 개명 git branch -u origin/main main # 업스트림을 origin/main으로 git remote set-head origin -a # (선택) 원격 HEAD 동기화
B. “로컬 변경과 원격 동기화 전략” (세 가지 중 택1)
- 개념: pull은 “fetch + merge”(기본) 또는 “fetch + rebase”(--rebase)입니다. 워킹트리에 변경이 있으면 두 방식 모두 충돌 위험이 있어 먼저 정리해야 합니다.
① 로컬 변경을 버리고 원격과 동일하게 맞춤(덮어쓰기)
지금 원하신 방식
# (선택) 혹시 몰라 임시 백업 브랜치 git branch backup/local-$(date +%F) git fetch origin git switch main git reset --hard origin/main # 로컬 변경 완전 폐기, 원격과 동일화 git clean -fd # (선택) 미추적 파일/폴더도 정리
② 로컬 변경을 잠시 보관했다가 다시 적용(stash)
git stash -u # 변경 + 미추적 파일까지 보관 git pull --rebase # 원격 최신 반영 git stash pop # 보관 변경 재적용 (충돌 나면 이때 해결)
③ 로컬 변경을 커밋 후 안전하게 통합
git add -A git commit -m "WIP: 내 변경 임시 커밋" git pull --rebase # 깔끔한 선형 히스토리 선호 시 # 또는 git pull # 머지 커밋 허용 시
팁: --ff-only를 쓰면, 히스토리가 분기되어 있으면 안전하게 중단합니다.
git pull --ff-only
C. “빌드 아티팩트 추적 방지(.pyc, pycache)”
- 개념: .gitignore는 “새로 추적되지 않게”만 합니다. 이미 커밋된 파일을 배제하려면 “인덱스에서 제거(캐시만)”해야 합니다.
권장 설정
# .gitignore __pycache__/ *.pyc
이미 추적된 아티팩트 제거(히스토리는 보존, 앞으로만 제외)
git rm -r --cached __pycache__ git rm --cached -r '*.pyc' git commit -m "chore: stop tracking pyc/__pycache__" git push
3) 재발 방지 체크리스트
- 기본 브랜치 통일: 모두 main 사용. 로컬/원격 업스트림 origin/main 확인
git branch -vv, git remote show origin - 작업 시작 전 갱신 습관:
git fetch origin && git pull --rebase (또는 --ff-only) - 작업 단위 작게 커밋: 충돌 시 원인 파악/해결 용이
- 빌드/캐시 파일 무시: .gitignore + 이미 추적된 것은 git rm --cached
- 새 repo 기본 브랜치 main으로 고정:
-
git config --global init.defaultBranch main
4) 지금 당신 상황에 적용하는 “실전 스크립트”
“그냥 원격 main으로 덮고, 이후엔 main만 쓸게요”일 때:
# 0) 혹시 모를 백업 git branch backup/local-$(date +%F) # 1) 원격 동기화 git fetch origin # 2) 로컬 master → main 개명(이미 했다면 생략) git branch -m master main # 3) 업스트림 설정 git branch -u origin/main main # 4) 로컬을 원격과 동일하게 강제 맞춤(모든 변경 폐기) git reset --hard origin/main git clean -fd # 5) 빌드 아티팩트 정리 printf "__pycache__/\n*.pyc\n" >> .gitignore git rm -r --cached __pycache__ || true git rm -r --cached *.pyc || true git add .gitignore git commit -m "chore: ignore pyc/__pycache__" git push
한 줄 요약
- 원인: master↔main 혼용 + 워킹트리 미커밋 변경 + 빌드 아티팩트 추적.
- 해결: 브랜치/업스트림을 팀 표준 main으로 통일 → 로컬 변경 처리 전략 선택(버리기/스태시/커밋) → .pyc류 영구 제외.
- 버튼처럼 기억: “fetch → 내 상태 정리(commit/stash/reset) → pull(rebase/ff-only) → push” 흐름을 습관화하세요.
'오류코드' 카테고리의 다른 글
| [DevOps 09] Docker Compose로 Django, DB, Redis 한 번에 올리기 (0) | 2025.09.03 |
|---|---|
| 스터디 1 오류코드 (0) | 2025.06.11 |