본문으로 건너뛰기
개발 머꼬
개발 노트Git
hohyeon.dev14

git pull이 갑자기 거부하며 방식을 정하라고 한 이유

  • #Common Pitfall
  • #Engineering Note
  • #Git

문제 발생

늘 하던 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 pullfetch 다음에 통합 단계를 실행하는데, 그 통합 방법이 여러 개입니다. 문서가 네 가지를 나열합니다.

  • git pull --ff-only — fast-forward 업데이트만 수행하며, 로컬 브랜치가 원격과 갈라졌으면 실패합니다. 이것이 기본값입니다.
  • git pull --rebasegit rebase를 실행합니다.
  • git pull --no-rebasegit merge를 실행합니다.
  • git pull --squashgit merge --squash를 실행합니다.

그리고 pull.rebase, pull.squash, pull.ff 설정으로 선호하는 동작을 지정할 수 있다고 안내합니다.

예전 Git은 조용히 merge를 했습니다. 그 결과 의도치 않은 머지 커밋이 이력에 쌓이는 일이 많아, 지금은 사람이 한 번은 정하게 바뀌었습니다.

해결 방안

  1. 팀의 이력 정책에 맞춰 설정합니다. 매번 플래그를 붙이지 않아도 됩니다.
git config --global pull.rebase true    # 선형 이력을 원할 때
git config --global pull.ff only        # 갈라지면 멈추고 직접 판단하겠다
  1. --rebase의 위험을 인지합니다. 문서가 경고합니다 — 이력을 다시 쓰는 잠재적으로 위험한 동작 방식이며, 이미 공개한 이력에는 좋지 않으므로 git-rebase 문서를 주의 깊게 읽기 전에는 사용하지 말라는 것입니다. 아직 공유하지 않은 로컬 커밋에만 씁니다.

  2. 왜 갈라졌는지 먼저 봅니다. 정리 방법을 고르기 전에 이게 정상 상황인지 확인합니다.

git log --oneline --graph --left-right HEAD...@{upstream}
  1. 원격이 강제로 다시 쓰인 경우라면 rebase가 답이 아닐 수 있습니다. 내 커밋을 살려야 한다면 새 브랜치로 떼어두고 원격을 기준으로 다시 시작하는 편이 안전합니다.
git branch backup/my-work
git reset --hard @{upstream}
  1. fetch와 통합을 분리하는 습관도 좋습니다. git fetch 후 상태를 보고 merge/rebase를 직접 고르면, 이 오류를 만날 일 자체가 줄어듭니다.

공식 문서

마지막 수정

좋아요북마크

댓글0

아직 댓글이 없어요. 첫 의견을 편하게 남겨 보세요.