( 출처 : https://wikidocs.net/book/7060 )
5. branch
Branch (브랜치)?
- 저장소(repository) 내의 존재하는 독립적인 작업관리 영역
- 여러 개의 브랜치 생성 가능
- 서로 영향 X
- 각각 다른 작업을 동시에 진행 가능
- 필요 시, 두 브랜치 병합(merge) 가능
- Master Branch
- 처음 생성시 생기는 브랜치 = default 브랜치 = main 브랜치
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하기
-
- 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할 차례
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하려함 )
5-3) merge의 종류 : fast-forward, 3-way merge
브랜치 간 merge 시…. 새로운 commit 생길수도 / 안생길수도
Fast-forward merge
base
란?
master
branch 에서 dev1이 분기해 나가는 지점(commit)- 2개의 branch가 공통으로 가지고 있는 commit
Fast-forward
란?
master
와dev1
이 각각 참조하는 commit은 동일 선상에 위치하는 상태
이러한 Fast-forward 상태에서는..
-
git merge 명령을 입력하면 새로운 commit이 생기지 않음
-
뒤쳐진 branch(여기서는 master)의 참조 개체가,
앞서있는 branch가 가리키는 개체를 참조하도록 이동할 뿐!
3-way merge
-
2개의 branch 모두 base에서 commit을 진행해서 분기
( 2개의 branch 모두 base에 있지 않음 )
-
이럴 경우, 새로운 commit이 생김!
5-4) merge의 옵션 : –ff, –no ff, –squash
fast forward
- git merge
--ff
[브랜치명]
non fast-forward
- git merge
--no-ff
[브랜치명] - merge 대상과 fast-forward 관계여도 강제로 merge commit을 생성하고 병합
squash
-
강압적인 병합
( commit이력과 merge된 브랜치 이력도 남기지 않음 )
-
새로운 commit에 상대 브랜치의 내용을 모두 뭉쳐놓음