본문 바로가기
Programming/DevOps, Tools

[GIT 좀 더 이해하기] 1. fetch와 pull의 차이점

by kghworks 2023. 4. 19.

 

회사에서 깃을 도입하려 하면서 깃을 먼저 실험해 보는 입장이 되었습니다.

이전에 퍼블리셔, 프리랜서 앱개발자들과 깃 (깃헙)을 아주 신명 나게 사용했어서, 이번회사에서 깃으로의 전환 소식은 기쁘지 아니할 수 없습니다. 

 

프리랜서 시절 447 contributions in 2020

 

오래간만에 깃을 만져보면서, 새록새록 떠오르는 모호한 개념들을 소재로 포스팅을 만들어가보겠습니다. (제가 이해하고자 하는 목적도 있어요)

시리즈명은

GIT 좀 더 이해하기

 

이 포스팅은 깃의 전반적인 이해 (remote / local repostiory, push, pull, commit 기타 등등)을 얇게 하고 있다는 전제로 합니다.

 


시리즈의 첫번째 주제로 fetch와 pull이 뭐가 다른지 살펴보겠습니다.

 

  • fetch : 가져오기
  • pull  : 가져와 병합하기

fetch는 최신 이력을 가져와서 확인하는 거고, pull은 최신 이력을 가져와 병합하는 거라 간단한 차이입니다.

 

그런데 이 두 명령어는 깃을 자주 쓰는 분들도 명확히 짚지 않으시기도 합니다. fetch건 pull이건 뭐 안될 때는 막 눌러보지 않습니까? 그러니 fetch를 해도 뭔가 가져오는 거 같고, pull을 해도 가져오는 거 같고.. 

 

왜 사람들이 헷갈릴까요. 병합(merge)을 먼저 짚어보겠습니다.


Merge

: 다른 저장소 (local, remote)간에 소스를 병합 (remote -> local, remote <-> remote)

 

병합 (merge)은 깃 (협업)에서 아주 중요한 개념입니다.

 

master / feture1 2개의 브랜치가 있다고 가정하겠습니다.

 

merge를 경우에 따라 다음과 같이 정의합니다. (개인적으로)

 

  • 갱신 (master remote -> master local) : remote 저장소의 최신 버전을 local 저장소에 갱신
  • 반영 (feture1 remote -> master local): 다른 remote 저장소의 최신 버전 (다른 사람이 변경한 이력)을 내 local 저장소에 반영
  • 병합 (feture1 remote -> matser remote): remote에서 다른 remote의 버전을 가져와 병합 (ex. pull request)
  • 그니까 merge는 다른 브랜치의 소스를 특정 브랜치와 합치는 것

 

merge를 언제하나요

  • 갱신 : master remote의 최신 버전을 master local로 가져올 때
  • 반영 : feture1 remote의 새로운 기능을 master local로 가져옴
  • 병합 (pull request) : feature1의 새로운 기능을 master remote에 바로 병합

 

이제 fetch와 pull을 비교해 봅시다.


fetch & merge,  pull

모든 작업은 feature1 브랜치에서 작업 중입니다.

rankingGirlGroup.txt에 우리나라 최고의 가수 순위가 적혀있습니다.

 

intellij (feature1 local)
github (feature1 remote)

뉴진스가 데뷔합니다.

옆자리 대리님이 우리나라 최고의 가수는 뉴진스라고 대리님 자리에서 파일 내용을 바꾸고 push 하고 퇴근합니다.

github (feature1 remote)

 


fetch & merge

: remote의 변경 이력을 먼저 확인 -> merge (갱신)

 

local에선 여전히 소녀시대가 1등입니다. remote에서 무슨 일이 일어났는지 알지 못합니다.

intellij (feature1 local)
intellij git log

 

remote(최신)와 remote (내 pc)local이 서로 다른 상황입니다. 제 PC는 수정여부를 알지도 못하고 있죠.

 

일단 최신이력을 확인만 해보겠습니다. (fetch)

git fetch

intellij (git log)

뉴진스가 1등이라는 commit이 보입니다! 저는 remote에서 수정이 있었다는 걸 감지합니다.

git fetch를 통해 최신 remote 이력을 가져온 겁니다. (가져만 온겁니다)

 

이제 다음 단계입니다.

여전히 제 local repository는 소녀시대가 1등이죠. merge 해서 최신 랭킹을 제 local에 불러와보죠. (갱신)

 

git merge origin/feature1

 

intellij (feature1 local)

 

마침내 최신 remote가 제 local에 들어왔네요. 

 

Pull

:fetch + merge = 최신 remote를 한방에 lcoal에 merge (갱신)

 

이렇게 fetch 후 merge 말고 한 번에 처리할 수도 있습니다. 

이번엔 아이브가 데뷔하면서 아이브가 1등을 차지합니다. 옆자리 대리님이 또 바꾸고 push 하고 가셨네요.

github (feature1 remote)

 

저는 다음날 출근해서 fetch고 나발이고 그냥 소스만 최신 remote에 맞추고 싶습니다. 어차피 대리님이 만날 최신 랭킹을 적어서 push 하고 있으니까요

 

그럼 그냥 pull 하면 됩니다. 

 

git pull origin main

intellij. (feature1 local)
intellij (git log)

 

알아서 변경사항을 확인 (fetch)하고 병합 (merge)했네요.


정리

 

  • fetch = 최신 remote 정보 가져오기
  • pull = fetch + merge

 

 fetch는 remote 최신 이력을 모두 가져와보는 겁니다. 일단 가져와서 확인하는 거죠. fetch를 어떻게 활용할 수 있을까요. 저는 보통 retmote에 무슨 일이 일어나고있는지 확인하는 용도로만 씁니다. 다른 브랜치도 궁금하고 그러니까요. 지금 git에서 무슨일이 일어나고 있나 모니터링하는 용도죠 (git log). 그리고 fetch 안 하고 맘대로 push 하고 그러면 push 거부당할 수도 있어요. 

 ! [rejected]        main -> main (fetch first)
error: failed to push some refs to '...github repository url...'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

[rejected] push

* push 하기 전에 pull 먼저 하라고 야단난 화면

 

 pull은 fetch가 귀찮을 때 씁니다. 언제 귀찮냐면 혼자 작업하는 브랜치에서 귀찮습니다. 딱히 누군가 브랜치를 수정하고 있지 않으니까요. 이땐 자리를 바꾸거나 pc를 바꿨을 때 pull 하면서 작업을 시작합니다.

 


참고

https://backlog.com/git-tutorial/kr/intro/intro5_1.html

 

누구나 쉽게 이해할 수 있는 Git 입문~버전 관리를 완벽하게 이용해보자~ | Backlog

누구나 쉽게 알 수 있는 Git에 입문하신 것을 환영합니다. Git을 사용해 버전 관리를 할 수 있도록 함께 공부해봅시다!

backlog.com

 

댓글