본문 바로가기
C.W.K.
Stream
Lesson 04 of 05 · published

Conflict 해결, 겁먹지 말고

~24 min · conflict, merge

Level 0추적 전 새싹
0 XP0/47 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

conflict는 실패가 아니라 의무 검토야

merge 도중 Git이 "CONFLICT (content):"라고 멈추면 처음에는 겁부터 나. 하지만 Git이 고장 난 게 아니라 추측을 거부한 거야. 두 branch가 같은 줄을 바꿨고 어느 의도가 맞는지는 Git이 결정할 수 없으니 사람이 답해야 해. conflict는 통합 과정의 정상적인 일부야. 망가졌다는 경보로 보느냐, 생각해야 할 지점으로 보느냐가 merge를 피하는 사람과 날마다 ship하는 사람을 가르지.

conflict가 생기면 Git은 해당 파일에 marker를 넣어. <<<<<<< HEAD======= 사이가 현재 쪽, =======>>>>>>> other-branch 사이가 들어오는 쪽이야. 파일의 최종 모습을 결정해 직접 편집하고 marker를 없앤 뒤 git add해. 충돌한 파일을 모두 add하면 git commit으로 merge를 마무리할 수 있어. git status가 단계마다 다음 일을 알려줘.

세 가지 해결 방식이면 대부분을 다룰 수 있어. 한쪽을 통째로 채택하기: 들어오는 변경이 맞고 현재 것을 버려도 된다면 git checkout --ours file 또는 git checkout --theirs file을 실행하고 add해. 둘을 손으로 합치기: 양쪽 변경이 모두 필요할 때 쓰며 list, import, config에서 흔해. 새로 구성하기: 어느 한쪽도 단독으로 올바르지 않아 merge 결과가 양쪽 입력과 달라야 하는 logic conflict에 알맞아.

merge를 시작했지만 빠져나오고 싶다면 git merge --abort로 merge 전 상태로 돌아가. 이미 해결을 commit하고 push했다면 abort할 수 없고, 대신 git revert -m 1 <merge-hash>로 merge의 내용을 되돌릴 수 있어. merge commit의 이력 모양은 남아. 해결을 commit하기 전까지 conflict는 되돌릴 수 있다는 걸 기억해.

Code

Conflict marker 와 해결 loop·bash
# conflict 나는 merge 후 file.js 모양:
# <<<<<<< HEAD
# const color = "blue";
# =======
# const color = "red";
# >>>>>>> feature/red-theme

# 원하는 모양으로 손으로 편집, 예:
# const color = process.env.THEME_COLOR || "blue";

git status                # "both modified: file.js" 표시
git add file.js
git commit                # merge 마무리 (Git 이 메시지 미리 채움)
통째로 채택과 abort·bash
# 내 쪽 (현재 branch) 만:
git checkout --ours conflicted-file
git add conflicted-file

# 상대 쪽 (들어오는 branch) 만:
git checkout --theirs conflicted-file
git add conflicted-file

# 통째로 빠져나오기, merge 전 상태 복원:
git merge --abort

# 이미 commit 된 안 좋은 merge 후:
git revert -m 1 <merge-hash>      # merge content 만 undo, 모양 유지

External links

Exercise

연습용 repo에서 일부러 conflict를 만들어. main에서 feature로 갈라 한 줄을 바꾸고, main으로 돌아와 같은 줄을 다르게 바꾼 뒤 commit하고 git merge feature해. 매번 reset해 다시 시작하면서 충돌 파일을 세 방식으로 해결해봐. ours 통째로, theirs 통째로, 손으로 합성하기야. 각 해결 뒤 git log --oneline --graphgit show를 보고 어느 변경에 어떤 방식이 맞는지 적어.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.