git pull이 갑자기 거부하며 방식을 정하라고 한 이유
문제 발생
늘 하던 git pull이 거부됐습니다.
hint: You have divergent branches and need to specify how to reconcile them.
fatal: Need to specify how to reconcile divergent branches.누군가 원격 브랜치를 강제로 다시 썼고, 그 사이 로컬에도 커밋이 있었습니다.
원인 분석
갈라진 이력을 어떻게 합칠지는 Git이 대신 정해줄 수 없습니다. git pull은 fetch 다음에 통합 단계를 실행하는데, 그 통합 방법이 여러 개입니다. 문서가 네 가지를 나열합니다.
git pull --ff-only— fast-forward 업데이트만 수행하며, 로컬 브랜치가 원격과 갈라졌으면 실패합니다. 이것이 기본값입니다.git pull --rebase—git rebase를 실행합니다.git pull --no-rebase—git merge를 실행합니다.git pull --squash—git merge --squash를 실행합니다.
그리고 pull.rebase, pull.squash, pull.ff 설정으로 선호하는 동작을 지정할 수 있다고 안내합니다.
예전 Git은 조용히 merge를 했습니다. 그 결과 의도치 않은 머지 커밋이 이력에 쌓이는 일이 많아, 지금은 사람이 한 번은 정하게 바뀌었습니다.
해결 방안
- 팀의 이력 정책에 맞춰 설정합니다. 매번 플래그를 붙이지 않아도 됩니다.
git config --global pull.rebase true # 선형 이력을 원할 때
git config --global pull.ff only # 갈라지면 멈추고 직접 판단하겠다-
--rebase의 위험을 인지합니다. 문서가 경고합니다 — 이력을 다시 쓰는 잠재적으로 위험한 동작 방식이며, 이미 공개한 이력에는 좋지 않으므로git-rebase문서를 주의 깊게 읽기 전에는 사용하지 말라는 것입니다. 아직 공유하지 않은 로컬 커밋에만 씁니다. -
왜 갈라졌는지 먼저 봅니다. 정리 방법을 고르기 전에 이게 정상 상황인지 확인합니다.
git log --oneline --graph --left-right HEAD...@{upstream}- 원격이 강제로 다시 쓰인 경우라면 rebase가 답이 아닐 수 있습니다. 내 커밋을 살려야 한다면 새 브랜치로 떼어두고 원격을 기준으로 다시 시작하는 편이 안전합니다.
git branch backup/my-work
git reset --hard @{upstream}- fetch와 통합을 분리하는 습관도 좋습니다.
git fetch후 상태를 보고merge/rebase를 직접 고르면, 이 오류를 만날 일 자체가 줄어듭니다.
댓글0
댓글을 남기려면 로그인이 필요해요. 로그인
아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.