git clone vs. git pull vs. git fetch. 뭐가 다른 거냐. 우쿠분투/리눅스

이 글 분류가 우분투는 아닐테지만, 그냥 그렇게 넣어두련다.

드디어 git 을 조금씩 알아가고 있는 중이다. 얼마나 시간이 걸렸는지.

간단하게 정리해본다.

1. git clone 이 특이한 점은?
git clone 은 git remote add + git pull 과 거의 같다.
git pull 은 git fetch + git merge 와 (거의) 같다.

git clone 이 git remote 등 몇가지 명령을 내렸을 때와 가장 다른 것은, origin/HEAD 라는 포인터가 생긴다는 점이다. 다시 말하면, get remote add 하고, git fetch(or pull) 을 했을 땐 origin/HEAD 라는 것이 생기지 않는다는 것이다.
이것에 대해, 다음 글에 자세한 설명이 되어 있다.

긴 글을 짧게 줄이면, origin/HEAD 포인터는 신경쓸 필요가 없다.

$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master

$ git branch -a
* master
remotes/origin/master


위가 git clone 이고, 아래가 git remote add 했을 때인데, 결과가 보는 것처럼 다르다. 그러나, 신경쓸 필요는 없다는 것이 요점이다.

2. git fetch 후, 현재 내 브랜치와 fetch 한 것이 뭐가 다른지 어떻게 알 수 있나?#1 → 다소 잘못된 접근
git pull 은, remote/origin 과 내 브랜치를 자동으로 합해준다.
다시 말해, git fetch origin 한 후, git merge origin/master 를 한 것과 같다.
따라서, git pull 을 하면 현재 브랜치에 자동으로 origin/master 가 합쳐(merge)지므로, remote 에 반영된 최신 내용(파일)을 바로 눈으로 볼 수 있게 된다.

반면, git fetch 는 파일을 얻어와서 특별한 브랜치(remote-tracking-branch)에 저장을 한다.
기본으로 이곳은 origin/master 라는 이름을 사용한다.

그렇다면? 이곳으로 체크아웃하여 내용을 살펴보면 되지 않을까?

git checkout origin/master


이러면 될 줄 알았는데.. 세상일이 그렇게 쉽질 않다.
이런 짓을 하면, "You are in 'detached HEAD' state..." 라는 기분나쁜 문구를 접하게 된다.

이건 또 뭐야..
그것에 관해선 What's a "detached HEAD" in Git? 이 글을 참고한다.

역시 간단하게 정리하자면, 브랜치가 아닌 곳으로 이동을 했을 때 이런 오류가 나타나게 된다.
이런 짓을 나만 한 건 아니기 때문에, Git 문서에 이런 짓에 대한 경고가 이미 적혀있다.
여기서 짚고 넘어가야 할 게 있다. Fetch 명령으로 리모트 트래킹 브랜치를 내려받는다고 해서 로컬 저장소에 수정할 수 있는 브랜치가 새로 생기는 것이 아니다. 다시 말해서 serverfix라는 브랜치가 생기는 것이 아니라 그저 수정 못 하는 origin/serverfix 브랜치 포인터가 생기는 것이다.


따라서, 만약 새로 내려 받은(git fetch) 내용을 눈으로 직접 하나 하나 살펴보고 싶다면, origin/master 를 로컬에 실제 branch 로 만들어서 그 브랜치에서 살펴봐야 한다.

git checkout -b remote-uptodate origin/master


그렇지만, 이 방법은 다소 과격한(?) 방식이다. 실제로는 git fetch 로 받은 것과, 내 로컬 브랜치간 어떤 차이가 있는 지만 확인하면 될 것이다.
그것은 다음에서..

3. git fetch 후, 현재 내 브랜치와 fetch 한 것이 뭐가 다른지 어떻게 알 수 있나?#2 → 올바른 접근
git fetch 는 remote(origin 이라 명명된) 에 접속하여, 모든 것을 읽어온 후, 이른바 'remote-tracking-branches' 라는 특별한 브랜치에 저장한다. 이 브랜치로는 이동(checkout)할 수는 있으나, 이동하면 오류가 발생(detached HEAD)하기도 하고, 워낙에 이동/수정을 하려는 목적으로 만든 것은 아니다.

2. 에서 한 방법처럼, 새로 브랜치를 만들고 이동하여 살펴보는 방법도 있겠지만, 좀 더 git (짓? ^^) 스러운 짓을 하려면 다음과 같은 명령을 사용해야 한다.

git log origin/master ^master


위 내용은 Where to find changes due to `git fetch` 에 잘 나와있다.

...

오늘은 여기까지.

덧글

댓글 입력 영역

Google Analyze


LastFm

MathJax