Log Stash

as an Industrial Personnel

Note

TIL: git fetch가 실제로 원격에서 데이터를 받아온다

SavvyTuna 2017. 6. 4. 16:40

원격 저장소에서 남들이 올린 커밋을 받아올 때 보통은 별 생각 없이 git pull 또는 git pull -r로 받아왔었다. 보통은 별 문제 없이 이렇게 받아올 수 있는데, 다른 브랜치의 내용을 받아오고, 그 위로 rebase를 해야할 땐 좀 귀찮았다.

예를 들어, 내가 develop브랜치로 부터feature/something라는 새 브랜치를 만들어서 작업하고 있었다고 생각해보자. 내가 개인 브랜치 위에서 작업하는동안 누군가가 develop 브랜치에 새 커밋을 밀어 넣으면, 나는 아래처럼 내 피쳐 브랜치를 최신화 했다.

git checkout develop
git pull
git checkout feature/something
git rebase develop

순서대로, develop으로 체크아웃 하고, 거기서 pull받고, 다시 feature/something으로 돌아와서, 최신화된 develop위로 rebase한다.

문제는 유니티 프로젝트 특성상 checkout과 pull이 기가막히게 오래걸리기도 하고, 그 사이에 비쥬얼 스튜디오나 유니티를 건드리지 못 하고 손 놓고 있어서 흐름이 끊긴다는게 매우 귀찮다. rebase 이후에 리소스 재로딩 하는것도 충분히 답답한데, 혹시나 develop에 체크아웃 한 시점에 실수로 유니티를 건드리면 그 브랜치의 내용으로 다시 리소스를 불러오려고 할 테고, 그러면 그 동안 유니티를 건드릴 수도 없을 뿐더러, 잘못하면 git 프로세스에서 파일을 못 건드려서 커맨드가 실패하기도 하니까. (요즘은 옵션에서 자동 import 꺼놓고 작업해서 조금 낫다)

어느날 옆 자리 친구가 내가 하는짓을 보더니 fetch만 하면 내용 다 받아오는데 왜 그렇게 하냐고, pull받는게 사실상 fetch한 다음, 현재 브랜치를 FETCH_HEAD로 옮기는거라고 알려 줬다.

그 이후로 위의 4줄짜리 커맨드는 아래처럼 줄어들게 되었다.

git fetch
git rebase origin/develop

처음에 fetch를 하면, 원격 저장소에서 최신 브랜치 내용을 가져와서 origin/~브랜치가 이들을 가리키게 해놓는다. 그렇기 때문에 이 때 로컬에 있는 develop은 그대로 있지만, origin/develop은 원격에 있는 최신 커밋을 가리키게 된다. 그러고 나선 그냥 origin/develop위에 rebase만 해주면 끝.

물론 로컬에 있는 develop은 최신화 되어 있지 않은 상태로 유지 되겠지만, 그건 그냥 필요한 시점에 checkout해서 pull받으면 되니까 상관 없음.

오늘 새로 알게된것은 아니지만 비교적 최근까지 몰랐던 내용이었다.

tl;dr

git fetch를 실행시키면 원격에서 최신 커밋들을 받아와서 origin/~의 원격 브랜치에 올려놓음.

git pull를 실행시키면 (fetch를 하고) 받아놓은 원격 브랜치와 HEAD를 합친다.

참조

https://git-scm.com/docs/git-fetch