원격 저장소의 데이터를 로컬 저장소에 가져와 병합하기
먼저 아래 그림과 같이 로컬 저장소의 모든 변경 사항이 반영되어 있는 상태에서 새로운 변경 사항이 있는 원격 저장소의 커밋 Y 를 로컬로 가져오는 경우를 살펴 보도록 하겠습니다.
이런 경우, 단순히 'fast-forward 병합'이 이루어집니다. 그림 속의 'master'는 로컬 저장소의 'master' 브랜치, 'origin/master' 는 원격 저장소 'origin' 의 'master' 브랜치를 나타냅니다.
그러나 로컬 저장소의 'master' 브랜치에서도 변경 사항이 생긴 경우, 양 쪽의 변경을 통합할 필요가 있습니다.
이 때 pull 을 실행하여 소스를 병합할 수 있습니다. 충돌하는 변경이 없을 경우 자동적으로 병합 커밋이 만들어 지지만, 충돌이 있을 경우에는 충돌난 부분을 수동으로 해결한 다음 직접 commit 을 해 주어야 합니다.
pull 을 실행하면, 원격 저장소의 내용을 가져와 자동으로 병합 작업을 실행하게 됩니다. 그러나 단순히 원격 저장소의 내용을 확인만 하고 로컬 데이터와 병합은 하고 싶지 않은 경우에는 fetch 명령어를 사용할 수 있습니다.
fetch 를 실행하면, 원격 저장소의 최신 이력을 확인할 수 있습니다. 이 때 가져온 최신 커밋 이력은 이름 없는 브랜치로 로컬에 가져오게 됩니다. 이 브랜치는 'FETCH_HEAD'의 이름으로 체크아웃 할 수도 있습니다.
예를 들어, 로컬 저장소와 원격 저장소에 B에서 진행된 커밋이 있는 상태에서 fetch 를 수행하면 아래 그림과 같이 이력이 남겨집니다.
이 상태에서 원격 저장소의 내용을 로컬 저장소의 'master' 에 통합하고 싶은 경우에는, 'FETCH_HEAD' 브랜치를 merge 하거나 다시 pull 을 실행하면 됩니다.
⚠️ 이렇게 fetch 후 merge 를 수행하면, pull 명령을 실행했을 때 와 같은 이력이 만들어집니다.
사실 pull 이라는 것은 내부적으로 보면 fetch + merge 이기 때문이죠!