본문 바로가기

TIL/Git & Github

[TIL][Git][CLI] GitHub 랑 Git 이랑 다른 거야? - 3. fetch / pull 하기

 만일 내가 깃허브에서 클론 해와서 내 로컬에서 새로운 커밋을 만들고 있는데 그 사이 다른 누군가 그사람의 새로운 커밋을 깃허브에 올리면 나는 그 변경된 커밋들이 현재 내 로컬 repo에는 없는데 어떻게 협업을 하지?

그럴 때 쓰는 명령어가 git pull /git fetch 이다.

 

나의 개인적인 주관이지만 어감상

 

pull 한다. : 왜인지 당겨온다니까 '파일을 받아 끌어당긴다' 라는 느낌일 것 같다.

 

fetch 한다. : 생소한 단어라 한국어발음으로 검색하니 강아지들이 물어오는 행위를 나타내는 것 같다.

                     pull 과 달리 당기기까진 아니고 내앞까지 가져오는 것 같다,

 

어쨌거나 두 가지 다 remote repo에서 다른 사람이 올린 수정된 커밋들을 가져오는 명령어다.

이름이 다르면 다른 점이 적어도 하나 있는 법

 

가장 큰 차이는 수정된 커밋을 어디까지 옮겨놓는냐이다.

 

지난 번에 올린 글에 작업 공간을 참고해서 보면

 

git fetch는 Repository 까지

git pull은 Working Tree 까지

 

자세한 설명에 앞서 두가지 pointer에 대해서 알아보고 fetch 를 해보자

 

remote 에서 복제 해온 레포

 

head 가 두 가지 있다. 

현재 나의 로컬 작업환경 에 따라 움직이는 master ,  remote repo에서 받아온 순간 고정된 origin/master.

 

만일 새로운 커밋을 하고 push는 하지 않으면

 master 는 움직이고 origin/master 는 고정되어있다.

push 한다면 origin/master  옮겨간다. 

 

이제 내 로컬에 없는 새로운 커밋이 생기는 경우

나는 아래와 같이 깃허브를 통해서 커밋을 해봤다. 왜냐 다른 contributor 가 없으니까

 

아직 내 개인 로컬에서 아무것도 하지 않은 상태로

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

아까 푸시하고 나서  origin/master 가 옮겨졌다는 메세지만 뜬다.

 

1. fetch 하기  :  git   fetch   remote이름     fetch해올브랜치이름

git fetch origin master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 734 bytes | 367.00 KiB/s, done.
From https://github.com/이름/Shopping
 * branch            master     -> FETCH_HEAD
   45fd4d2..cef893f  master     -> origin/master
git status
On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)

nothing to commit, working tree clean

내가 받아온 remote repo의 해드인 origin/master 은 나보다 1 커밋 앞서 있다. 그래서 간단하게 merge 할 수 있다.

만일 너의 로컬 브랜치 master을 업데이트 하라면 git pull 을 사용해라

 

2. pull 하기 :  git pull remote레포이름 새로생긴커밋있는브랜치이름

git pull origin master
From https://github.com/이름/Shopping
 * branch            master     -> FETCH_HEAD
Updating 45fd4d2..cef893f
Fast-forward
 groceries.txt | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

 

이는 정말 간단한 방법으로 브랜치도 기본값 하나뿐인 master으로 시도해본 것이지만

실제로는 이렇게 안쓰고 

내가 만들던 브랜치와 

남이 만든 브랜치를 같은 곳에 합치거나 아님 새로 마스터에 합치는 식으로 이루어지는데

이때 충분히 문제가 생길 수 있다.

 

merge할 때 다양한 방법이 있듯이

pull 할 때도 마찬가지로 다양한 루트가 있다.

차차 익숙해지자