나만의 길

[Git] 03-2. git branch 실습 본문

Git

[Git] 03-2. git branch 실습

yunway 2023. 7. 2. 21:42
반응형

이전 글에서 배웠던 branch를 실습을 통해 배워보겠습니다. 가장 많이 사용되고 중요한 요소를 먼저 실습한 이후에 디테일한 부분을 다뤄보겠습니다. 오늘 다뤄볼 실습내용은 총 3가지입니다.

1. branch 생성

2. branch checkout

3. merge

 

1. branch 생성

먼저 실습진행을 위해 새로운 directory를 생성하겠습니다. 저는 git_branch를 생성하고 init 하겠습니다.

User@DESKTOP MINGW64 ~ (master)
$ mkdir git_branch

User@DESKTOP MINGW64 ~ (master)
$ cd git_branch

User@DESKTOP MINGW64 ~/git_branch (master)
$ git init
Initialized empty Git repository in C:/Users/User/git_branch/.git/

 

이후 first.txt 파일을 생성하고 first project 내용을 저장하겠습니다. 이후 add후 commit -m first로 진행했습니다. 

User@DESKTOP MINGW64 ~/git_branch (master)
$ vim first.txt

User@DESKTOP MINGW64 ~/git_branch (master)
$ cat first.txt
first project

User@DESKTOP MINGW64 ~/git_branch (master)
$ git add first.txt
warning: in the working copy of 'first.txt', LF will be replaced by CRLF the next time Git touches it

User@DESKTOP MINGW64 ~/git_branch (master)
$ git commit -m "first"
[master (root-commit) 05cf00c] first
 1 file changed, 1 insertion(+)
 create mode 100644 first.txt

 

이후 first.txt에 add cotent를 추가하고 add로 commit을 합니다. 그리고 log를 출력해서 확인합니다.

User@DESKTOP MINGW64 ~/git_branch (master)
$ vim first.txt

User@DESKTOP MINGW64 ~/git_branch (master)
$ cat first.txt
first project
add content

User@DESKTOP MINGW64 ~/git_branch (master)
$ git commit -am "add"
warning: in the working copy of 'first.txt', LF will be replaced by CRLF the next time Git touches it
[master afc8dae] add
 1 file changed, 1 insertion(+)

User@DESKTOP MINGW64 ~/git_branch (master)
$ git log
commit afc8dae738a03d1f870af3b7209f54f58f93efad (HEAD -> master)
Author: Yun
Date:   Sun Jul 2 20:26:49 2023 +0900

    add

commit 05cf00c24aa326a9d222a97da567f95f406e9b3a
Author: Yun
Date:   Sun Jul 2 20:23:26 2023 +0900

    first

 

이제 새로운 branch를 생성해 보겠습니다. 이전 글에서 언급했지만, init을 하게 되면 git에서 기본적으로 제공해 주는 master라는 branch가 생성됩니다. exp라는 branch를 추가해 보겠습니다. branch를 생성하는 명령어는 git branch "이름" 입니다. branch를 생성하고 출력해 보겠습니다.

User@DESKTOP MINGW64 ~/git_branch (master)
$ git branch exp

User@DESKTOP MINGW64 ~/git_branch (master)
$ git branch
  exp
* master

보이시나요? exp branch가 정상적으로 생성되고, 현재 branch에 *로 표시되어 있습니다. 이제 branch를 이동하여 새로운 파일을 생성 및 수정하고 결과를 확인해 보겠습니다.

 

2. branch checkout

이제 branch를 이동하고 새로운 파일을 생성해 보겠습니다. 제목에서 알 수 있듯이, checkout 명령을 통해 branch를 이동할 수 있습니다. exp branch로 생성하고 log도 살펴보겠습니다.

User@DESKTOP MINGW64 ~/git_branch (master)
$ git checkout exp
Switched to branch 'exp'

User@DESKTOP MINGW64 ~/git_branch (exp)
$ git branch
* exp
  master

User@DESKTOP MINGW64 ~/git_branch (exp)
$ git log
commit afc8dae738a03d1f870af3b7209f54f58f93efad (HEAD -> exp, master)
Author: Yun
Date:   Sun Jul 2 20:26:49 2023 +0900

    add

commit 05cf00c24aa326a9d222a97da567f95f406e9b3a
Author: Yun
Date:   Sun Jul 2 20:23:26 2023 +0900

    first

log를 보면, HEAD가 가리키는 부분이 exp, master가 된 것을 볼 수 있습니다. HEAD에 대해서는 다음 글에서 자세하게 다루겠습니다. 이제 exp branch에서 second.txt를 생성하고 text를 추가하겠습니다. 그리고 해당 commit을 second로 하겠습니다.  또 기존의 first.txt내용에 add content2를 추가하고 해당 commit을 add2로 하겠습니다.

User@DESKTOP MINGW64 ~/git_branch (exp)
$ vim second.txt

User@DESKTOP MINGW64 ~/git_branch (exp)
$ git add second.txt
warning: in the working copy of 'second.txt', LF will be replaced by CRLF the next time Git touches it

User@DESKTOP MINGW64 ~/git_branch (exp)
$ git commit -m "second"
[exp 4b90010] second
 1 file changed, 1 insertion(+)
 create mode 100644 second.txt
User@DESKTOP MINGW64 ~/git_branch (exp)
$ vim first.txt

User@DESKTOP MINGW64 ~/git_branch (exp)
$ git commit -am "add2"
warning: in the working copy of 'first.txt', LF will be replaced by CRLF the next time Git touches it
[exp 184a36d] add2
 1 file changed, 2 insertions(+)

User@DESKTOP MINGW64 ~/git_branch (exp)
$ git log
commit 184a36dfa6bd1663ea39cd9201eb8e072ca30bb2 (HEAD -> exp)
Author: Yun
Date:   Sun Jul 2 20:46:27 2023 +0900

    add2

commit 4b90010f9e22f3f6ebfdb7af8050a8e47ac2b3b7
Author: Yun
Date:   Sun Jul 2 20:44:59 2023 +0900

    second

commit afc8dae738a03d1f870af3b7209f54f58f93efad (master)
Author: Yun
Date:   Sun Jul 2 20:26:49 2023 +0900

    add

commit 05cf00c24aa326a9d222a97da567f95f406e9b3a
Author: Yun
Date:   Sun Jul 2 20:23:26 2023 +0900

    first

조금 복잡해 보이지만, 원리는 간단합니다. log 내용을 살펴보면, add는 master지만 add2는 exp로 되어있습니다. 해당 log만 봐서는 branch를 직관적으로 확인하기 어렵기 때문에 graph를 통해 시각적인 확인을 해보겠습니다. git log --branches --graph명령을 입력합니다.

User@DESKTOP MINGW64 ~/git_branch (exp)
$ git log --branches --graph
* commit 184a36dfa6bd1663ea39cd9201eb8e072ca30bb2 (HEAD -> exp)
| Author: Yun
| Date:   Sun Jul 2 20:46:27 2023 +0900
|
|     add2
|
* commit 4b90010f9e22f3f6ebfdb7af8050a8e47ac2b3b7
| Author: Yun
| Date:   Sun Jul 2 20:44:59 2023 +0900
|
|     second
|
* commit afc8dae738a03d1f870af3b7209f54f58f93efad (master)
| Author: Yun
| Date:   Sun Jul 2 20:26:49 2023 +0900
|
|     add
|
* commit 05cf00c24aa326a9d222a97da567f95f406e9b3a
  Author: Yun
  Date:   Sun Jul 2 20:23:26 2023 +0900

      first

옆에 줄기처럼 그림이 생성되었지만, branch생성의 효과를 보지 못하고 있습니다. 그러한 이유는 다음 작업을 통해 확인해 보겠습니다. 

이제 master로 checkout을 하고, thrid.txt를 생성한 이후에, add content3을 생성한 후 add3으로 commit 하겠습니다.

User@DESKTOP MINGW64 ~/git_branch (exp)
$ git checkout master
Switched to branch 'master'

User@DESKTOP MINGW64 ~/git_branch (master)
$ vim third.txt

User@DESKTOP MINGW64 ~/git_branch (master)
$ git add third.txt
warning: in the working copy of 'third.txt', LF will be replaced by CRLF the next time Git touches it

User@DESKTOP MINGW64 ~/git_branch (master)
$ git commit -m "add3"
[master cbd6d81] add3
 1 file changed, 1 insertion(+)
 create mode 100644 third.txt

 

log를 출력하여 결과를 확인해보겠습니다.

User@DESKTOP MINGW64 ~/git_branch (master)
$ git log
commit cbd6d81cc0df9879e28ba50248ed8f91d3766abd (HEAD -> master)
Author: Yun
Date:   Sun Jul 2 20:57:07 2023 +0900

    add3

commit afc8dae738a03d1f870af3b7209f54f58f93efad
Author: Yun
Date:   Sun Jul 2 20:26:49 2023 +0900

    add

commit 05cf00c24aa326a9d222a97da567f95f406e9b3a
Author: Yun
Date:   Sun Jul 2 20:23:26 2023 +0900

    first

 

조금 전에 존재하던 add2와 second가 사라졌습니다! 사실 사라진 것이 아니라, exp branch에 저장되어 있습니다. 아직 이해가 안 된다면, graph를 통해 직관적으로 이해할 수 있습니다.

User@DESKTOP MINGW64 ~/git_branch (master)
$ git log --branches --graph
* commit cbd6d81cc0df9879e28ba50248ed8f91d3766abd (HEAD -> master)
| Author: Yun
| Date:   Sun Jul 2 20:57:07 2023 +0900
|
|     add3
|
| * commit 184a36dfa6bd1663ea39cd9201eb8e072ca30bb2 (exp)
| | Author: Yun
| | Date:   Sun Jul 2 20:46:27 2023 +0900
| |
| |     add2
| |
| * commit 4b90010f9e22f3f6ebfdb7af8050a8e47ac2b3b7
|/  Author: Yun
|   Date:   Sun Jul 2 20:44:59 2023 +0900
|
|       second
|
* commit afc8dae738a03d1f870af3b7209f54f58f93efad
| Author: Yun
| Date:   Sun Jul 2 20:26:49 2023 +0900
|
|     add

이제야 branch의 핵심적인 기능이 나타납니다. exp와 master는 add commit이라는 같은 부모를 가지지만, 각각 다른 commit으로 구성되어 있습니다. 앞서 commit은 객체로 구성되어 있어 각각의 commit을 포인팅 합니다. 쉽게 그림으로 설명하자면 다음과 같습니다.

포인팅 그림

이제 조금 감이 잡히시죠? 실제로 여러 명에서 프로젝트를 진행할 때, 개개인이 branch를 생성하여 각자 작업할 수 있습니다. 그렇다면 해당 프로젝트를 1개로 합치는 경우도 존재하겠죠? 바로 merge를 이용하여 진행할 수 있습니다.

 

3. merge

merge는 정말 중요한 요소이지만, 잘못 사용하게 되면 conflict(충돌)를 야기할 수 있습니다. conflict에 대해서는 다뤄야 할 부분이 꽤 존재하기 때문에 다음 글에서 자세하게 다루겠습니다. merge는 방향성을 기억하는 것이 중요합니다. master의 내용을 exp에 merge 하는지, exp의 내용을 master에 merge 하는지가 핵심입니다.

 

1. exp -> master merge = master branch에서 git branch exp

2. master -> exp merge = exp branch에서 git branch master

 

1번 방식으로 실습은 진행하겠습니다.

User@DESKTOP MINGW64 ~/git_branch (master)
$ git merge exp
Merge made by the 'ort' strategy.
 first.txt  | 2 ++
 second.txt | 1 +
 2 files changed, 3 insertions(+)
 create mode 100644 second.txt

ort를 이용한 merge가 성공적으로 진행되었습니다. org, recursive 등에 대해서도 다음 포스팅에서 다루겠습니다. 그리고 log를 통해 확인하겠습니다.

User@DESKTOP MINGW64 ~/git_branch (master)
$ git log --branches --graph
*   commit 6e96469fd84f5b5136909ec39ec4b336cb082ea2 (HEAD -> master)
|\  Merge: cbd6d81 184a36d
| | Author: Yun
| | Date:   Sun Jul 2 21:24:43 2023 +0900
| |
| |     Merge branch 'exp'
| |
| * commit 184a36dfa6bd1663ea39cd9201eb8e072ca30bb2 (exp)
| | Author: Yun
| | Date:   Sun Jul 2 20:46:27 2023 +0900
| |
| |     add2
| |
| * commit 4b90010f9e22f3f6ebfdb7af8050a8e47ac2b3b7
| | Author: Yun
| | Date:   Sun Jul 2 20:44:59 2023 +0900
| |
| |     second
| |
* | commit cbd6d81cc0df9879e28ba50248ed8f91d3766abd
|/  Author: Yun
|   Date:   Sun Jul 2 20:57:07 2023 +0900
|

 

