이번시간에는 git
에서 원격저장소에있는 내용을 지역저장소로 옮길때 2가지 방식이 있는데 pull
과 fetch
를 알아보고 그 차이를 알아보겠습니다.
home
과 office
디렉토리를 저장소로 만들어 주었고 github
와 연결한 상태입니다.
office
에서 f1.txt
를 만들어 줍니다.
이후 commit
을 해주고 push
를 해주었습니다.
이제 다시 home
디렉토리에서 git pull
을 해줍시다.
git log --decorate --all --oneline
을 사용해줍니다.
그렇다면 현재 master
와 origin
의 branch
가 같은 commit
을 가르키는 것을 볼 수 있습니다.
gistory
로 가보겠습니다. 중요한 것은 refs\heads\master
파일 , 즉 지역저장소에서는 commit
이 6을 가르킵니다.
또한 동시에 refs\remotes\origin\master
또한 같은 commit
을 가르키게 됩니다.
즉 master
와 origin
이 똑같은 commit
을 가르키게 됩니다.
여기까지가 pull
의 특성입니다.
ORIG_HEAD
에서는 이전 commit
이 백업이 되어있기 때문에
병합하기 이전 상태로 되돌릴 수도있습니다.
f1.txt
의 내용을 한번더 수정하고 commit
을 하겠습니다.
그리고 office
에서 push
를 하겠습니다.
이제 home
에서 git pull
이 아니라 git fetch
를 해보겠습니다.
git log --decorate --all --oneline
을 하면 다음과 같은 결과가 나옵니다.
fetch
를 하면 지역저장소의 master
는 아까와 같은 commit
이 6을 가르키고 있지만 origin
이라는 원격 저장소는 office
에서 push
한 내용인 7 을 가르키고 있습니다.
즉 원격 저장소가 로컬저장소보다 앞서고 있는 상황입니다.
즉 refs\head\master
는 변화가 없지만 refs\remotes\origin\master
에는 commit
에 변화가 생겼습니다.
역시 refs\heads\master
에는 변화가 없습니다.
즉 다운후에 그 최신 commit
이 원격저장소에 기록해놨지만 아직 지역저장소인 master
에서는 어떠한 변화도 없는것이 바로 git fetch
입니다.
장점은 지역저장소에 있는 파일과 바로 병합하지 않고 가져오기만 하기 때문에 원격 저장소에 있는 내용과 지역저장소에 있는 내용에 대한 차이점을 알 수 있습니다.
git diif HEAD origin/master
를 통해서
원격 저장소와 지역 저장소의 차이를 한 눈에 볼 수 있습니다.
이후 아무 이상이 없다면 git merge origin/master
를 통해 병합을 합니다.
다시 git log --decorate --all --oneline
을 해보겠습니다.
이제 master
와 origin/master
, 즉 지역저장소와 원격저장소가 같은 commit
을 가르키게 됩니다. 이는 push
를 한번 한 상태와 같습니다.
이제 정리해봅시다.
git fetch
는 원격 저장소에서 필요한 파일을 다운로드만 합니다.
따라서 git merge origin/master
를 통해 수정사항이 생기면 병합을 해줘야 합니다.
그다음에 git pull
을 하면 필요한 파일을 하고 바로 병합까지 해줍니다.
만약 신중하게 해야하는 작업이 발생하면 fetch
를 사용해줍시다.
여기까지 하도록 하겠습니다.