728x90

거의 두, 세달정도 코드 작업을 못했던 것 같습니다. 아예 안한건 아니었지만 외부 소스코드에 대한 분석 이외에는 딱히 코드를 보지 않았더니 반대급부로 git에 대한 명령어들이 기억속에서 사라지기 시작했습니다 ;;;

그런데 오늘! 제가 작성했던 코드가 잘 동작하지 않는 예외 케이스가 발생되었다는 소식을 접수했습니다. 급한일을 부랴부랴 끝내고 비주얼 스튜디오 코드를 열고나니... 원격 브랜치의 저장소들이 그 사이 변경된 내용이 있을텐데 하는 불안감이 엄습했습니다. 

원래의 저장소, 포크한 내 저장소, 그리고 동료의 작업 저장소. git remote -v 명령으로 확인해보니 아직까지 원격 저장소 목록은 잘 저장이 되어 있었습니다. 이 저장소들에서 변경된 내용을 어떻게 가져오지... 하면서 좀 뒤져서 다시 기억을 살려보았습니다!


로컬 저장소에 지정된 원격 저장소 목록 확인

로컬 저장소에서 git 명령을 이용하여 추가 되어 있는 원격 저장소의 목록을 확인할 수 있습니다. 

% git remote -v
origin  git@git.nopd.company.com:nopd/client.git (fetch)
origin  git@git.nopd.company.com:nopd/client.git (push)
upstream        git@git.nopd.company.com:awesomeproject/client.git (fetch)
upstream        git@git.nopd.company.com:awesomeproject/client.git (push)
myfriend        git@git.nopd.company.com:myfriend/client.git (fetch)
myfriend        git@git.nopd.company.com:myfriend/client.git (push)

origin은 제 개인 저장소, upstream은 프로젝트의 원래 저장소, 그리고 myfriend는 동료의 저장소 입니다. 

 

각 저장소의 업데이트 사항 가져오기

이제 각 저장소의 업데이트 사항을 가져오는 명령을 입력해 보겠습니다. 

% git remote update
Fetching origin
Enter passphrase for key '/.ssh/id_rsa': 
Fetching upstream
Enter passphrase for key '/.ssh/id_rsa': 
Fetching myfriend
Enter passphrase for key '/.ssh/id_rsa': 
From git.nopd.company.com:myfriend/client
 * [new branch]      ISSUE_1 -> myfriend/ISSUE_1
 * [new branch]      ISSUE_2 -> myfriend/ISSUE_2
 * [new branch]      ISSUE_3 -> myfriend/ISSUE_3
   50c7deb..ff405ce  master -> myfriend/master

동료가 이렇게 열심히 일하는 동안 저는 놀았구나 하는 자괴감과 함께... 각 저장소의 변경 사항 확인시마다 SSH 키 값을 입력해서 동기화를 마쳤습니다. 

 

모든 브랜치 확인해보기

이제 로컬 저장소에 있는 브랜치와 원격의 브랜치를 확인해 보도록 하겠습니다. 명령은 git branch -a 입니다. 

% git branch -a 
  branch1
* branch2
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin...
  ...
  remotes/upstream/master
  remotes/upstream...
  ...
  remotes/myfriend/master
  ...

 

원격 브랜치 가져오기

마지막으로 작업하고 싶은 브랜치를 현재 로컬 브랜치로 가져오도로 하겠습니다. 특별히 upstream 에 변경된게 없어서 로컬 (origin/master) 브랜치에 업스트림 브랜치 (upstream/master) 의 변경사항을 땡겨오기로 했습니다. 로컬 브랜치를 하나 더 따려다... 일단 마스터에 합치고 브랜치를 나누는게 편해서... ㅎㅎ

% git pull upstream master
Enter passphrase for key '/.ssh/id_rsa': 
From git.nopd.company.com:awesomeproject/client
 * branch            master     -> FETCH_HEAD
Updating 48bc962..ff405ce
Fast-forward
 .....													  |  15 +++++++-
 .....													  | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
 .....													  |   8 ++--
 package-lock.json                                        |  29 ++++++++------
 package.json                                             |   2 +-
 5 files changed, ...

 


매일매일 쓰지 않으면 잊어버리는 것들. 시간을 꼭 내서 하루 한줄의 코딩, 하루 한 번의 명령어 입력도 잊지 말고 해야겠습니다 ㅎㅎㅎ 그리고 미래의 나를 위해 블로그에 살짝~ 남겨두는 활동을 꼭 꼭! 해야겠습니다!

728x90
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