Git

Git의 원리] 5. git merge, conflict (TortoiseGit)

Fastlane 2022. 9. 6. 16:31
728x90
반응형

2개의 branch에서 동일한 파일을 수정한 다음, merge 하는 경우 git은 자동 merge를 할 수 없어서 conflict를 발생시킨다. 

이때 어떻게 conflict를 처리할 수 있는지 알아보자. 

 

# git_test directory를 git 초기화한다. 
$ git init
Initialized empty Git repository in C:/Project/git_test/.git/

# f1.txt파일을 생성하고 간단한 소스를 입력하고 저장한다. 
$ vim f1.txt

# f1.txt파일을 add하고 commit한다. 
$ git add f1.txt
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 '1'
[master (root-commit) f2551e9] 1
 1 file changed, 3 insertions(+)
 create mode 100644 f1.txt

# exp branch를 생성한다음 checkout 한다. 
$ git checkout -b exp
Switched to a new branch 'exp'

# f1.txt파일을 수정하고 저장한다. 
$ vim f1.txt

# 수정사항을 add하고 commit한다. 
$ git commit -am 'common -> exp'
warning: LF will be replaced by CRLF in f1.txt.
The file will have its original line endings in your working directory
[exp 7b9644b] common -> exp
 1 file changed, 1 insertion(+), 1 deletion(-)

# master branch로 checkout한다. 
$ git checkout master
Switched to branch 'master'

# f1.txt파일을 수정하고 저장한다. 
$ vim f1.txt

# f1.txt파일을 add하고 commit한다. 
$ git commit -am 'common->master'
[master b6472a8] common->master
 1 file changed, 1 insertion(+), 1 deletion(-)

# exp branch를 merge하면, 충돌이 발생한다!!!!!!!!!!!!!!!!!!
$ git merge exp
Auto-merging f1.txt
CONFLICT (content): Merge conflict in f1.txt
Automatic merge failed; fix conflicts and then commit the result.

# index파일을 살펴보면, object hash id다음에 평소와는 다르게 1, 2, 3의 숫자가 있다. 
$ git ls-files --stage
100644 e541a4178e6603b24d22ef570ca1efa21cedc587 1       f1.txt
100644 4fdcca5027e1aea348b8c69d4261466a7d197f5e 2       f1.txt
100644 2093f38880ed7601e48e9da2da4eb938f62b784b 3       f1.txt

# 1번 object를 내용은 양쪽 branch 공통의 commit의 파일내용이 있다. 
$ git cat-file -p e541a4178e6603b24d22ef570ca1efa21cedc587
function(){
        return 'common';
}

# 2번 object에는 master branch의 commit 파일내용이 있다. 
$ git cat-file -p 4fdcca5027e1aea348b8c69d4261466a7d197f5e
function(){
        return 'master';
}

# 3번 object에는 exp branch의 commit 파일내용이 있다. 
$ git cat-file -p 2093f38880ed7601e48e9da2da4eb938f62b784b
function(){
        return 'exp';
}

# 현재 branch들의 commit은 아래와 같다. 
$ git log --branches --decorate --graph --oneline
* b6472a8 (HEAD -> master) common->master
| * 7b9644b (exp) common -> exp
|/
* f2551e9 1

 

이제 TortoiseGit이라는 Git GUI프로그램을 이용해서 충돌된 파일을 처리해보자. 

파일 우측클릭하여 Edit conflicts 메뉴를 선택한다. 

 

Edit conflicts 메뉴를 클릭하면, 아래이 Merge할 수 있는 TortoiseGitMerge화면이 뜨면서, 자동으로 f1.txt.BASE.txt, f1.txt.LOCAL.txt, f1.txt.REMOTE.txt파일이 추가된다. 

 

프로그램을 닫으면 자동생성된 파일 3개는 자동 삭제된다. 

 

아래 화면에서 Use 'theirs' text block 버튼을 클릭해서 원하는 text block을 선택할 수 있고, 아니면 직접 타이핑해서 Merged f1.txt파일을 수정할 수 있다. 

 

최종 Merged f1.txt파일을 수정했으면, Mark as resolved 버튼을 클릭하여 충돌을 처리한다. 

 

# 충돌이 처리되었고, f1.txt파일이 add된것을 확인할 수 있다. 
$ git status
On branch master
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:
        modified:   f1.txt


# index파일에 1, 2, 3번 object가 없어지고 0번으로 add된 파일의 object만 보여진다. 
$ git ls-files --stage
100644 f3db1d6e0aa58bce04cdb715387fba04cff5b7f1 0       f1.txt

# object를 확인하면 최종 merge된 파일 내용을 확인할 수 있다. 
$ git cat-file -p f3db1d6e0aa58bce04cdb715387fba04cff5b7f1
function(){
        return 'master, exp';
}

# commit한다. 
$ git commit
[master 7ee8df2] Merge branch 'exp'

commit하면 Merge branch 'exp'라는 제목의 자동 commit message가 표시된다. 

commit message를 저장하고 commit log를 확인하면 Merge commit을 확인할 수 있다. 

$ git log
commit 7ee8df25212264fd85325056fc60a43c93812f42 (HEAD -> master)
Merge: b6472a8 7b9644b
Author: 
Date:   Tue Sep 6 16:12:51 2022 +0900

    Merge branch 'exp'

commit b6472a858ef2d025f25eae64aaff84868384470e
Author: 
Date:   Tue Sep 6 14:34:46 2022 +0900

    common->master

commit 7b9644bc2a28010f5b07a7fbecf54f9d3c194cb0 (exp)
Author: 
Date:   Tue Sep 6 14:20:47 2022 +0900

    common -> exp

commit f2551e92bb3ceeb2e93ed28e63c9bfeb66943ed6
Author: 
Date:   Tue Sep 6 14:19:44 2022 +0900

    1
728x90
반응형