Dev Ops/Git Git 사용법 V
  • 728x90
    반응형



    Git 사용법 V




    브랜치 관리



    git branch  명령은 단순히 브랜치를 만들고 삭제하는 것이 아니다.


    아무런 옵션 없이 실행하면 브랜치의 목록을 보여준다.



     *  기호가 붙어 있는 master 브랜치는 현재 Checkout 해서 작업하는 브랜치를 나타낸다.


     git branch -v  명령을 실행하면 브랜치마다 마지막 커밋 메시지도 함께 보여준다.



    현재 Checkout 한 브랜치를 기준으로  --merged  와  --no-merged  옵션을 사용하여 Merge 된 브랜치인지


    그렇지 않은지 필터링해 볼 수 있다.



    iss53 브랜치는 이미 Merge 했기 때문에 목록에 나타난다.


     *  기호가 붙어 있지 않은 브랜치는  git branch -d  명령으로 삭제해도 되는 브랜치이다.


    반대로 현재 Checkout 한 브랜치에 Merge 하지 않은 브랜치를 아래 명령으로 살펴 본다



    아직 Merge 하지 않은 커밋을 담고 있기 때문에  git branch -d  명령으로 삭제되지 않는다.



    Merge 하지 않은 브랜치를 강제로 삭제하려면 -D   옵션으로 삭제한다.



    Long-Running 브랜치



    접근법에 따라서 Git 개발자가 많이 선호하는 워크 플로가 있다.


    배포했거나 배포할 코드만 master 브랜치에 Merge 해서 안정 버전의 코드만 master 브랜치에 둔다.


    개발을 진행하고 안정화하는 브랜치는 develop 이나 next 라는 이름으로 추가로 만들어 사용한다.


    테스트를 거쳐서 안정적이라고 판단되면 master 브랜치에 Merge 한다.


    개발 브랜치는 공격적으로 히스토리를 만들어 나아가고 안정 브랜치는 이미 만든 히스토리를 뒤따르며 나아간다.


    안정적인 브랜치일수록 커밋 히스토리가 뒤쳐짐


    프로젝트 규모가 크면 proposed 혹은 pu(proposed updates)라는 이름의 브랜치를 만들고 


    next 나 master 브랜치에 아직 Merge 할 준비가 되지 않은 것을 일단 Merge 시킨다. 


    중요한 개념은 브랜치를 이용해 여러 단계에 걸쳐서 안정화해 나아가면서 충분히 안정화가 됐을 때 안정 브랜치로 Merge 한다는 점이다.



    토픽 브랜치



    토픽 브랜치는 어떤 한 가지 주제나 작업을 위해 만든 짧은 호흡의 브랜치다.


    묶음별로 나눠서 일하면 내용 별로 검토하기에도, 테스트 하기에도 더 편하다. 


    각 작업을 하루든 한달이든 유지하다가 master 브랜치에 Merge 할 시점이 되면 순서에 관계없이 Merge 하면 된다.


    master 브랜치를 checkout 한 상태에서 어떤 작업을 한다고 가정 해보자.


    한 이슈를 처리하기 위해서 iss91 브랜치를 만들고 해당 작업을 한다.


    같은 이슈를 다른 방법으로 해결해보고 싶을 때도 있다. iss91v2 브랜치를 만들고 다른 방법을 시도해 본다.


    확신할 수 없는 아이디어를 적용해보기 위해 다시 master 브랜치로 되돌아가서 dumbidea 브랜치를 하나 더 만든다.


    지금까지 이야기한 커밋 히스토리는 아래와 같다.


    토픽 브랜치가 많음

    이슈를 처리했던 방법 중 두 번째 방법인 iss91v2 브랜치가 괜찮아서 적용하기로 결정했다.


    iss91 브랜치는 버리고 다른 두 브랜치를 Merge 하면 아래와 같이 된다.



    리모트 브랜치



    리모트 Refs는 리모트 저장소에 있는 포인터인 레퍼런스다.


    리모트 저장소에 있는 브랜치, 태그, 등등을 의미한다.


     git ls-remote [remote]  명령으로 모든 리모트 Refs를 조회할 수 있다.


     git remote show [remote]  명령은 모든 리모트 브랜치와 그 정보를 보여준다.


    리모트 Refs가 있지만 보통은 리모트 트래킹 브랜치를 사용한다.


    리모트 트래킹 브랜치는 리모트 브랜치를 추적하는 브랜치다.


    이 브랜치는 로컬에 있지만 움직일 수 없다. 리모트 서버에 연결할 때마다 리모트 브랜치에 따라서 자동으로 움직인다.


    리모트 저장소에 마지막으로 연결했던 순간에 브랜치가 무슨 커밋을 가리키고 있었는지를 나타낸다.


    리모트 브랜치의 이름은  (remote)/(branch)  형식으로 되어 있다.


    예를 들어 리모트 저장소 orgin 의 master 브랜치를 보고 싶다면 origin/master 라는 이름으로 브랜치를 확인하면 된다.


    git.ourcompany.com 이라는 Git 서버가 있고 이 서버의 저장소를 하나 Clone 하면 Git는 자동으로 origin 이라는 이름을 붙인다.


    origin 으로부터 저장소 데이터를 모두 내려받고 master 브랜치를 가리키는 포인터를 만든다.


    이 포인터는 origin/master 를 가리키게 한다. master 브랜치에서 작업을 시작할 수 있다.


    서버와 로컬의 master 브랜치

    다른 팀원이 git.ourcompany.com 서버에 Push 하고 master 브랜치를 업데이트한다.


    그러면 팀원간의 히스토리는 서로 달라진다.


    로컬과 서버의 커밋 히스토리는 독립적


    리모트 서버로부터 저장소 정보를 동기화 하려면  git fetch origin  명령을 사용한다.


    명령을 실행하면 우선 origin 서버의 주소 정보를 찾아서 현재 로컬의 저장소가 갖고 있지 않은 새로운 정보가 있으면 


    모두 내려받고 받은 데이터를 로컬 저장소에 업데이트하고 나서 


    origin/master 포인터의 위치를 최신 커밋으로 이동시킨다.


    git fetch 명령은 리모트 브랜치 정보를 업데이트

     git remote add  명령으로 현재 작업 중인 프로젝트에  git.team1.ourcompany.com  팀의 저장소를 추가한다.


    이름을  teamone  으로 짓고 긴 서버 주소 대신 사용한다.


    서버를 리모트 저장소로 추가

    서버를 추가하고 나면  git fetch teamone  명령으로 teamone 서버의 데이터를 내려 받는다.


    명령을 실행 해도 teamone 서버의 데이터는 모두 origin 서버에도 있는 것들이라 아무것도 내려받지 않는다.


    하지만, 이 명령은 리모트 트래킹 브랜치 teamone/master 가 teamone 서버의 


    master 브랜치가 가리키는 커밋을 가리키게 한다.


    teamone/master 의 리모트 트래킹 브랜치



    Psuh 하기



    로컬의 브랜치를 서버로 전송하려면 쓰기 권한이 있는 리모트 저장소에 Push 해야 한다.


    브랜치를 Push 해야 정보가 전송된다.


    따라서 리모트 저장소에 전송하지 않고 로컬 브랜치에만 두는 비공개 브랜치를 만들 수 있다.


    또 다른 사람과 협업하기 위해 토픽 브랜치만 전송할 수도 있다.


    Note. 리모트에 접근할 때마다 매번 사용자이름과 암호를 입력하지 않도록 "credential cache" 기능을 이용할 수 있다.

    이 기능을 활성화 하려면  git config --global credential.gelper cache  명령을 실행하여 화경설정을 추가한다.


    저장소를 Fetch 하고 나서 서버에 있는 serverfix 브랜치에 접근할 때 origin/serverfix 라는 이름으로 접근할 수 있다.


    새로받은 브랜치의 내용을 Merge 하려면  git merge origin/serverfix  명령을 사용한다.


    Merge 하지 않고 리모트 트래킹 브랜치에서  시작하는 새 브랜치를 만들려면 아래와 같은 명령을 사용한다.


    $ git checkout -b serverfix orgin/serverfix

    Branch serverfix set up to track remote branch serverfix from origin.

    Switched to a new branch 'serverfix' 


    그러면  origin/serverfix  에서 시작하고 수정할 수 있는 serverfix 라는 로컬 브랜치가 만들어진다.



    브랜치 추적



    리모트 트래킹 브랜치를 로컬 브랜치로 Checkout 하면 자동으로 "트래킹(Tracking) 브랜치" 가 만들어진다.


    트래킹 브랜치에서 git pull 명령을 내리면 리모트 저장소로부터 데이터를  내려받아 


    연결된 리모트 브랜치와 자동으로 Merge 한다.


    서버로 부터 저장소를 Clone을 하면 Git는 자동으로 master 브랜치를 origin/master 브랜치의 트래킹 브랜치로 만든다.


    트래킹 브랜치를 직접 만들 수 있는데 리모트를 origin 이 아닌 다른 리모트로 할 수도 있고


    브랜치도 master 가 아닌 다른 브랜치로  추적할 수 있다.


    git checkout -b [branch] [remotename]/[branch] 명령으로 간단히 트래킹 브랜치를 만들 수 있다. 


    --track 옵션을 사용하여 로컬 브랜치 이름을 자동으로 생성할 수 있다.


    $ git checkout --track origin/serverfix

    Branch serverfix set up to track remote branch serverfix  from origin.

    Switched to a new branch 'serverfix' 


    위 명령을 더 생략하면 입력한 브랜치가 있는 (a) 리모트가 하나 있고 (b)로컬에는 없으면 


    Git는 트래킹 브랜치를 만들어 준다.


    $ git checkout serverfix

    Branch serverfix set up to track remote branch serverfix from origin.

    Switched to a new branch 'serverfix'


    리모트 블랜치와 다른 이름으로 브랜치를 만들려면 로컬 브랜치의 이름을 아래와 같이 다르게 지정한다.


    $ git checkout -b sf origin/serverfix

    Branch sf set up to track remote branch serverfix form origin,

    Switched to a new branch 'sf'


    이미 로컬에 존재하는 브랜치가 리모트의 특정 브랜치를 추적하게 하려면 


     git btranch  명령에  -u  나  --set-upstream-t 옵션을 붙여서 아래와 같이 설정한다.

    $ git branch -u origin/serverfix

    Branch serverfix set up to track remote branch serverfix from origin.


    추적 브랜치가 현재 어떻게 설정되어 있는지 확인하려면 git branch 명령에 -vv 옵션을 더한다.


    이 명령을 실행하면 로컬 브랜치 목록과 로컬 브랜치가 추적하고 있는 리모트 브랜치도 함께 보여준다.


    명령을 실행했을 때 나타나는 결과는 모두 마지막으로 서버에서 데이터를 가져온(fetch) 시점을 


    바탕으로 계산한다는 점이다.


    현재 시점에서 최신 데이터로 추적 상황을 알아보려면 먼저 서버로부터 최신 데이터를 받아온 후에 


    추적 상황을 확인해야 한다.


    $ git fetch --all; git branch -vv



    Pull 하기



    git fetch  명령을 실행하면 서버에는 존재하지만, 로컬에는 아직 없는 데이터를 받아와서 저장한다.


    이때 워킹 디렉토리의 파일 내용은 변경되지 않고 그대로 남는다.


    서버로부터 데이터를 가져와서 저장해두고 사용자가 Merge 하도록 준비만 해둔다.


     git pull  명령은 대부분  git fetch  명령을 실행하고 나서 자동으로  git merge  명령을 수행하는 것 뿐이다.



    리모트 브랜치 삭제



     git push  명령에  --delete  옵션을 사용하여 리모트 브랜치를 삭제할 수 있다. 


     serverfix  라는 리모트 브랜치를 삭제하려면 아래와 같이 실행한다.


    $ git push origin --delete serverfix

    To https://github.com/schacon/simplegit

    - [deleted] serverfix


    위 명령을 실행하면 서버에서 브랜치(즉 커밋을 가리키는 포인터) 하나가 사라진다.


    서버에서 가비지 컬렉터가 동작하지 않는 한 데이터는 사라지지 않기 때문에 


    삭제한 경우에도 커밋한 데이터를 살릴 수 있다.





    728x90
    반응형

    'Dev Ops > Git' 카테고리의 다른 글

    Git 서버 I  (0) 2018.06.26
    Git 사용법 VI  (0) 2018.06.25
    Git 사용법 IV  (0) 2018.06.20
    Git 사용법 III (되돌리기/수정 파일 되돌리기/Pull/Fetch/tag)  (0) 2018.06.19
    Git 사용법 II  (0) 2018.06.19
상단으로