git pull 을 별도 옵션 없이 하게되면 다음과 같은 warning 이 발생하는 것을 볼 수 있습니다.
warning: Pulling without specifying how to reconcile divergent branches is
discouraged. You can squelch this message by running one of the following
commands sometime before your next pull:
git config pull.rebase false # merge (the default strategy)
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.
이는 별도의 옵션 없이 merge 하는 경우 원하지 않는 방향으로 merge 가 될 수 있다는 경고의 문구입니다.
그렇다면, 왜 이러한 오류 문구를 표시하고, 어떻게 대처해야되는지 알아보도록 하겠습니다.
기본 Git Pull 의 문제점
git pull --help
를 보면 Description 에 다음과 같은 내용이 있는 걸 볼 수 있습니다.
... In its default mode, git pull is shorthand for git fetch followed by git merge FETCH_HEAD.
위의 내용을 보면 git pull 은 git merge FETCH_HEAD
와 같이 동작한다는 것을 알 수 있습니다.
즉, 기본 mode 같은 경우, git pull 을 수행하게 되면 git merge commit 을 생성하게 됩니다. 따라서, 기존에 존재하지 않는 commit 이 자동으로 생기게 됩니다.
따라서, pull 을 받을 때 마다 불필요한 merge commit
이 생기게 되는 것입니다.
다음 이미지와 같은 상황이 발생했다고 가정해보겠습니다.
Local branch 에 작업을 하는 도 중 다른 누군가가 remote 에 새로운 commit 을 만들었습니다.
만약 이런 경우 git pull
이나 git pull origin master
를 별도의 옵션없이 실행하면 다음과 같은 상황이 발생합니다.
만약 작업을 다른 branch 에서 하고 있다면 또 다른 문제가 발생합니다.
만약, develop 이라는 branch 에 check-out 후 git pull origin master
를 작업한다면 local master 에 작업되는 것이 아닌, 작업 중인 branch 에 merge 가 되는 상황이 발생하게 됩니다.
Git Pull --ff-only 동작 원리
이러한 상황을 방지하기 위해서 Git 에서는 이러한 commit 이 생기는 것을 방지하는 옵션을 제공하고 있습니다.
만약, git pull --ff-only
의 옵션을 주어 실행하게 되면 fast-forwarded
가 새로운 commit 이 발생하지 않고 실행됩니다.
만약, pull 을 받고자하는 branch 와 현재 branch 가 fast-forward 관계가 아니라면 다음과 같은 오류가 발생하게 됩니다.
* branch master -> FETCH_HEAD
593a5e1..208efa3 master -> origin/master
fatal: Not possible to fast-forward, abortin
이러한 경우, branch 가 fast-forward 관계가 아닌지 확인해봐야 합니다.
fast-forward 관계란?
이러한 경우 git rebase 나 git merge 로 fast-foward 관계로 정리해주어야 합니다.
--rebase 와 --ff-only 의 차이점
--ff-only 와 다르게 git history 를 정리하기 위해서 자주 사용되는 옵션이 있습니다.
바로 --rebase
입니다.
git --rebase
는 만약 위와 같은 상황에서 실행하게 되면 다음과 같은 모양이 됩니다.
git rebase 같은 경우 history 가 정리가 된다는 장점이 있지만, rebase 같은 경우 잘 알지 못하고 사용하게 되면, 별도의 알림 없이 영구적으로 history 를 임의로 변경시키기 때문에 주의가 필요합니다.
자동 설정
git pull --ff-only 를 기본 정책으로 가져갈 경우 매번 입력해야되는 번거로움이 존재합니다.
또한, 만약 실수로 빼먹고 작업을 하게되면 history 가 꼬이는 상황이 발생할 수 있기 때문에 기본설정이 필요한 경우가 있습니다.
- --ff-only 기본 옵션
$ git config --global pull.ff only
- --rebase 기본 옵션
$ git config pull.rebase true
위와 같이 설정을 하게되면 git pull 의 default 옵션으로 지정되어 옵션이 주어져 실행됩니다.
결론
git history 는 협업 시 중요한 요소가 되곤 합니다.
만약, history 가 정리되어 있지 않다면 어느 순간에는 돌이킬 수 없는 상황이 발생합니다.
즉, 이러한 상황을 방지하기 위해서 팀에 어떤 전략이 맞는지 확인해서 기본설정을 맞추거나 git flow 정책을 세워 가져가면 더 나은 버전관리를 만들어 나갈 수 있습니다.
출처
blog.sffc.xyz/post/185195398930/why-you-should-use-git-pull-ff-only-git-is-a
'GIT' 카테고리의 다른 글
[GIT] Git merge 충돌 발생 시 해결 (0) | 2020.04.27 |
---|---|
특정 Branch 만 git clone 받기 (0) | 2019.07.14 |