전체 페이지뷰

2016년 11월 23일 수요일

Git fetch

Github을 이용해 협업을 하던 중에,
나는 내 컴퓨터에서 새로운 부분을 작성해서 로컬 저장소 내에서 commit을 하였다.
아직 github에 push는 하지 않은 상태인데, 다른 작업자가 github에 새로운 내용을 push하였다면, 나의 커밋과 원격저장소 내의 커밋이 다른 상태가 된다.

이때 어떻게 할 것인가를 알아보기 이전에 원격 저장소의 git을 clone해서 작업할 때의 life cycle을 먼저 살펴보자.

좌측은 내 컴퓨터이고 우측은 Github이다.


처음에 github 상의 프로젝트가 있다. 이제 내가 협업자로 참가하려고 한다.



따라서, Github에서 프로젝트를 git clone(origin이라는 이름의 원격저장소 이름을 갖고 있었다)하여 내 로컬 컴퓨터로 받아온다. 이 때의 두개의 master는 같은 위치에 있다.

이 때, 동시에 origin/master라는 원격저장소 용의 branch가 내 컴퓨터에 생성된다. 
그래서 bash 상에서 git branch 해보면 master만 나타나지만, 
git branch -a 하여 모든 브랜치를 다 표시하라고 해보면

origin/master 브랜치가 존재함을 볼수 있다.


이제 내가 내 컴퓨터 상에서 작업을 수행해서 새로운 commit을 했다면
위와 같이 내 마스터는 내가 새로 작업한 지점으로 옮겨가고, 원격저장소를 표시하는 origin/master는 그대로 원래 자리에 있다.

그 다음 내가 새로운  커밋을 github에 push하면,
그제서야 내컴의 origin/master도 새로운 지점으로 옮겨오고 github의 mater도 갱신된다.


이후 나는 새로운 작업을 하여 내 로컬 컴퓨터에서 커밋을 하였는데(아직 push는 안 한 상태), 다른 작업자도 원격저장소에 새로운 내용을 푸시하였다면
내 컴퓨터와 원격저장소에 각기 다른 새로운 master가 생성된다.


git fetch하여 원격저장소의 내용을 내 컴퓨터로 옮겨오면,
나의 remote branch인 origin/master에 원격저장소의 내용이 옮겨오게 된다.

그러면 나는 origin/master의 내용과 내 master의 내용을 merge한다.

이 과정이 바로 git pull origin master했을 때 시행되는 과정이다.

따라서 그냥 원격 저장소의 내용을 pull하는 것이나,
fetch후 merge하는 것이나 과정은 완전히 동일하지만 
fast forward merging이라는 관점에서는 조금 다르다.
fetch 없이 pull 하게 되면 push하지않고 내가 작성했던 커밋은 새로운 pull 내용과 합쳐져서 바로 다음 단계로 이어지게 되므로 과거의 커밋을 보려고 할때 한방향으로만 접근할수 있게 되고, fetch후 merge하면 분지가 갈라지므로 양쪽 방향 모두 접근해볼수 있게 된다.



댓글 없음:

댓글 쓰기