git

#28 깃(Git) - git fetch

에이블디 2021. 12. 14. 15:36

안녕하세요! 에이블디입니다!

 

오늘은 지난 시간에 이어 깃허브 리포지토리의 정보를 가져오는 방법에 대해 알아볼 거예요!

pull 명령이 깃허브 리포지토리의 커밋을 가져와서 무조건 로컬 리포지토리와 합치는 것이라면, 오늘 배울 fetch 명령은 깃허브 리포지토리에 어떤 변화가 있는지 그 정보만 가져오는 명령어예요.

팀 작업을 할 때 다른 사람이 수정한 소스를 한번 더 훑어보고 로컬 리포지토리와 합치고 싶다면 pull 대신 fetch를 사용해서 커밋을 가져온 다음 로컬 리포지토리와 합치면 됩니다.

 

그럼 바로 실습해 볼까요?

 

터미널 창에서 지난 시간에 만들어 둔 abled-office 디렉터리로 이동하셔서 git fetch 명령을 입력해 주세요!

$ cd ~/abled-office
$ git fetch

깃허브 리포지토리에서 무언가를 가지고 오고 있는 걸 볼 수 있네요!

 

그럼 ls -al 명령을 사용해서 어떤 파일이 있는지 살펴볼까요?

$ ls -al

깃허브 리포지 토리에 있는 커밋을 가져왔는데 지난 시간에 abled-home에서 깃허브 리포지토리로 푸시했던 difference.txt 파일이 보이지 않습니다.

 

어떻게 된 건지 git log 명령을 사용해서 살펴보도록 해요.

$ git log --oneline

'add office work' 앞에 (HEAD -> master)만 보이고 깃허브 리포지토리의 origin/master는 보이질 않네요!

깃허브 리포지토리의 최산 커밋 정보를 가져왔지만 아직 로컬 리포지토리에 합치지 않아 원래 abled-office에 있던 최신 커밋만 나타나기 때문입니다.

 

그럼 이번엔 git status 명령을 사용해 볼까요?

$ git status

현재 브랜치가 origin/master에 비해 1개의 커밋이 뒤쳐저 있다고 나오네요! 즉 깃허브 리포지토리의 최신 커밋 하나가 아직 로컬 리포지토리에 반영되지 않았다는 뜻입니다.

git pull 명령을 사용하면 로컬 리포지토리를 업데이트할 수 있다고 알려주고 있네요!

 

그렇다면 fetch로 가져온 최신 커밋 정보는 어디에 있을까요?

fetch로 가져온 깃허브 리포지토리의 정보는 origin/master 브랜치가 아닌 FETCH_HEAD라는 브랜치로 가져옵니다.

이 브랜치로 가져온 정보는 로컬 리포지토리에 바로 반영되지 않아요.

 

그림으로 표현하자면 아래 그림과 같은 느낌입니다.

그럼 fetch 해서 가져온 최신 커밋을 살펴보러 FETCH_HEAD 브랜치로 체크아웃해볼까요?

$ git checkout FETCH_HEAD

체크아웃이 완료되었으면 git log를 사용해 보세요.

$ git log --oneline

최신 커밋인 'create difference.txt'에 origin/master와 origin/HEAD가 표시되어있고 master는 'add office work' 커밋에 머물러 있는 걸 볼 수 있습니다.

fetch로 'create difference.txt' 커밋을 가져온 것이 확인되네요!

이 내용을 살펴보고 깃허브에서 가져온 최신 커밋 내역을 로컬 리포지토리에 합칠지 말지 결정하면 됩니다.

 

fetch 한 후에 최신 커밋을 현재 브랜치에 합치려면 git pull 명령을 사용하여 깃허브 리포지토리의 소스를 내려받을 수도 있고, git merge 명령으로 FETCH_HEAD에 있던 커밋을 머지할 수도 있습니다.

이번 시간에는 git merge 명령으로 FETCH_HEAD 브랜치를 머지해 보겠습니다.

master 브랜치로 체크아웃해서 머지해주세요!

$ git checkout master
$ git merge FETCH_HEAD

머지가 완료되었으면 git log 명령을 사용해서 커밋 로그를 확인해 주세요.

$ git log --oneline

'create difference.txt' 커밋이 로컬 리포지토리에 반영된 것을 볼 수 있습니다.

 

이번 시간에 살펴본 것처럼 git pull 명령은 git fetch 명령과 git merge FETCH_HEAD 명령 두 개를 합친 것과 같은 기능을 합니다.

즉 git fetch를 사용해 깃허브 리포지토리에 있는 브랜치를 가져온 다음 git merge 명령을 사용해 깃허브 브랜치와 현재 브랜치를 합쳐주는 것을 git pull 명령으로 한꺼번에 할 수 있는 것이죠!

 

그러면 fetch로 가져온 브랜치를 머지하는 방법을 좀 더 알아볼까요?

 

fetch 한 뒤 머지할 때 깃허브 master 브랜치에 있는 커밋이라면 다음과 같이 머지합니다.

$ git merge origin/master

깃허브의 또 다른 브랜치에 있는 커밋이라면 다음과 같이 머지합니다.

$ git merge origin/브랜치 이름

하지만 매번 브랜치 이름을 써야 한다면 번거롭겠지요? 그래서 다음과 같이 명령하면 fetch 한 뒤에 로컬 리포지토리에 반영하지 않은 최신 커밋을 머지할 수 있습니다.

$ git merge FETCH_HEAD

 

이번 시간에는 fetch에 대해 알아보았어요!

 

도움이 많이 되셨으면 좋겠습니다!

 

그럼 다음 시간에 깃허브에 대해 좀 더 알아보도록 할게요!

 

여러분 다음에 또 봐요!