[GitHub 기초] fetch, pull
카테고리: GitHub
태그: Git
“[GitHub 기초] Branch, checkout - 2” 과 이어지는 내용을 다룰 것이므로 “[GitHub 기초] Branch, checkout - 2” 를 먼저보고 해당 포스트를 보는 것을 추천한다.
개요
여러 사람 혹은 여러 기기에서 프로젝트를 수정, 관리 할 경우 내가 작성중인 프로젝트 데이터가 최신의 버전이 아닐 수 있다(내가 작성하는 사이 다른 기기 혹은 다른 사람으로 부터의 push로 인해). 그럴 경우 원격 저장소에서 데이터를 가져와 버전 기록을 일치시켜 주어야 하는데 이때 사용하는 기능이 바로 fetch와 pull이다.
우선 fetch와 pull을 연습하기 위해 서로 다른 경로의 2개의 폴더에 하나의 원격 저장소를 복제하여 2개의 창을 띄워보자 각각의 창은 서로 다른 기기의 환경이라 가정한다. 원격 저장소는 기존의 저장소를 사용해도 좋다. 물론 서로 다른 기기의 환경에서 실행해보아도 좋다.
fetch
우선 왼쪽 창에서 새로운 작업을 실행한 뒤 스테이징 > commit > push를 진행해보자.
이제 오른쪽 창으로 돌아와 새로운 작업을 실행한 뒤 스테이징 > commit > push를 진행해보자
$ git push origin master
# To https://github.com/Skipancho/Example.git
# ! [rejected] master -> master (fetch first)
# error: failed to push some refs to 'https://github.com/Skipancho/Example.git'
아마도 오른쪽 창에서는 위와 같은 메시지가 출력되고 push에 실패할 것이다. 이것은 오른쪽 창에서 진행하고 있는 저장소가 최신 버전이 아니라서 push요청이 거부되었기 때문이다. 이런 경우 다른 사람 혹은 다른 기기(현재는 left)에서 push한 변경 내역을 내 저장소(로컬, 현재는 right)에 갱신해야하는데 이때 사용되는 기능이 바로 fetch와 pull이다.
우선 fetch를 한번 실행해보자
#$ git fetch (원격 저장소 이름)
$ git fetch origin
이후 Git Graph를 살펴보면 다음과 같이 갈라진 브랜치를 확인할 수 있을 것이다. log를 확인해 보아도 좋다. (Git Graph에 대한 내용은 후에 다른 포스트에서 설명하도록 하겠다 우선은 이미지를 보고 작업의 흐름을 확인하도록 하자)
origin/master가 현재 원격 저장소 최신 버전의 커밋이므로 오른쪽 창의 master와 병합(Merge)하는 것으로 하나의 버전으로 새로 커밋할 수 있다.
$ git merge origin/master
$ git push origin master
pull
pull은 내부적으로 fetch + merge 라고 할 수 있다. 충돌이 없는 한 자동으로 merge를 해주므로 더 쉽게 내 저장소를 최신화 할 수 있다. 현재 오른쪽 창에서 push를 진행하여 최신 버전이 변경되었으므로 왼쪽 창에서 pull을 진행해보자
# $ git pull (원격 저장소 이름)
$ git pull origin
이후 Git Graph를 확인해 보면 깔끔하게 Merge까지 완료된 모습을 확인할 수 있다.
※ push를 하기전 pull 또는 fetch를 먼저 하는 것을 생활화 하자!!
간혹 pull을 하는 중 같은 파일에 대한 다른 작업으로 인한 충돌이 발생할 수 있는데 이는 Branch에서 충돌을 다루는 것과 동일하다.