결과를 보면 정상적으로 2개의 branch가 1개의 branch로 merge 되었습니다. exp의 경우 add3을 가지고 있지 않지만, master는 모든 파일을 가지고 있습니다. ls -al을 통해 살펴볼 수 있습니다.

User@DESKTOP MINGW64 ~/git_branch (master)
$ git checkout exp
Switched to branch 'exp'

User@DESKTOP MINGW64 ~/git_branch (exp)
$ ls -al
total 38
drwxr-xr-x 1 User 197121  0 Jul  2 21:32 ./
drwxr-xr-x 1 User 197121  0 Jul  2 21:32 ../
drwxr-xr-x 1 User 197121  0 Jul  2 21:32 .git/
-rw-r--r-- 1 User 197121 44 Jul  2 21:24 first.txt
-rw-r--r-- 1 User 197121  6 Jul  2 21:24 second.txt

User@DESKTOP MINGW64 ~/git_branch (exp)
$ git checkout master
Switched to branch 'master'

User@DESKTOP MINGW64 ~/git_branch (master)
$ ls -al
total 39
drwxr-xr-x 1 User 197121  0 Jul  2 21:33 ./
drwxr-xr-x 1 User 197121  0 Jul  2 21:32 ../
drwxr-xr-x 1 User 197121  0 Jul  2 21:33 .git/
-rw-r--r-- 1 User 197121 44 Jul  2 21:24 first.txt
-rw-r--r-- 1 User 197121  6 Jul  2 21:24 second.txt
-rw-r--r-- 1 User 197121 14 Jul  2 21:33 third.txt

이 점을 해결하기 위해 2번 방식을 이용해 다시 merge를 해줍니다. 이렇게 되면 두 개의 branch가 모두 동일한 내용을 가지는 branch가 되기 때문에 merge를 진행합니다.

User@DESKTOP MINGW64 ~/git_branch (master)
$ git checkout exp
Switched to branch 'exp'

User@DESKTOP MINGW64 ~/git_branch (exp)
$ git merge master
Updating 184a36d..6e96469
Fast-forward
 third.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 third.txt

Fast-forward는 지금은 무시하고, 정상적으로 merge가 된 것에 집중하겠습니다. 다시 log를 통해 살펴보면 두 branch모두 동일한 내용을 가지게 됨을 알 수 있습니다.

User@DESKTOP MINGW64 ~/git_branch (exp)
$ git log --branches --graph
*   commit 6e96469fd84f5b5136909ec39ec4b336cb082ea2 (HEAD -> exp, master)
|\  Merge: cbd6d81 184a36d
| | Author: Yun
| | Date:   Sun Jul 2 21:24:43 2023 +0900
| |
| |     Merge branch 'exp'
| |
| * commit 184a36dfa6bd1663ea39cd9201eb8e072ca30bb2
| | Author: Yun
| | Date:   Sun Jul 2 20:46:27 2023 +0900
| |
| |     add2
| |
| * commit 4b90010f9e22f3f6ebfdb7af8050a8e47ac2b3b7
| | Author: Yun
| | Date:   Sun Jul 2 20:44:59 2023 +0900
| |
| |     second
| |
* | commit cbd6d81cc0df9879e28ba50248ed8f91d3766abd
|/  Author: Yun
|   Date:   Sun Jul 2 20:57:07 2023 +0900
|

이상으로 branch 실습에 대해 마치겠습니다. 다음 글에서는 git branch가 어떻게 내부적으로 작동하는지, 또 conflict, merge 방식 등 해당 글에서 깊게 다루지 못한 내용에 대해 다뤄보겠습니다. 

 

궁금하신 점이나, 잘못된 부분은 언제든 피드백 부탁드립니다!

반응형
Comments