IT학습/Github&Git

[Git] git fetch와 git pull

바틀비 2024. 1. 3. 12:32

github에 있는 변경사항을 로컬저장소에 가져오고 병합하기 위한 기능들.

fetch나 pull을 하기 전에 remote -v 를 통해 원하는 원격저장소와 연결이 되었는지 확인한다. 만약 원치 않은 원격저장소 (예시는 wrong)과 연결되어있다면 remove를 통해 연결을 삭제하고 add를 사용하여 다시 연결한다.

$ git remote -v
wrong  https://github.com/--------.git (fetch)
wrong  https://github.com/--------.git (push)

$ git wrong remove wrong

$ git remote add origin https://github.com/--------.git

$ git remote -v

origin  https://github.com/--------.git (fetch)
origin  https://github.com/--------.git (push)'

git fetch

원격 저장소의 변경 내용을 로컬 저장소로 가져오기 전, 변경된 내용이 있는지 먼저 확인하고 싶을 때 사용하는 명령어다.
원격 저장소의 변경내용을 로컬 터미널로 "fetch" 해온다.
명령어 git fetch 원격저장소이름 를 실행하면 아래와 같은 결과가 출력된다.

$ git fetch origin
remote: Enumerating objects:
remote: Counting objects:
remote: Compressing objects:
remote:
Unpacking objects:
From https://github.com/username/reponame
   748f18b..5fc4dc7  main       -> origin/main

fetch하고 $ git branch -r 명령어를 입력해 checkout이 가능한 브랜치 내역들이 나온다. 아래의 예시에서는 origin/main이 가능하다고 출력된다.
바로 git checkout origin/main 명령어를 입력해 해당 브랜치로 들어간다. 이때 detached HEAD상태에 들어가고 fetch 내용이 로컬에 저장되지 않고 브랜치로 checkout한다. 이때 변경된 내용들을 확인만 가능하다.

$ git branch -r
  origin/HEAD -> origin/main
  origin/main
  
 $ git checkout origin/main
 
 HEAD is now at 5fc4dc7 Update README.md
 
 """
 다음과 같은 조언이 출력될 수 있다.
 
 You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false
 """


$git log 명령어를 통해서 fetch한 commit 내역을 확인할 수 있다.
아래의 예시를 아래에서 위로 해석한다.
User1(이메일:user1@gmail.com)이 1월 3일 오전 5시경, 오전 9시경에 로컬에서 업데이트하고 원격저장소로 commit했다.
이어서 fetch 명령어를 실행하니 User2(이메일: user2@gmail.com)가 오전 9시 35분경에 READ.md를 Update했다는 기록을 확인할 수 있다.
마지막에 q를 입력해 log에서 나간다.
그리고 $git switch 를 실행해 detached HEAD 상태에서 나가 원래 브랜치로 돌아온다. 이때 로컬이 "origin.main" 으로부터 몇 개의 커밋이 밀렸는지 다시 알려준다. 원래 브랜치에 돌아오면서 checkout으로 볼 수 있었던 변경내용들이 사라지고 원래 로컬에 저장된 상태로 돌아온다.

$ git log
commit 5fc4dc7d274ca0c2714da414513be95f6838e566 (HEAD, origin/main, origin/HEAD)
Author: User2 <user2@gmail.com>
Date:   Wed Jan 3 09:35:25 2024 +0900

    Update README.md

commit 748f18b3dd51a341613efb6b2ec4c14d41362b82 (main)
Author: User1 <user1@gmail.com>
Date:   Wed Jan 3 09:34:41 2024 +0900

    update

commit 5af5bde6b2f9c738dfff095576cc2cde90a9b4ab
Author: User1 <user1@gmail.com>
Date:   Wed Jan 3 05:35:41 2024 +0900

    update

: #q를 입력해서 log에서 나가기

$ git switch -
Previous HEAD position was 5fc4dc7 Update README.md
Switched to branch 'main'
Your branch is behind 'origin/main' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)

 

git pull

원격저장소에 있는 변경사항들을 로컬저장소에 가져와 합치는 명령어이다.
fetch와 다르게 로컬에 변경사항을 병합한다.

$ git pull origin