[Git]git pull 할 때 fatal: Need to specify how to reconcile divergent branches. 오류

2023. 3. 21. 16:10개발공부 기강잡자/Git

  • git pull을 하려니 fatal: Need to specify how to reconcile divergent branches. 오류가 발생했다. 처음에는 main과 새로 생성한 branch의 head 가 달라서 그런가 해서 merge도 해봤지만 오류가 해결이 안됐다.

  • branch를 새로 생성해서 작업하면서 오류가 발생한 것 같다.

문제가 발생하기 전 어떤 작업을 했냐면

  1. main에서 새로운 파일들을 commit 함
  2. push를 하기 전에 원격저장소의 데이터를 가져오기 위해 git pull을 명령했더니 다음과 같은 에러가 발생했다.

  • 새로운 branch가 추가됐다면 pull을 하기 전 어떤 병합 전략을 사용할지 설정해줘야한다.

pull 전략

  • git pull은 원격 저장소에서 로컬 저장소로 파일을 가져와 자동으로 병합을 실행한다.

  • git fetch는 원격저장소의 내용을 가져오지만 로컬 데이터와 병합하지는 않는다. (-> 병합을 원한다면 fetch이후 merge를 수행하면 된다.)
    따라서 💡 git pull = git fetch + git merge
    👉 fetch로 원격저장소의 데이터를 가져온 후 - 'FETCH HEAD'의 위치로 원격과 로컬저장소를 merge한다.

  • 기본 설정으로 git pull을 수행하면 pull을 받을 때마다 merge가 발생한다. 이는 불필요한 commit이 생겨 혼동을 발생시킬 수 있다.

해결 방법

  • git config pull.rebase true : rebase후 pull

    • rebase : 새 브랜치가 시작된 분기점 commit을 기준 브랜치의 가장 최근 commit으로 변경하는 작업
  • git config pull.rebase false : rebase 없이 pull

  • git config pull.ff only : fast-forward일 때만 pull 허용

    • fast-forward
    • 로컬 저장소에만 새로운 commit이 있고 원격 저장소에는 없는 경우 👉 pull을 받아올 필요가 없다.
    • 원격 저장소에만 새로운 commit이 있고 로컬 저장소에는 없는 경우 👉 원격 저장소에서 가져와야하기 때문에 pull을 해야한다.
      👉 만약 원격저장소에 새로운 commit이 있는데 git pull을 하지 않고 로컬저장소에 새로운 commit이 생긴다면 git pull 할 수 없다.
  • --global 을 추가하면 모든 레포지터리에 대해 전역으로 지정할 수 있다.

✔️ 이 중 한가지 설정을 하면 문제를 해결할 수 있다.
(rebase는 git history가 깔끔해질 수 있지만, 부주의하게 사용할 경우 별도의 알림 없이 git history를 영구적으로 변경할 수 있기 때문에 ff-only 방식을 더 추천한다고 한다.)

  • git config pull.ff only 로 설정

--
참고