[Git] fetch 와 Pull 의 차이점은?

msung99·2022년 2월 27일
1
post-thumbnail

이번 포스팅에서는 원격 저장소에서 커밋들을 로컬 저장소로 내려받을 때 사용하는 pull 과 fetch 명령의 차이점을 알아보겠습니다.

이 둘을 이해하시기전에 merge 란 무엇인지 이해가 필요한데, merge 에 관한 이해가 필요하시다면 아래 제 포스팅을 참고하셔도 좋습니다.

https://velog.io/@msung99/%EB%B8%8C%EB%A0%8C%EC%B9%98Branch%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-Merge-%EA%B3%BC-Conflict


Pull vs Merge

pull 과 merge 의 차이점은 병합(Merge) 처리 여부입니다.

  • PULL : pull 은 원격 레포지토리로부터 최신 커밋들을 내려받아서, 현재 로컬 브랜치와 자동으로 병합을 진행합니다.

  • Fetch : 반면 fetch 는 원격 레포지토리에서 최신 commit 코드를 이름없는 임시 브랜치로 내려받고, 병합(merge)을 진행하지 않습니다.

    • 즉, 개발자가 수동으로 직접 merge 를 진행해야 합니다.
    • 이떄 브렌치는 FETCH_HEAD 의 이름으로 체크아웃이 가능합니다.

=> 정리해보면, 사실상 pull 명령은 내부적으로 봤을때 fetch 와 merge 의 과정을 포함하고 있는 것입니다. fetch 이후 merge 를 수행하면 pull 명령과 동일한 수행 내역이 되는 것입니다.


fetch 의 병합과정

예를들어 로컬 저장소와 원격 저장소의 커밋 히스토리가 A,B 까지는 동일하나 그 이후로는 커밋 내역이 다른 상황을 생각해봅시다.

원격 저장소의 커밋 내역은 A - B - X - Y 순이며,
로컬 저장소의 커밋 내역은 A - B - C -D 순입니다.

git fetch 명령을 통해 임시 브랜치로 커밋내역을 내려받는다면, 아래와 같은 히스토리가 구성이 될 겁니다.

이때 FETCH_HEAD 라는 포인터가 이름없는 임시 브랜치를 가리키고 있으며, 이 포인터를 활용해 체크아웃도 가능합니다.

이 상태에서 원격 저장소의 내용을, 즉 임시 브랜치의 내용을 로컬 저장소의 master 브랜치에 병합하고 싶은경우 'FETCH_HEAD' 브랜치를 git merge 명령어를 통해 병합시키거나, 다시 pull 실행하면 됩니다.

( FETCH_HEAD 는 임시 브랜치를 가리키는 포인터라고 말씀드렸는데 직전에 FETCH_HEAD 브랜치라는 언급이 있어서 혼동되실 수 있습니다. 엄일히는 포인터가 맞으나, 통상적으로는 FETCH_HEAD 브랜치이므로 FETCH_HEAD 브랜치라고도 부를 수도 있는 것입니다.)

병합 결과로, 위와 같이 로컬 저장소에 커밋 Y 뒤에 새로운 커밋 E 가 생성됨을 알 수 있습니다.


언제 사용해야할까?🤔

fetch 와 pull 을 각각 언제 활용하는 것이 좋은지에 대해 알아봅시다.

  • pull : 원격 레포지토리가 로컬 레포지토리에 비해 더 최신 커밋이 존재할때만 내려받도록 합니다.
  • fetch : 원격 레포지토리와 로컬 레포지토리의 변경 사항이 다를때, 이를 비교 및 대조하는 확인 작업이 필요할때 사용합니다.

    • 확인 작업을 꼼꼼히 진행후에, git merge 명령어를 통해 최신 커밋내역을 반영하거나 충돌 문제를 해결할 수 있습니다.
profile
https://haon.blog

0개의 댓글