( 출처 : https://wikidocs.net/book/7060 )

5. branch

Branch (브랜치)?

  • 저장소(repository) 내의 존재하는 독립적인 작업관리 영역
  • 여러 개의 브랜치 생성 가능
    • 서로 영향 X
    • 각각 다른 작업을 동시에 진행 가능
    • 필요 시, 두 브랜치 병합(merge) 가능
  • Master Branch
    • 처음 생성시 생기는 브랜치 = default 브랜치 = main 브랜치


figure2

figure2


5-1) git branch, checkout : 브랜치 생성 & 전환

git branch

상황

  • version 1은 이미 출시

  • version 2은 개발 중 ( with 일부 기능 추가 )

  • 이때, 이 version 2 개발 과정을…

    • 후보 1) master branch에서 진행

      => 내용 훼손 우려 & 버전 관리 hard

      => master branch는 “배포용 프로그램”만 commit하는용으로

    • 후보 2) 다른 branch에서 진행 후, 추후에 master branch에 merge하기


figure2


  • Step 1) 현재 master 브랜치의 가장 최신 commit에 tag(v2.0.0)를 부여
$ git tag -a v2.0.0 -m "Release version 2.0.0"

$ git push --tags


  • Step 2) 새로운 브랜치 생성 ( via git branch [브랜치명] )
$ git branch test1
$ git branch test2


  • Step 3) 존재하는 모든 branch 확인하기
    • (*) 의미 : “현재 작업 중”인 branch
$ git branch
---------------------------------
* master
  test1
  test2


  • 브랜치 name 바꾸기 ( via -m (또는 --move) )
    • git branch -m [기존 브랜치명] [변경할 브랜치명]
$ git branch -m test2 test3


  • 브랜치 삭제하기
    • git branch -d [브랜치명]
$ git branch -d test1


git checkout

  • 브랜치를 전환하기 ( git checkout [브랜치명] )
  • ex) master에서 dev1으로 변경!
$ git checkout dev1


새 브랜치에서 commit하기

  • ex) dev1 브랜치에서 CalcSub 함수 추가
$ git status
-------------------------
On branch dev1
(생략)
$ git commit -am "Add CalcSub funtion"
------------------------------------------
[dev1 c1ceb2b] Add CalcSub funtion
 2 files changed, 6 insertions(+)


[ 요약 ]

  • git branch : 브랜치 목록 표시
  • git branch [브랜치명] : 해당 브랜치 명으로 브랜치 생성
  • git checkout [브랜치명] : 해당 브랜치로 전환
  • git checkout –b [브랜치명] : 브랜치 생성과 동시에 전환
  • git branch -m [브랜치명] [새로운 브랜치명] : 브랜치명 변경
  • git branch –d [브랜치명] : 해당 브랜치 삭제


5-2) git merge

상황

  • dev1 브랜치에서, version 2 개발 완료!
  • 이제, master 브랜치에 merge할 차례

figure2


git merge

  • Step 1) master 브랜치로 이동하기
$ git checkout master
------------------------------------------
Switched to branch 'master'
Your branch is up to date with 'origin/master'.


  • Step 2) 현재 브랜치에, dev1 브랜치를 병합하기
$ git merge dev1
----------------------------------------
Updating 96a7e9a..4b07bd4
Fast-forward
 SimpleTest/SimpleTestDlg.cpp | 15 +++++++++++++++
 SimpleTest/SimpleTestDlg.h   |  3 +++
 2 files changed, 18 insertions(+)


BUT … 예상과 다르게 병합!

새로운 commit(merge commit)이 생겨서 병합된것이 아니라, 단지 dev1에서 작업한 commit이 모두 master 브랜치로 옮겨진 것일 뿐…!

( 예상 계획 : master 브랜치에 “배포 버전만” commit하려함 )

figure2


5-3) merge의 종류 : fast-forward, 3-way merge

브랜치 간 merge 시…. 새로운 commit 생길수도 / 안생길수도


Fast-forward merge

base란?

  • master branch 에서 dev1이 분기해 나가는 지점(commit)
  • 2개의 branch가 공통으로 가지고 있는 commit


Fast-forward란?

  • masterdev1이 각각 참조하는 commit은 동일 선상에 위치하는 상태

figure2


이러한 Fast-forward 상태에서는..

  • git merge 명령을 입력하면 새로운 commit이 생기지 않음

  • 뒤쳐진 branch(여기서는 master)의 참조 개체가,

    앞서있는 branch가 가리키는 개체를 참조하도록 이동할 뿐!

figure2


3-way merge

figure2

  • 2개의 branch 모두 base에서 commit을 진행해서 분기

    ( 2개의 branch 모두 base에 있지 않음 )

  • 이럴 경우, 새로운 commit이 생김!

figure2


5-4) merge의 옵션 : –ff, –no ff, –squash

fast forward

  • git merge --ff [브랜치명]

figure2


non fast-forward

  • git merge --no-ff [브랜치명]
  • merge 대상과 fast-forward 관계여도 강제로 merge commit을 생성하고 병합

figure2


squash

  • 강압적인 병합

    ( commit이력과 merge된 브랜치 이력도 남기지 않음 )

  • 새로운 commit에 상대 브랜치의 내용을 모두 뭉쳐놓음

figure2

Categories:

Updated: