원격 저장소에서 남들이 올린 커밋을 받아올 때 보통은 별 생각 없이 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
를 합친다.
참조
'Note' 카테고리의 다른 글
TIL: Unity compares Objects to null implicitly (0) | 2017.06.29 |
---|---|
TIL: git --fixup, --autosquash (0) | 2017.06.23 |
TIL: 윈도우에서 ALT+<아스키 번호> 조합으로 문자를 입력할 수 있다 (0) | 2017.05.31 |
TIL: Visual studio에서 텍스트를 ctrl + U 로 lowercase화 시킬 수 있다 (0) | 2017.05.26 |
TIL: macOS나 iOS에는 텍스트 읽기 기능이 있다 (0) | 2017.05.24 |