Git - Branch & Interaction


1. Branch란?

  • 브랜치란 독립적으로 어떤 작업을 진행하기 위한 개념이다. 필요에 의해 만들어지는 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행할 수 있다.
  • 또한 이렇게 만들어진 브랜치는 다른 브랜치와 병합(Merge)함으로써, 작업한 내용을 다시 새로운 하나의 브랜치로 모을 수 있다.
  • Branch (브랜치)로 알아보는 Git의 협업 원리
  • 작업 단위로 나눠서 각자 작업을 하고, 합친다.
  • 이 때 하나의 작업 단위가 하나의 Branch이다. ( ex. 캐릭터 브랜치, 무기 브랜치 )
  • 웹 사이트를 어느정도 만든다
  • —> 메뉴관련 브랜치와, 댓글관련 브랜치를 만들고 각자 거기서 작업을 한다. —> Main에 합친다. ( 이 때 충돌하는 부분만 신경써서 수정해준다. )



2. ranch 관련 명령어

  • $ git branch : 현재 속한 branch를 알 수 있음.
  • $ git branch tempBranch : tempBranch 라는 새로운 브랜치를 생성한다.
  • $ git checkout tempBranch : tempBranch로 들어간다.
  • $ git checkout -b tempBranch : tempBranch 라는 브랜치를 생성함과 동시에 들어간다


브랜치를 합치려고 한다면?

  • 병합을 하고자하는(결과가 되는) 브랜치로 먼저 checkout을 해준다.
  • $ git merge 합치려는 브랜치이름 : 현재 checkout되어있는 브랜치에 해당 브랜치를 반영한다.



3. 로컬과 원격 Repository의 상호작용

  • 원격 저장소는 협업을 위한 Repository일 뿐이며, 각 로컬에 있는 Repository를 가지고 상호작용하는 것이라 볼 수 있다.


원격 Repository 조회(추가)하기

  • $ git remote -v : 내 로컬 repository와 상호작용중인 원격 저장소들의 목록을 조회
  • git remote add origin URL : 내 로컬에 URL 원격저장소를 origin이라는 단축이름으로 추가
  • git remote rm origin : 로컬 저장소에서 origin 이라는 단축 이름의 원격저장소를 지운다.


원격 Repository에 밀어넣기

  • $ git push -u origin master :
  • 내 Repository의 master 브랜치를 origin 이라는 단축이름의 master 브랜치로 push. 이 때 -u 는 origin 이라는 원격 Repository를 Default로 선언하겠다는 의미이다. 이 때 부터는 $ git push 만 해줘도 자동으로 origin에 push가 된다.


원격 Repository 갖고 와서 합치기

  • $ git pull (origin master) :이 때 merge가 되는 것이기 때문에, 내가 작업하던 내용들은 사라진다.
  • origin master를 내 repositoy로 가져오라는 뜻.


원격 Repository 를 일단 가져오기만 하기

  • $ git fetch (origin master) :$ git checkout origin/master 를 하면, fetch한 내용을 확인할 수 있는 브랜치로 이동한다.
  • $ git checkout FETCH_HEAD 로 하면, 가장 마지막에 fetch한 브랜치로 이동한다.
  • 내 작업 내용은 유지하며, origin master의 내용만 일단 갖고오는 것.


원격 Repository 복사하기

  • $ git clone URL :이건 굳이 remote를 먼저 하지 않아도 된다.
  • 원격 Repository URL에 있는 내용을 현재 디렉토리에 복사해오기



4. 원격저장소를 이용한 협업

  • 내 로컬저장소는 변화했는데, 원격저장소는 변화가 없는 경우
    • $ git push 해버리면 된다.
  • 내 로컬저장소 변화가 없는데, 원격저장소만 변화한 경우
    • $ git pull 단축이름 브랜치이름으로 가져온 후에, $ git push 하면 된다.
  • 내 로컬저장소도 변화하고, 원격저장소도 변화한 경우
    • 동일한 파일에서 컴플릭트(충돌)는 없다는 가정하에 설명.
    • 협업을 하다보면 가장 일반적인 경우고, 가장 많은 경우이다.
      • Pull & Push ( 같은 파일이 수정되지 않았다면 )
      • Pull Request (merge)
        • 로컬에서 새로운 Branch를 생성하고, 거기서 추가 작업을 해준다.
        • 원격 저장소에 pull request 요청을 한다.
        • 원격 저장소 관리자가 승인을 해주면 된다.
      • Rebase
        • Rebase 와 Pull Request 의 결과는 같다. 하지만 과정이 다르다.
        • merge방식은 너무 대규모 프로젝트면면 history 관리가 어려워진다. 그걸 보완하기 위한 방법이다.
        • 현재 내가 작업하고 있는 branch의 base를 옮긴다는 뜻이다.
        • 즉 브랜치로 분열하던 당시의 원격저장소 버전이 아니라, 현재 원격저장소 버전으로 옮긴다는 것이다.
        • 분열하던 당시 ~ 현재까지 Commit된 모든 내용이 A브랜치에도 생긴다.
          • 내 로컬 “A” 브랜치를 나눠서 작업하고 있었는데, 원격저장소에서도 커밋이 막 이루어지고 있다. 내 로컬 “A” 브랜치에서도 여러번 커밋이 일어났고, 원격저장소에서도 여러번 커밋이 일어났다.
          • $ git checkout master
          • $ git pull origin master 를 통해 원격저장소에서 변경된 내용을 내 로컬 master에 pull 해준다.
          • 일단 $ git checkout A 로 A 브랜치로 이동한다.
          • $ git rebase master 을 통해 master 최신 기준으로 rebase 시켜준다. 이러면 로컬 A 브랜치에도, 원격저장소의 변경된 내용들도 적용되어있다.
        • 그러면 이걸 맞춰줘야된다.
  • 컴플릭트 (파일간의 충돌)
    • 내가 push 하려는 파일의 n번째 줄과, 다른 사람이 이미 push를 해버린 ‘같은 파일’의 n번째 줄의 내용이 다를 경우.
    • push를 해도 rejected 에러가 나고, pull을 받으면 컴플릭트가 나면서 경계선과 함께 뭐가 맞는건지 깃에 코드에 물어본다.
    • 여기서는 뭐가 맞는지, 코드를 수동적으로 핸들링한 후 다시 commit & push를 해야한다.
    • 보통은 Git Bash 내에서 vim 명령어를 사용하여 핸들링 하기도 한다.
    • 일반적으로 파일 내의 충돌량이 적을 경우에는, 내가 만든 파일을 먼저 백업 받아두고, Pull을 한 뒤에 내가 수정한 부분을 맞춰가는 형식으로 핸들링하고, Push를 한다.






results matching ""

    No results matching ""