IT/기초 지식

[git] Git 충돌(conflict) 해결 방법

개발자 두더지 2023. 5. 8. 20:18
728x90

일본의 한 블로그 글을 번역한 포스트입니다. 오역 및 의역, 직역이 있을 수 있으며 틀린 내용은 지적해주시면 감사하겠습니다.

 

 

개요


 작업 브랜치로 편집한 후에 pull request를 냈을 때 충돌이 발생했을 때 어떻게 해결해야하는지에 대해서 설명하고자 한다. 이 포스트에서 등장하는 브랜치는 총 세 가지이다.

  • develop (merge할 곳)
  • a_branch  (이미 develop에 merge되어 있는 브랜치)
  • b_branch (작업 브랜치)

 전제 조건은 작업 브랜치(b_branch)에서 develop로 pull request를 냈을 때이다. 그리고 이미 a_branch는 merge되어 있어, 그 브랜치에서 편집편집된 것과 충돌이 발생한 상황이라고 가정한다.

 충돌이 발생한 상황에서 pull request를 내면 다음과 같이 표시될 것이다.

 

 

사전 준비


 develop를 최신화한다.

# 브랜치를 develop로 전환한다.
git checkout develop

# pull한다(리모트의 상태를 반영하여 최신화한다)(fetch + merge로 해도OK)
git pull origin develop

 

작업 브랜치에 develop를 merge한다.

# 작업 브랜치로 바꾼다.
# git checkout <작업브랜치>
git checkout b_branch

# develop를 merge한다.
git merge develop

그러면 충돌이 발생하고 있다고 경고 표시가 뜰 것이다.

Auto-merging fuel/app/classes/util/message.php
CONFLICT (add/add): Merge conflict in fuel/app/classes/util/message.php
Automatic merge failed; fix conflicts and then commit the result.

 

상태를 확인한다.

git status

 그러면 다음과 같은 내용이 표시될 것이다.

On branch b_branch
# 여기에서도 merge되지 않은 것을 알려주고 있다.
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

# a_branch가 추가한 파일로, 충돌이 발생하지 않았으므로 자동으로 merge되었다.
Changes to be committed:

        new file:   fuel/app/classes/util/ahoge.php

# 충돌이 발생하여 자동으로 merge되지 않은 것들이 표시된다.
# ※ 이 파일들을 수정하여 충돌을 해결해 줄 필요가 있다! ※
Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both added:      fuel/app/classes/util/message.php

 로그도 살펴본다(IDE의 플러그인이나 그 외 다른 툴로 확인해도 괜찮다).

git log --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative

 참고로 .gitconfig에 alias를 설정하여「git graphall」으로 확인할 수 있도록 했다.

 

 

충돌 해결


그럼 본격적으로 충돌을 해결 해보자. 이 포스트에서는 netbeans를 이용해서 해결하고 있지만, 본인이 좋아하는 에디터를 사용하면 된다.

 

확인

 both added라고 표시되어 있는 충돌이 일어나고 있는 파일인 fuel/app/classes/util/message.php가 다음과 같이 빨갛게 표시되어 있다.

 파일을 열어보면 충돌이 발생되어 있는 부분은 다음과 같이 표시된다.

<<<<<<< HEAD
# 작업 브랜치에서 변경된 내용
・・・
=======
# develop(merge한 브랜치)에서 변경된 내용
・・・
>>>>>>> develop

 파일을 신규 생성 및 정수의 추가는 a_branch에서도 작업 브랜치인 b_branch에서도 했었다.

<<<<<<< HEAD
<?php

class Util_Message
{
    const B_MESSAGE_1 = 'bbranch가 추가한 첫 번째 메시지';
    const B_MESSAGE_2 = 'bbranch가 추가한 두 번째 메시지';
=======
<?php

class Util_Message
{
    const A_MESSAGE_1 = 'abranch가 추가한 첫 번째 메시지';
    const A_MESSAGE_2 = 'abranch가 추가한 두 번째 메시지';
>>>>>>> develop
}

 

차이를 확인했으면 편집한다.

에디터에 따라 다르지만 netbeans의 경우 해당 파일을 오른쪽 클릭하여 차이 > HEAD와의 차이를 선택한 후 에디터를 실행시킨다.

 

편집이 끝났다면 그 파일을 git add한다.

git add fuel/app/classes/util/message.php

 

한 번 더 상태를 확인한다.

git status

 충돌을 해결됐고, Changes to be committed 항목에 편집한 파일이 추가된 것을 알 수 있다.

On branch b_branch
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

        new file:   fuel/app/classes/util/ahoge.php
        modified:   fuel/app/classes/util/message.php

 

commit하고 push하면 OK

git commit -m "메시지" # 기본 merge 코멘트를 사용하는 경우는 git commit로 OK

git push origin b_branch

 이것으로 충돌 해결은 끝이다.


참고자료

https://qiita.com/crarrry/items/c5964512e21e383b73da

728x90