팀과제를 겪으면서 git을 통하여 프로그램 형상유지를 위하여 push를 하거나 pull을 하다보면 오류를 겪을 때가 있다.
오늘은 git Merge로 내 브랜치에 pull 하면서 Merge가 안되는 오류로 인해서 찾아보았던 에러들을 해결하는 몇가지 방법을 알아 보겠다.
힌트: You have divergent branches and need to specify how to reconcile them.
힌트: You can do so by running one of the following commands sometime before
힌트: your next pull:
힌트:
힌트: git config pull.rebase false # merge
힌트: git config pull.rebase true # rebase
힌트: git config pull.ff only # fast-forward only
힌트:
힌트: You can replace "git config" with "git config --global" to set a default
힌트: preference for all repositories. You can also pass --rebase, --no-rebase,
힌트: or --ff-only on the command line to override the configured default per
힌트: invocation.
fatal: Need to specify how to reconcile divergent branches.
보통 에러시 이러한 힌트와 함께 오류가 발생한다.
Merge (default)
Local Feature에서 작업을 하는 도중, 다른 누군가가 Remote Main에 새로운 commit을 만들었다고 가정한다.
이때 만약 Local Feature에서 Remote Main을 pull 한다면.
merge 방식의 경우, Local Feature에 추가적인 merge commit을 생성하게 된다.
아래는 merge 방식 적용 코드
# 해당 repo에만 적용
git config pull.rebase false
# 모든 repo에 적용
git config --global pull.rebase false
rebase
Local Feature에서 작업을 하는 도중, 다른 누군가가 Remote Main에 새로운 commit을 만들었다고 가정한다.
- 이때 만약, Local Feature에서 Remote Main을 pull한다면,
- rebase 방식의 경우, Local Feature에 추가적인 merge commit을 생성하지 않고,
- Remote Main commit에 Local Feature의 commit을 연결합니다.
아래는 rebase 방식 적용 코드
# 해당 repo에만 적용
git config pull.rebase true
# 모든 repo에 적용
git config --global pull.rebase true
fast-forward
현재 브랜치랑 병합할 브랜치가 fast-forward일 경우에만 Pull이 가능한 방식입니다.
- 분기한 브랜치의 커밋 히스토리가 기존 브랜치의 커밋 히스토리를 포함하고 있다면 fast-forward 관계입니다.
fast-forward 관계(O)
- master에서 feature로 분기된 브랜치의 커밋 히스토리는 A-B-X-Y이다.
- 그리고 기존 브랜치인 master의 커밋 히스토리는 A-B이다.
- 따라서, 분기된 브랜치인 feature의 히스토리는 기존 master 브랜치의 히스토리를 포함하고 있으므로,이는 Fast-Forward 관계이다.
- 이런 관계에서 master 브랜치에서 git merge [feature브랜치명]을 실행한다면,
- merge에 대한 새로운 commit이 생기지 않고 HEAD의 위치만 변하게 된다.
fast-forward 관계 (X)
- 분기된 feature 브랜치의 커밋 히스토리는 A-B-X-Y이다.
- 그리고 기존 브랜치인 master의 커밋 히스토리는 A-B-C이다.
- feature의 히스토리가 master의 히스토리를 모두 담고 있지 않다.
이런 경우에, master 브랜치에서 git merge [feature브랜치명]을 실행한다면,
merge에 대한 새로운 commit이 생기게 된다.
아래는 fast-forward 방식 적용 코드.
# 해당 repo에만 적용
git config pull.ff only
# 모든 repo에 적용
git config --global pull.ff only
결론
- merge
- merge commit 생성된다.
- rebase
- merge commit 생성되지 않는다.
- ff
- 현재 브랜치랑 병합할 브랜치가 fast-forward일 경우에만 Pull 허용한다.
참고.