git pull을 하는데는 여러 옵션이 있다. 오늘은 git pull이 무엇이고, 어떤 방법들이 있는지 알아본다.
git pull은 아마 깃을 사용할 때 가장 많이 사용하는 명령어 중 하나일텐데요. 해당 명령어가 원격 브랜치의 코드를 로컬로 가져오는 명령어라는 것은 아마 모두들 알고 계실 것 같습니다. 하지만 이 간단한 명령어에도 여러 옵션들이 숨겨져 있습니다. 같이 알아보도록 하죠.
git pull 명령어 알아보기
원격 저장소에 있는 코드에 변경사항이 생겼는지 확인하는 방법은 크게 git fetch, git pull 두 가지로 나눌 수 있습니다.
먼저 git fetch는 원격 저장소에 변경사항이 있는지 "체크만" 합니다. 그리고 git pull은 변경사항 확인과 함께 실제로 로컬에 코드를 가져와 병합을 진행하죠. 아마 아래의 공식(?)을 보면 더 이해가 쉬우실 것 같습니다.
git pull = git fetch + git merge
가장 안전하게 원격 코드를 가져오는 방법은 git fetch를 통해 코드에 변경사항이 있는지 확인하고 현재 변경사항과 충돌이 없는지 확인 후 git pull을 해주는게 가장 좋습니다. 하지만 저를 포함해서 많은 분들이 그냥 git pull 명령어를 바로 때려버릴 겁니다🤣 가끔 치명적일 수 있는 merge가 바로 일어나기 때문에 git pull에는 다양한 merge 전략들이 있습니다.
git pull merge 전략
아마 git pull을 하실 때 따로 어떻게 merge 할 지 정하지 않았다면 아래와 같은 경고창을 보셨을 겁니다.
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.
git pull이 merge를 같이 진행하기 때문에 어떤 식으로 merge를 할지 결정하라는 것인데요. 크게 3가지가 있는 것을 볼 수 있습니다. 하나 씩 살펴보도록 하죠.
- git config pull.rebase false
가장 기본적인 설정으로 pull 명령을 실행했을 때 로컬과 원격 코드가 다를 때 둘을 비교하여 수정한 뒤 merge 할 수 있습니다. 여기서 중요한 것은 수정 후에 커밋을 하면 로컬에서의 수정 내용과 conflict 해결 내용 2개의 커밋이 올라간다는 것입니다. rebase를 false로 설정해주었기 때문인데요.
merge commit 생성됨
rebase는 간단히 말하면 새로운 base를 설정해주는 것으로 한 브랜치의 base를 다른 브랜치의 최신 커밋으로 base를 옮기는 작업입니다.
- git config pull.rebase true
위와 같이 충돌이 일어난 코드를 비교하여 수정한 뒤 git rebase --continue를 수행해줍니다. 아까 false와 결과는 동일하지만 한 가지 다른 점은 최신 커밋을 기준으로 1개의 커밋만 올라가게 됩니다.
merge commit 생성되지 않음
- git config pull.ff only
먼저 fast-forward(ff)에 대해 알아야 합니다. ff는 분기한 브랜치의 커밋 히스토리가 기존 브랜치의 모든 커밋 히스토리를 포함하고 있는 것입니다.
만약 ff 관계가 아닌 상태에서 새로 분기한 브랜치를 기존 브랜치에 merge 한다면 merge에 대한 새로운 커밋이 생성됩니다.
반대로 ff 관계에서 merge를 한다면 새로운 커밋이 생성되지 않고 HEAD의 위치만 분기한 브랜치의 최신 커밋으로 이동하게 됩니다.
현재 브랜치랑 병합할 브랜치가 ff 관계일때만 pull을 허용함
'개발 > Git&Github' 카테고리의 다른 글
git checkout시 발생하는 오류 error: Your local changes to the following files would be (0) | 2022.04.27 |
---|