※ 일본의 한 블로그 글을 번역한 포스트입니다. 오역 및 의역, 직역이 있을 수 있으며 틀린 내용은 지적해주시면 감사하겠습니다.
개요
작업 브랜치로 편집한 후에 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
이것으로 충돌 해결은 끝이다.
참고자료
'IT > 기초 지식' 카테고리의 다른 글
[DDD] CQRS 입문 (0) | 2023.05.17 |
---|---|
[CSS] CSS로 긴 문자를 생략형(...)으로 바꾸는 방법 (0) | 2023.05.10 |
오브젝트 지향의 삼대요소(계승(상속), 캡슐화, 다형성)를 활용한 구현 예시 (0) | 2023.04.30 |
[CSS] Flexbox 레이아웃 정리 (0) | 2023.04.27 |
[PostgresSQL] PostgresSQL로 JSON 만들기 (0) | 2023.04.17 |