본문 바로가기
Git

Git의 원리] 3. git branch, merge

by Fastlane 2022. 8. 26.
728x90
반응형
# git_test directory를 git init한다. 
$ git init
Initialized empty Git repository in C:/Project/git_test/.git/

# f1.txt파일을 추가 저장한다. 
$ vim f1.txt

# 수정사항을 add 하고 '1' commit을 생성한다. 
$ git add .
$ git commit -m '1'
[master (root-commit) 689c9ed] 1
 1 file changed, 1 insertion(+)
 create mode 100644 f1.txt

# exp branch를 생성한다. master와 exp branch의 상태는 동일하다. 
$ git branch exp

# exp branch로 checkout 한다음 f1.txt파일을 수정해서 commit 2, 3을 생성한다. 
$ git checkout exp
Switched to branch 'exp'

$ vim f1.txt

$ git add .
$ git commit -m '2'
[exp a6bb51e] 2
 1 file changed, 1 insertion(+)

$ vim f1.txt

$ git add .
warning: LF will be replaced by CRLF in f1.txt.
The file will have its original line endings in your working directory

$ git commit -m '3'
[exp 17c77b9] 3
 1 file changed, 1 insertion(+)

# 이번엔 master branch를 check out하여 '4' commit을 생성한다. 
$ git checkout master
Switched to branch 'master'

$ vim f1.txt

$ git add .

$ git commit -m '4'
[master 7639f92] 4
 1 file changed, 1 insertion(+)

# 이제 모든 branch의 commit log를 graph형태로 확인해보자. 
# master branch에는 '2', '3'commit이 없는 것을 확인할 수 있다. 
$ git log --branches --decorate --graph
* commit 7639f9290fe0281402909143ca2def26465fbdb6 (HEAD -> master)
| Author: abc
| Date:   Fri Aug 26 13:47:04 2022 +0900
|
|     4
|
| * commit 17c77b90fe611afca97910dc9bff5a7706ac162f (exp)
| | Author: abc
| | Date:   Fri Aug 26 13:44:54 2022 +0900
| |
| |     3
| |
| * commit a6bb51e58b60ca05cb36c2b303e730d35fb1eb05
|/  Author: abc
|   Date:   Fri Aug 26 13:44:12 2022 +0900
|
|       2
|
* commit 689c9ed76d359414f3bb3fd39e3ea111a93407a6
  Author: abc
  Date:   Fri Aug 26 13:39:30 2022 +0900

      1

# --oneline이라는 옵션으로 축약해서 확인도 가능하다. 
admin@DESKTOP-LFHA7HJ MINGW64 /c/Project/git_test (master)
$ git log --branches --decorate --graph --oneline
* 7639f92 (HEAD -> master) 4
| * 17c77b9 (exp) 3
| * a6bb51e 2
|/
* 689c9ed 1

# 이제 master branch가 commit '3', '4'의 내용을 가질 수 있도록 merge해보자. 
# master와 exp branch에서 모두 f1.txt파일을 수정했기 때문에 충돌 에러가 발생한다. 
$ git merge exp
Auto-merging f1.txt
CONFLICT (content): Merge conflict in f1.txt
Automatic merge failed; fix conflicts and then commit the result.

# gui tool로 conflict를 해결하고 git commit한다. 
$ git commit
[master 8637bb9] Merge branch 'exp'

$ git log --branches --decorate --graph --oneline
*   8637bb9 (HEAD -> master) Merge branch 'exp'
|\
| * 17c77b9 (exp) 3
| * a6bb51e 2
* | 7639f92 4
|/
* 689c9ed 1

# exp branch가 4번 commit 내용을 가질 수 있도록 merge한다. 
$ git checkout exp
Switched to branch 'exp'

$ git merge master
Updating 17c77b9..8637bb9
Fast-forward

# master, exp branch의 내용이 동일해졌다. 
# 마지막 commit의 부모 commit은 2개('3', '4'번 commit)이다. 
$ git log --branches --decorate --graph --oneline
*   8637bb9 (HEAD -> exp, master) Merge branch 'exp'
|\
| * 17c77b9 3
| * a6bb51e 2
* | 7639f92 4
|/
* 689c9ed 1

# git cat-file -p commit id로 확인해보면, parent가 2개임을 확인할 수 있다. 
$ git cat-file -p 8637bb923b00727733a990b89d52a8daffea9855
tree 77aa31a93565e0c5809ff487b849af48ac7df624
parent 7639f9290fe0281402909143ca2def26465fbdb6
parent 17c77b90fe611afca97910dc9bff5a7706ac162f
author abc 1661489365 +0900
committer abc 1661489365 +0900

Merge branch 'exp'


# 이제 master branch를 checkout 한 다음, exp branch를 삭제해보자. 
$ git checkout master
Switched to branch 'master'

$ git branch exp -d
Deleted branch exp (was 8637bb9).

# master branch의 commit log만 확인할 수 있다. 
$ git log --branches --decorate --graph --oneline
*   8637bb9 (HEAD -> master) Merge branch 'exp'
|\
| * 17c77b9 3
| * a6bb51e 2
* | 7639f92 4
|/
* 689c9ed 1
728x90
반응형

댓글