얼마 전에 다음과 같은 에러가 발생해서 git pull이 안 되었던 적이 있습니다. git reset 같은 명령어를 잘못 수행하면 head가 꼬여서 저런 문제가 발생할 수 있습니다.
그러면 이미지의 hint에 나오는대로
git config pull.rebase false
git config pull.rebase true
git config pull.ff only
세 명령어 중 하나를 입력하면 됩니다. 설명 들어갑니다.
git config pull.rebase false
기본 방식입니다. git pull을 받아올 때 받아온 원격 브랜치를 merge합니다. merge 시 새로운 커밋 하나가 생기며 합쳐지는데 보통 이름이 "Merge remote tracking branch 'origin/main'으로 되어 있습니다.
원격 A -> B -> C
기존 D -> E
에서 D -> E -> F(Merge remote tracking branch 'origin/main') 이 되는 겁니다. 원격 브랜치는 나중에 F 브랜치를 fast forward 할 수 있습니다. fast forward 설명은 밑에 있습니다.
git config pull.rebase true
git pull을 받아올 때 받아온 원격 브랜치를 rebase합니다. 이렇게 하면 새로운 커밋은 생기지 않지만 기존 브랜치 위에 원격 브랜치의 커밋이 모두 올라가 버립니다.
원격 A -> B -> C
기존 D -> E
에서 D -> E -> A -> B -> C가 되어 버립니다. merge가 좋은지 rebase가 좋은지는 호불호의 영역이라 고르시면 됩니다.
git config pull.ff only
가장 간단한 방법인데, ff는 fast forward를 의미합니다. ff only는 fast forward만 가능하게 한다는 뜻입니다. 이것을 하려면 원격과 기존 브랜치가 분리되어 있으면 안 됩니다.
원격 A -> B -> C
기존 A -> B 인 경우는
A -> B -> C로 빠르게 pull 하는 게 fast forward 방식입니다.
원격 A -> B -> C
기존 A -> B -> D 인 경우에는 사용할 수 없습니다.
제한적인 방법이지만 가장 쉬운 방법입니다.
해결 방법
그래서 해결 방법이 뭐냐고요? 기본 값인 merge 모드에서 에러가 나는 것이므로 git config pull.rebase true를 하고 git pull을 받으시면 됩니다. 끝나고 다시 git config pull.rebase false로 되돌려 놓는 것도 잊지 마세요.