DevOps/GIT

github#4 branch

aliceintr 2020. 11. 17. 09:32
반응형

version 관리와 팀 단위의 일을 할 때 필요한 개념이 Branch 이다.

ref : https://www.nobledesktop.com/learn/git/git-branches


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 를 설치한다.

www.sourcetreeapp.com/

stree

브랜치 간의 commit 내용의 차이점을 보고싶다면

여기서는 master에는 없고 javaDonbina에만 있는 commit을 보고싶다.

git log master--javaDonbina

e

더 자세한 코드내용의 차이를 보고싶다면

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 빨리감기

ref : git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B8%8C%EB%9E%9C%EC%B9%98%EC%99%80-Merge-%EC%9D%98-%EA%B8%B0%EC%B4%88

 

Git - 브랜치와 Merge 의 기초

Merge 시에 발생한 충돌을 다루는 더 어렵고 요상한 내용은 뒤에 고급 Merge 에서 다루기로 한다.

git-scm.com

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