Branch
- report.xls 라는 파일을 수정하게 되고 버젼관리를 하게 된다면 report1.xls, report2.xls 처럼 만들게 된다.
- 순차적으로 수정하기도하지만 수정하다 고객에게 일부만 수정하여 제공해야 된다면 report2_client.xls로 수정해야 제공할 것이다.
- 이러한 파일을 또 수정이 필요하게 된다면 report3.xls라고 수정하고 다음번 수정은 report4.xls형태로 수정해갈 것이다.
- 여기서 client 문서에서 이 문서 내용이 수정된 내용 report2_client2.xls 파일이 현재 파일과 합본이 되야 한다면 report4.xls + report2_client2.xls => report5.xls가 될 것이다.
- 이러한 사항과 같이 작업이 분기가 되는 것을 Branch라고 한다.( branch를 만든다)
- Client 쪽 Branch 하나 원래 Branch하나 => 즉 기본적으로 하나의 Branch를 가지고 있다고 생각할 수 있다.
Branch 만들기
$ git branch
* master // 현재는 master라는 branch밖에 없으며 앞에 * 는 현재 내 위치가 master라고 표시.
$ git branch exp // exp라는 branch생성
$ git branch
exp
* master // exp를 만들었지만 여전히 작업공간은 master, 작업공간 전환은 checkout 명령어로 수행
$ git checkout exp
Switched to branch 'exp'
$ git branch
* exp // exp로 이동
master
Branch 삭제
- git branch -d 브랜치명
- 위와 같이 수행하게 되면 branch가 삭제 됨.
$ git checkout master
Switched to branch 'master'
$ git branch -d exp
Deleted branch exp (was c2bf027).
$ git checkout -b exp // Branch생성과 동시에 checkout
Switched to a new branch 'exp'
- git log 를 하게 되면 master와 exp 현재 같은상태라 동일한 내용을 보여준다.
- exp branch에서 f1.txt 값을 변경 후 Commit 수행 -> master로 Checkout한 다음 해당 파일 내용 확인
MCR007@MCR007 MINGW64 /d/gittest (exp)
$ git log
commit dba8a6357fe987a68f170ef421e48b79edc6d6d7 (HEAD -> exp)
Author: blee <blee@hist.co.kr>
Date: Fri Sep 7 14:42:55 2018 +0900
5
commit 01d9e99aa53e4e9d1839b22ae491339f98513373
Author: blee <blee@hist.co.kr>
Date: Fri Sep 7 14:19:27 2018 +0900
4
MCR007@MCR007 MINGW64 /d/gittest (master)
$ git log
commit ee4b265b0140c5075cef3ad8e5f83c8a8224a34c (HEAD -> master)
Author: blee <blee@hist.co.kr>
Date: Fri Sep 7 14:19:27 2018 +0900
4
commit 8bb952a048e0071873e705b654aacab442c7dd57
Author: blee <blee@hist.co.kr>
Date: Fri Sep 7 14:19:07 2018 +0900
3
- exp에서 작업했던 내용이 master에는 적용되어있지 않다. => 즉, master와 exp branch 사이 데이터가 다르다 라는 뜻.
Branch 정보 확인
- git log --branches --decorate --graph 명령어를 통해 Branch분기를 확인 할 수 있다.
- head -> master라는 의미는 현재 master branch로 checkout되어있다 라는 의미이다.
$ git log --branches --decorate --graph
* commit ee4b265b0140c5075cef3ad8e5f83c8a8224a34c (HEAD -> master)
| Author: blee <blee@hist.co.kr>
| Date: Fri Sep 7 14:19:27 2018 +0900
|
| 4
|
| * commit dba8a6357fe987a68f170ef421e48b79edc6d6d7 (exp)
| | Author: blee <blee@hist.co.kr>
| | Date: Fri Sep 7 14:42:55 2018 +0900
| |
| | 5
| |
| * commit 01d9e99aa53e4e9d1839b22ae491339f98513373
|/ Author: blee <blee@hist.co.kr>
| Date: Fri Sep 7 14:19:27 2018 +0900
|
| 4
|
* commit 8bb952a048e0071873e705b654aacab442c7dd57
| Author: blee <blee@hist.co.kr>
| Date: Fri Sep 7 14:19:07 2018 +0900
|
| 3
|
* commit ea60da0dfa373320114440fa11391e4f3baef91e
| Author: blee <blee@hist.co.kr>
| Date: Fri Sep 7 13:47:49 2018 +0900
|
| 2
|
* commit 14a086115e15df273ba68ea2a214048bc12fdd5a
Author: blee <blee@hist.co.kr>
Date: Fri Sep 7 13:44:45 2018 +0900
1
Master에서도 새로운 Commit을 발생
f3.txt를 Add후 Commit 6으로 생성.
- master branch에서는 Commit 5없이 6으로 진행.
$ git log
commit d34e953797a2bab9cc8121a96a0480e378057354 (HEAD -> master)
Author: blee <blee@hist.co.kr>
Date: Fri Sep 7 14:57:14 2018 +0900
6
commit ee4b265b0140c5075cef3ad8e5f83c8a8224a34c
Author: blee <blee@hist.co.kr>
Date: Fri Sep 7 14:19:27 2018 +0900
4
- 전체 확인
$ git log --decorate --graph --branches
* commit 3433572803eec7ef45fdc89ac8186c799236eb35 (HEAD -> master)
| Author: blee <blee@hist.co.kr>
| Date: Fri Sep 7 15:06:15 2018 +0900
|
| 6
|
| * commit 9b12941dd44ee425de2dd50451fee72fffeb830d (exp)
|/ Author: blee <blee@hist.co.kr>
| Date: Fri Sep 7 15:05:05 2018 +0900
|
| 5
|
* commit 782306bbe8877010ad0d5d3fead70c41ef3e1ba9
| Author: blee <blee@hist.co.kr>
| Date: Fri Sep 7 15:04:46 2018 +0900
|
| 4
|
* commit 3bdc05c859f8c3757da20bf604a54d52109520c1
| Author: blee <blee@hist.co.kr>
| Date: Fri Sep 7 15:04:30 2018 +0900
|
| 3
|
* commit 5f2b21e47cac8897ef8cf0c9e3feb401649037a0
Author: blee <blee@hist.co.kr>
Date: Fri Sep 7 15:04:14 2018 +0900
- master branch는 6이전에 4이라는 Commit에서 부터 시작되었다. Exp branch 또한 5 이전에 4에서 시작되므로 공통 조상은 4 부터 시작된다는 것을 알 수 있다.
- git log --branches --decorate --graph --oneline 을 하게 되면 아래와 같이 간략하게 나타낼 수 있다.
$ git log --decorate --graph --branches --oneline
* 3433572 (HEAD -> master) 6
| * 9b12941 (exp) 5
|/
* 782306b 4
* 3bdc05c 3
* 5f2b21e 2
Version간의 차이점을 보려면
- git log master..exp 라고 수행 (git log 비교기준..비교대상, 기준에는 있고 대상에는 없는 것을 보여준다)
- git log master..exp -p를 수행 하게되면 소스 내용까지 보여준다.
$ git log master..exp
commit 9b12941dd44ee425de2dd50451fee72fffeb830d (exp)
Author: blee <blee@hist.co.kr>
Date: Fri Sep 7 15:05:05 2018 +0900
5
$ git log master..exp -p
commit 9b12941dd44ee425de2dd50451fee72fffeb830d (exp)
Author: blee <blee@hist.co.kr>
Date: Fri Sep 7 15:05:05 2018 +0900
5
diff --git a/f1.txt b/f1.txt
index 94ebaf9..8a1218a 100644
--- a/f1.txt
+++ b/f1.txt
@@ -2,3 +2,4 @@
2
3
4
+5 // 5가 추가 됨.
- 기준이 되는 곳에 내용이 있으고 비교대상에는 없을 경우네는 -로 표현, 반대의 경우 + 로 표현.
Branch 병합(Merge)
각자의 업무 진행 후 각 Branch를 병합해야하는 시기가 온다. (Merge)
exp branch를 master로 병합하려고 한다. exp -> Master
- master branch에서도 5 Commit의 Exp branch를 가지게 하는 것
exp => master, master로 Checkout 한 후 Merge 명령
$ git checkout master
MCR007@MCR007 MINGW64 /d/gittest2 (master)
$ git merge exp
Merge made by the 'recursive' strategy.
f1.txt | 1 +
1 file changed, 1 insertion(+)
$ git log --decorate --graph --branches --oneline
* 9e9729b (HEAD -> master) Merge branch 'exp'
|\
| * 9b12941 (exp) 5
* | 966898d 6
|/
* 782306b 4
* 3bdc05c 3
* 5f2b21e 2
- master의 최신 커밋이 merge했다 라는 Commit이 된다.
- master는 두개의 부모 commit을 가지게 되는데 기본적으로 가지고 있던 6을 가지고 있으면서 동시에 5를 가지게 된다.
- 하지만 Exp의 경우 6 커밋을 가지고 있지 않으므로 exp도 가질 수 있도록 병합 해준다.
MCR007@MCR007 MINGW64 /d/gittest2 (master)
$ git checkout exp
Switched to branch 'exp'
MCR007@MCR007 MINGW64 /d/gittest2 (exp)
$ git merge master
Updating 9b12941..9e9729b
Fast-forward
f2.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 f2.txt
MCR007@MCR007 MINGW64 /d/gittest2 (exp)
$ git log --decorate --graph --branches --oneline
* 9e9729b (HEAD -> exp, master) Merge branch 'exp'
|\
| * 9b12941 5
* | 966898d 6
|/
* 782306b 4
* 3bdc05c 3
* 5f2b21e 2
- 더이상 exp는 필요가 없다. git checkout master후 git branch -d exp 수행하게 되면 exp branch가 삭제 됨.
Branch 수련
- http://git-scm.com book에서 언어별로 수행가능.
- branch의 3.2 항목 선택 ( Basic branching and merging )
- Fast-forward(빨리감기):
master에서 hotfix라는 Branch를 만들고 업무 수행 후 master로 hotfix를 merge하게 되면 fast-forward라고 한다.
- master는 hotfix branch이후 아무런 Commit이 없다.
- merge 이후 모형은 아래와 같다.
- master가 가리키는 Commit을 hotfix가 가리키는 Commit으로 이동만 한다 라는 것일 fast-forward라고 한다. ( 같은 Commit을 가리킨다 )
- 별도의 Commit을 생성하지 않는다. 이전의 Merge에서는 Commit을 생성했으나 현재와 같은거는 위치만 바꾸기만 한다.
- branch를 -d 를 이용하여 hotfix 삭제
- iss53를 다시 수행하기 위해 Checkout하고 Commit을 하게 되면 아래와 같아 진다.
- 이후 master로 checkout하고 iss53을 master로 merge해야 한다.
- git checkout master, git merge iss53 // Merge made by the recursive strategy 라고 메세지가 나온다.
- iss53 branch 이후 master에 변화가 생겼다. 별도의 Commit을 가리키고 있는 상태이다. 이경우 fast-forward를 할 수 없다.
- master와 iss53의 공통의 조상을 찾는다. 그 이후 C4 와 C5를 합친 후 새로운 Commit을 만든다. C6
- C6는 C4와 C5에서 비롯됐다는 내용을 표현한다.
2-Way-Merge vs 3-Way-Merge
- 2-way-merge는 base를 제외한 나머지 부분을 기준으로 Merge
- 3-way-merge는 base를 포함하여 Merge( 2-way보다 좋음 )
'STUDY > Git' 카테고리의 다른 글
Git_협업 (0) | 2018.09.12 |
---|---|
Git_Remote (0) | 2018.09.11 |
Git_Stash (0) | 2018.08.23 |
Git 기초, Git이란? (0) | 2018.08.22 |