version 관리와 팀 단위의 일을 할 때 필요한 개념이 Branch 이다.
1. git branch
기본 Branch 는 Master 인데 최근에는 Main 인 경우도 있다.
% git branch
* master
% git branch javaDonbina
% git branch
javaDonbina
* master
% git checkout javaDonbina
Switched to branch 'javaDonbina'
% git branch
* javaDonbina
master
새로운 브랜치에 업로드 할 파일 4개를 로컬 repo에 옮긴후 commit 을 해본다
% ls -ltr
total 40
-rw-r--r-- 1 alice staff 610 16 Nov 16:33 Tutorial03.java
-rw-r--r-- 1 alice staff 1784 16 Nov 16:52 Tutorial04.java
-rw-r--r-- 1 alice staff 367 16 Nov 16:56 Tutorial05.java
-rw-r--r-- 1 alice staff 745 16 Nov 18:44 Tutorial02.java
-rw-r--r-- 1 alice staff 1747 16 Nov 18:44 Tutorial06.java
% cp *.java ../../../gitproject
% cd ../../../gitproject
% ls -ltr
total 80
-rw-r--r-- 1 alice staff 4652 16 Nov 14:41 S03_DataType.java
-rw-r--r-- 1 alice staff 1470 16 Nov 14:41 S03_exercise.java
-rw-r--r-- 1 alice staff 3991 16 Nov 14:41 S04_Condition.java
-rw-r--r-- 1 alice staff 2136 16 Nov 14:41 S04_Operator.java
-rw-r--r-- 1 alice staff 745 16 Nov 18:56 Tutorial02.java
-rw-r--r-- 1 alice staff 610 16 Nov 18:56 Tutorial03.java
-rw-r--r-- 1 alice staff 1784 16 Nov 18:56 Tutorial04.java
-rw-r--r-- 1 alice staff 367 16 Nov 18:56 Tutorial05.java
-rw-r--r-- 1 alice staff 1747 16 Nov 18:56 Tutorial06.java
% git branch
* javaDonbina
master
% git add Tutorial02.java
% git commit -m "javaDonbina - Tutorial2"
[javaDonbina 1e822b3] javaDonbina - Tutorial2
1 file changed, 39 insertions(+)
create mode 100644 Tutorial02.java
alice@sonjin-as-MacBook-Pro gitproject % git log
commit 1e822b3d620d61fc53cb9345dac9a739e55f7a39 (HEAD -> javaDonbina)
Author: aliceson89 <alice.son1109@gmail.com>
Date: Mon Nov 16 18:57:43 2020 -0500
javaDonbina - Tutorial2
다시 master로 체크아웃 한 다음 git log 로 commit 기록을 살펴보면 아까 commit 한 기록은 찾을 수 없다 .
% git checkout master
Switched to branch 'master'
% git log
리스트로 master 의 파일리스트를 보니 Tutorial02.java 파일이 없어 진걸 볼 수 있다.
#MASTER branch
% ls -ltr
total 72
-rw-r--r-- 1 alice staff 4652 16 Nov 14:41 S03_DataType.java
-rw-r--r-- 1 alice staff 1470 16 Nov 14:41 S03_exercise.java
-rw-r--r-- 1 alice staff 3991 16 Nov 14:41 S04_Condition.java
-rw-r--r-- 1 alice staff 2136 16 Nov 14:41 S04_Operator.java
-rw-r--r-- 1 alice staff 610 16 Nov 18:56 Tutorial03.java
-rw-r--r-- 1 alice staff 1784 16 Nov 18:56 Tutorial04.java
-rw-r--r-- 1 alice staff 367 16 Nov 18:56 Tutorial05.java
-rw-r--r-- 1 alice staff 1747 16 Nov 18:56 Tutorial06.java
% git log --branches --decorate
commit 1e822b3d620d61fc53cb9345dac9a739e55f7a39 (javaDonbina)
Author: aliceson89 <alice.son1109@gmail.com>
Date: Mon Nov 16 18:57:43 2020 -0500
javaDonbina - Tutorial2
commit 5ccbd61e63e289b186bd87c2e61e96764e3fc9b6 (HEAD -> master, java/master)
Author: aliceson89 <alice.son1109@gmail.com>
Date: Mon Nov 16 14:42:24 2020 -0500
S03,04 Commit
2. Branch 정보와 차이점 찾기
git log --branches --decorate : 모든 commit 리스트를 Branch 별로 보여준다.
(HEAD -> [branch name]) : 현재 activate 된 브랜치를 나타낸다.
git log --branches --decorate --graph --oneline
그래프로 브랜치를 도식화 해서 보여준다.
파일을 한개 더 javaDonbina 브랜치에 추가한 후 모습
좀 더 도식화 해서 보고싶다면 sourcetree 를 설치한다.
stree
브랜치 간의 commit 내용의 차이점을 보고싶다면
여기서는 master에는 없고 javaDonbina에만 있는 commit을 보고싶다.
git log master--javaDonbina
더 자세한 코드내용의 차이를 보고싶다면
git log -p javaDonbina..master
또는
git diff master..javaDonbina
사용할 수 있다.
3. Branch merge
분할 된 브랜치들을 병합할 수 있다.
% git checkout master
Already on 'master'
% git merge javaDonbina
Merge made by the 'recursive' strategy.
Tutorial02.java | 39 ++++++++++++++++++++++++++++
Tutorial04.java | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 116 insertions(+)
create mode 100644 Tutorial02.java
create mode 100644 Tutorial04.java
먼저 마스터로 체크아웃 한 후 나머지 브랜치로 병합하는 명령어를 입력한다.
git log 로 현재 상채를 확인한다.
git log --branches --decorate --graph --oneline
마스터는 병합이 되었으니 이제 javaDonbina 도 마스터 있던 commit과 병합하자.
% git checkout javaDonbina
Switched to branch 'javaDonbina'
% git merge master
Updating 190e073..c8d9975
Fast-forward
Tutorial03.java | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
create mode 100644 Tutorial03.java
이제 병합은 했으니 javaDonbina 브렌치는 필요없으므로 삭제해 준다.
삭제전 master로 체크아웃 후 에 삭제한다.
% git checkout master
Switched to branch 'master'
% git branch -d javaDonbina
Deleted branch javaDonbina (was c8d9975).
HEAD가 가르키는 값에서 javaDonbina 가 사라진 것을 볼 수 있다.
4. Merge : Fast - forward 빨리감기
Hotfix 브랜치 사용하는 경우 : 이젠 해결해야 할 핫픽스가 생겼을 때를 살펴보자. `hotfix`라는 브랜치를 만들고 새로운 이슈를 해결할 때까지 사용한다.
#git checkout -b [branch이름] : 브랜치 생성과 동시에 체크아웃
$ git checkout -b hotfix Switched to a new branch 'hotfix'
$ vim index.html
$ git commit -a -m 'fixed the broken email address'
[hotfix 1fb7853] fixed the broken email address 1 file changed, 2 insertions(+)
$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
index.html | 2 ++
1 file changed, 2 insertions(+)
원래는 브랜치가 나누어진 후에 병합을 하게 되면 새로운 commit이 생성되게 되는데, Fast- Forward 방식은 마스터가 최신의 commit을 가르키는 방식으로 merge가 되기 때문에 따로 새로운 commit 이 생성되지 않는다.
master 의 최신 commit은 C2이고 hotfix의 최신 commit 은 C4이다.
C4는 C2의 부모 commit 이기 때문에 Master 와 merge할때 단순히 가장 최신버전인 hotfix를 가르키기만 하면 되는 것이다.
"A fast-forward merge can occur when there is a linear path from the current branch tip to the target branch. Instead of “actually” merging the branches, all Git has to do to integrate the histories is move (i.e., “fast forward”) the current branch tip up to the target branch tip. This effectively combines the histories, since all of the commits reachable from the target branch are now available through the current one. "
Fast-Forward 가 아닌 방식은 Merge 할 대상의 브랜치가 공통 부모 commit 를 같지 않을 때 발생한다.
예를 들어 아래 그림을 보자면
현재 Master와 C5 가 merge 해야하는 상황이다.
C5가 iss53의 최신 commit 이다.
C5의 부모 commit = C3
Master 의 부모 commit = C2
C5의 부모 commit ≠ Master 의 부모 commit
따라서 merge 할때 새로운 commit을 생성한다.
merge 한 결과는 아래와 같다.
내용이 도움이 되셨다면 블로그 구독하기 부탁드리겠습니다.
* 이 글의 모든 저작권은 aliceintr에 있으며 무단 배포 및 사용은 자제해 주시기 바랍니다. *
'DevOps > GIT' 카테고리의 다른 글
github#6 git merge conflict (0) | 2020.11.20 |
---|---|
github#5 git HEAD file (0) | 2020.11.20 |
github#3 gistory and git rm (0) | 2020.11.16 |
github #2 github reset (0) | 2020.11.16 |
github #1 github init, log, diff, add, status, commit (0) | 2020.11.15 |