본문 바로가기

GIT

[GIT] Git pull 전략 (default, --ff -only, --rebase)

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 관계란?

http://blog.naver.com/PostView.nhn?blogId=parkjy76&logNo=220308638231&categoryNo=73&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postView

 

이러한 경우 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 가 꼬이는 상황이 발생할 수 있기 때문에 기본설정이 필요한 경우가 있습니다.

  1. --ff-only 기본 옵션

$ git config --global pull.ff only

  1. --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