Study Programming/Git

Git 브랜치(Branch)다루기3 - 충돌(Conflict) 기초

네모메모 2021. 8. 9. 21:40
반응형

 


 

충돌(CONFLICT)의 기초


 "충돌(CONFLICT)이 발생했다" 

  = Merge하는 두 브랜치에서 같은 파일의 한 부분을 동시에 수정하고 Merge하면, 
     Git은 해당 부분을 Merge 하지 못하는(=Merge가 실패) 경우 "충돌이 발생"했다고 말한다.
 

 

 - 충돌이 발생하면 $ git merge 명령어에서 아래와 같은 충돌 메시지 출력한다.

$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.


 - 3-Way Merge 시 충돌이 발생하면 Merge 하지 못하므로 Merge 커밋이 생기지 않는다. (당연하다!)


 - 충돌은 개발자가 해결해야 한다, 그렇지 않으면 Merge 과정을 진행할 수 없다. 
 

 

 


그렇다면, 본격적으로 충돌(conflict)을 해결해보자!

 


충돌이 발생한 파일 확인 : $ git status 명령

 : 충돌이 일어난 파일은 "Unmerged 상태"로 표시된다.


 Ex)   

$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")

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

both modified:      index.html

no changes added to commit (use "git add" and/or "git commit -a")

 

 

 

충돌 해결하기

  : 개발자가 해결하지 않는 한 Merge 과정을 진행할 수 없다

 

- Git은 충돌이 발생하면 충돌이 난 부분을 표준 형식에 따라 표시한다.

  충돌 난 부분은 아래와 같이 표시된다.

<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
 please contact us at support@github.com
</div>
>>>>>>> iss53:index.html

  ㄴ> '=======' 위쪽의 내용 : HEAD 버전(merge 명령을 실행할 때 작업하던 master 브랜치)의 내용 (HEAD:index.html)
  ㄴ> '=======' 아래쪽의 내용 : merge 대상 브랜치의 내용 (iss53:index.html)

 

 

충돌을 해결하려면,

ⓐ 위쪽이나 아래쪽 내용 중에서 고르거나(#1) 새로 작성하여 Merge한다(#2)

ⓑ 이후,  '<<<<<<<', '=======', '>>>>>>>'가 포함된 행을 삭제


ⓒ 이후, $ git add 명령으로 다시 Git에 저장한다.

ㄴ> ex) 충돌한 양쪽에서 조금씩 가져와 아예 새로 작성하여 충돌을 해결하는 예 (#2방법)

<div id="footer">
please contact us at email.support@github.com
</div>

 

 

 


 


다른 Merge 도구로 충돌을 해결

 

$ git mergetool 명령 실행 시 지정된 Merge도구 실행되고 Merge도구로 merge작업한다.

ⓑ 이후 Merge 도구를 종료하면 Git은 잘 Merge 했는지 물어본다. 

잘 마쳤다고 입력하면 자동으로 $ git add 가 수행되고 해당 파일이 Staging Area에 저장된다. 

ⓓ $ git status 명령으로 충돌이 해결된 상태인지 다시 한번 확인해볼 수 있다.

ⓔ 충돌을 해결하고 나서 해당 파일이 Staging Area에 저장됐는지 확인했으면 $ git commit 명령으로 Merge 한 것을 커밋한다. 
   ㄴ> Exⓔ ) 충돌을 해결하고 Merge 할 때는 커밋 메시지가 아래와 같다.

Merge branch 'iss53'

Conflicts:
index.html
#
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
# .git/MERGE_HEAD
# and try again.


# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# All conflicts fixed but you are still merging.
#
# Changes to be committed:
# modified:   index.html
#

 

 




 

 


 

END!

 

 


스터디 도움 참조 블로그 (References)

- 3.2 Git 브랜치 
https://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

- 브랜치 명령어
https://backlog.com/git-tutorial/kr/reference/branch.html

- git--distributed-even-if-your-workflow-isnt (Pro Git Book)
https://git-scm.com/book/en/v2

 

 

 

반응형