충돌(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 |