DevOps/GIT

github#6 git merge conflict

aliceintr 2020. 11. 20. 03:40
반응형

merge를 할때 충돌이 일어나는 경우도 있다. 이런경우에 대한 학습을 해보도록하자.

git merge 는 기본적으로 각각의 브랜치가 가지고 있는 파일이 다를 경우 merge를 함과 동시에 해당 브랜치에 있는 모든 파일이 다 병합된다.

문제는 만약 같은 파일을 다른 브랜치에서 수정했을 때 발생한다.

#먼저 지금 현재 내가 가지고 있는 브랜치 리스트를 체크한다. 
% git branch
* exp
  master
 
#exp 브랜치 아래에 aaa.txt 라는 파일을 만들고 내용을 넣어서 저장한다. 
% vi aaa.txt

#저장 후 commit 
% git add aaa.txt
% git commit -m "exp:1" 
[exp 841c3f7] exp:1
 1 file changed, 2 insertions(+)
 create mode 100644 aaa.txt

#master 브랜치로 체크아웃 ~
% git checkout master
Switched to branch 'master'

#exp 와 master 의 병합
% git merge exp
Updating c8d9975..841c3f7
Fast-forward
 aaa.txt | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 aaa.txt

#마스터 브랜치가 aaa.txt 파일을 가진것을 볼 수 있다. 
% ls -al
total 104
drwxr-xr-x  14 alice  staff   448 19 Nov 13:16 .
drwx------@  9 alice  staff   288 16 Nov 16:24 ..
-rw-r--r--@  1 alice  staff  6148 16 Nov 13:27 .DS_Store
drwxr-xr-x  13 alice  staff   416 19 Nov 13:16 .git
-rw-r--r--   1 alice  staff     8 19 Nov 13:16 aaa.txt

 

 

이제 각각의 브랜치에서 aaa.txt 파일을 다른 내용으로 수정한다.

#master 브랜치에 있는 aaa.txt 파일수정 -> git add -> git commit
% git checkout master
% vim aaa.txt 
% git add aaa.txt
% git commit -am "master:1" 
[master 97241d3] master:1
 1 file changed, 2 insertions(+)

#exp 로 브랜치 바꾸고 aaa.txt파일을 master와 다르게 수정 -> git add -> git commit 
% git checkout exp
Switched to branch 'exp'
% vim aaa.txt
% git add aaa.txt
% git commit -am "exp:2"
[exp 99243bc] exp:2
 1 file changed, 2 insertions(+), 2 deletions(-)

#master 로 체크아웃
% git checkout master
Switched to branch 'master'

#exp 파일과 병합
% git merge exp
Auto-merging aaa.txt
CONFLICT (content): Merge conflict in aaa.txt
Automatic merge failed; fix conflicts and then commit the result.

master에 있는 파일 내용을 보자.

<<<<<<<< HEAD 의 내용은 현재 내가 체크아웃하고 있는 브랜치의 파일내용을 보여준다

>>>>>>>> exp 의 내용은 exp 브랜치 파일 내용을 보여준다.

% cat aaa.txt
<<<<<<< HEAD
aaa
bbb
ccc
1234
=======
1234
fghj
>>>>>>> exp

git status 를 보면

% git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
	both modified:   aaa.txt

이 때 개발자가 직접 수정해 주어야 한다.

% git checkout master

#ccc 다음에 123을 추가해줌
% vi aaa.txt
aaa
bbb
ccc 123
% git add aaa.txt

% git commit -am "master:2"
[master 324eae6] master:2

% git checkout exp
Switched to branch 'exp'

% git merge master
Updating 99243bc..324eae6
Fast-forward
 aaa.txt | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

% cat aaa.txt
aaa
bbb
ccc 123

aaa.txt 파일이 exp 브랜치의 파일과 잘 병합된 것을 확인 할 수 있다.

 

더 자세한 내용을 원한다면 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

 

내용이 도움이 되셨다면 블로그 구독하기 부탁드리겠습니다.

* 이 글의 모든 저작권은 aliceintr에 있으며 무단 배포 및 사용은 자제해 주시기 바랍니다. *

반응형

'DevOps > GIT' 카테고리의 다른 글

github#8 git stash  (0) 2020.11.20
github#7 3 ways merge  (0) 2020.11.20
github#5 git HEAD file  (0) 2020.11.20
github#4 branch  (0) 2020.11.17
github#3 gistory and git rm  (0) 2020.11.16