728x90

개발을 전문으로 하고 있는 Role 이 아니다 보니 할 때마다 헷갈리는 깃. 그래서 이슈를 하나씩 해결 할 때마다 블로그 포스트로 정리를 하고 있습니다. 오늘은 같은 코드가 여러 원격 저장소에 있을때 각 브랜치를 로컬로 체크아웃하여 사용하는 방법에 대하여 정리를 해봤습니다. 


추가 원격 저장소 등록하기

우선 여러 원격 저장소가 있는 경우에는 각 원격 저장소를 로컬 저장소에 원격 저장소(Remote Repository) 로 등록을 해야 합니다. 원격 저장소를 등록하는 것은 git remote add 명령을 이용해서 추가해줄 수 있습니다. 이전 포스팅에 정리된 내용이 있으니 아래 글을 참고하시기 바랍니다

 

git & github / 포크한 저장소와 원본 저장소를 다시 동기화 하려면?

깃허브 Github 에 공개되어 있는 코드를 개량할 때, 회사의 Git 에 등록된 과제의 기능을 개발할 때 우리는 포크 Fork 를 통해 원격 저장소의 코드를 내 저장소로 옮긴후 작업을 하게 됩니다. 내 저장

ondemand.tistory.com

 

원격 저장소의 브랜치 정보 업데이트 

원격 저장소가 등록되었으면 이제 각 원격저장소의 브랜치 정보를 업데이트 해야합니다. git remote update 명령을 이용하면 현재 로컬 저장소에 지정되어 있는 모든 원격 저장소의 브랜치 정보를 업데이트 하게 됩니다. 아래와 같이 origin, CDN 이라는 두개의 원격 저장소가 지정되어 있다면 두 곳의 브랜치 정보를 가져오게 되는 거지요.

% git remote update
Fetching origin
Enter passphrase for key '/Users/nopd/.ssh/id_rsa': 
Fetching CDN
Enter passphrase for key '/Users/nopd/.ssh/id_rsa':

 

업데이트된 브랜치 정보의 확인

브랜치 목록이 잘 전달 되었는지를 확인하기 위해서는 git branch -a 명령을 사용하면 됩니다. 원격 저장소와 브랜치는 remotes/ 로 시작하는 브랜치들입니다. 실수 origin 브랜치에 만든 CDN/master 브랜치도 보이는군요. 

% git branch -a
* master
  remotes/CDN/master
  remotes/origin/HEAD -> origin/master
  remotes/origin/CDN/master
  remotes/origin/master

 

다른 원격 저장소의 브랜치 체크아웃하기

여러 원격 저장소를 사용할 때의 주의점은 이름의 충돌입니다. 요즘 논란이 되고 있는 이름이긴 합니다만 여전히 저의 많은 저장소들은 master 를 기본 브랜치로 사용하고 있습니다. 때문에 서로 다른 원격 저장소의 master 브랜치를 그대로 체크아웃 하는 경우에는 로컬 브랜치에서 충돌이 일어나게 됩니다. 

이를 막기 위해서는 체크아웃할 때 로컬 저장소의 이름을 [원격저장소이름/브랜치명] 의 네이밍 컨벤션을 따라가면 편리합니다. 다른 방법으로 해도 문제는 없지만 여러가지 방법중 원격 저장소의 이름을 앞에 넣어주는 것이 개인적으로는 가장 편리하고 헷갈리지 않았습니다. git checkout 명령에 -b 옵션을 주어 체크아웃 해보도록 하겠습니다. 

% git checkout -b CDN/master CDN/master
Branch CDN/master set up to track remote branch master from CDN.
Switched to a new branch 'CDN/master'

체크아웃 후 나온 메세지를 읽어보면 "CDN (저장소) 로부터 master 브랜치를 이용하여 (로컬 저장소에) CDN/master 라는 브랜치를 셋업 했습니다" 라는 내용입니다. 정확한 저장소로부터 브랜치를 가져온 것을 확인하실 수 있죠? 나오는 메세지가 영어라고 당황하지 마시고 항상 읽는 습관을 들이는 것이 좋습니다!

 

다른 원격 저장소의 브랜치 푸시하기

이렇게 다른 원격 저장소의 브랜치를 체크아웃 한 뒤에는 평소처럼 수정, 로컬 커밋을 하시면 됩니다. 그런데, 로컬 커밋을 완료한 후 원격 저장소에 다시 푸시하려면 어떻게 해야할까요? 뭔가 헷갈릴 때는 git push 명령만 입력하여 자세한 안내를 받는 것을 추천드립니다. 아래의 명령은 현재 브랜치를 확인한 후 원격 저장소에 푸시하기 위해 git push 명령을 입력하여 안내를 확인해 본 내용입니다. 

% git branch
* CDN/master
  master
  
% git push
fatal: The upstream branch of your current branch does not match
the name of your current branch.  To push to the upstream branch
on the remote, use

    git push CDN HEAD:master

To push to the branch of the same name on the remote, use

    git push CDN CDN/master

git push 명령을 인자 없이 입력했을 때 나온 안내 메세지도 읽어봅시다. fatal 이 떠서 왠지 무섭지만 "아주 주의해야 해!" 라는 의미로 받아들이시면 됩니다. 현재 로컬 저장소에서 작업중인 브랜치가 원격 저장소의 이름과 일치하지 않아 나온 경고입니다. 제 경우를 보면 원격 저장소 (CDN) 의 master 브랜치를 로컬 저장소에 CDN/master 로 체크아웃했으니 master <-> CDN/master 라고 보시면 됩니다. 

이를 푸시하는 방법을 두가지일텐데요, 원격 저장소의 master 브랜치에 바로 푸시를 하려면 첫번째 안내처럼 git push [#원격저장소명#] HEAD:[#브랜치명#] 을 쓰면 됩니다. 만약 로컬 저장소에서 지정한 이름인 CDN/master 를 새로운 브랜치로 만들면서 푸시하려면 두번째 명령의 가이드를 따르면 됩니다. 참 쉽죠!?

 

원격 저장소의 브랜치 엿보기만 하려면?

마지막으로 원격 저장소의 브랜치를 수정할 생각은 없지만 로컬에서 살펴보고 싶을때 쓰는 방법입니다. 이때는 git checkout 에 넣었던 -b 옵션을 빼주기만 하면 됩니다. 로컬에서 마음껏 수정해보고 커밋도 하다가 다시 동일한 브랜치를 체크아웃하면 변경 사항은 그대로 제거됩니다. 만약 수정한 내용을 보존하고 싶다면 새로운 브랜치로 만들면 되겠죠? git checkout 명령에 -b 옵션을 다시 넣고 새로운 브랜치명을 넣어주면 끝!

% git checkout CDN/master
Note: checking out 'CDN/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

 

728x90

+ Recent posts