[Git] fatal: Need to specify how to reconcile divergent branches.

Dodam·2024년 6월 18일
0

[GitHub]

목록 보기
7/7
post-thumbnail

Error 발생

fatal: Need to specify how to reconcile divergent branches.

git pull을 하려고 하니 fatal: Need to specify how to reconcile divergent branches. 오류가 발생했다.

직역하자면 "서로 다른 분기를 조정하는 방법을 지정해야 한다"라는 뜻으로, git pull을 했을 때 pull 방식을 명시하라는 에러가 뜬다.
분기 처리가 정상적으로 되지 않아, 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이 생겨 혼동을 발생시킬 수 있다.

해결 방법

1. git pull --ff -only

pull 하려는 원격 저장소의 branch와 로컬 저장소의 브랜치가 fast-forward 관계일 때만 pull 허용

fast-forward

  • 두 branch가 fast-forward 관계라는 것은 둘 중 하나를 의미한다.
  • 두 branch가 갈라진 commit을 기준으로
    • 로컬 저장소에만 새로운 commit이 있고, 원격 저장소에는 없다.
    • 원격 저장소에만 새로운 commit이 있고, 로컬 저장소에는 없다.
  • 첫 번째 경우는 pull을 받을 이유가 없으므로 두 번째 경우에만 pull이 가능하다.
    만약 원격 저장소의 새로운 commit이 존재하는데 git pull을 하지 않은 상태에서 로컬 저장소에 새로운 commit을 했다면, git은 pull은 허용하지 않는다.

2. git pull --rebase

  • git config pull.rebase true: rebase 후에 pull 한다.
  • git config pull.rebase false: rebase 없이 pull 한다.

rebase: 새 branch가 시작된 분기점 commit을 기준 브랜치의 가장 최근 commit으로 변경하는 작업

  • 로컬 branch의 시작점을 원격 branch의 마지막 commit으로 옮기는 식으로, 그 과정에서 conflict가 발생할 경우 이를 해결해줘야 한다.

  • git history가 깔끔해진다는 장점이 있지만, 부주의하게 사용할 경우 별도의 알림 없이 git history를 영구적으로 변경할 수 있기 때문에 ff-only 방식을 더 추천한다고 한다.

profile
Good things take time

0개의 댓글