[GIT] 브랜치 병합 충돌 시 해결 (ft. mergetool set vscode)
우선 이전에 작성한 글에서 브랜치 병합에는 merge와 rebase가 있다고 설명을 하였다.
보통 충돌이 나는 이유는 "같은 파일"을 대상으로 작업을 할 때 충돌이 가장 많이 난다고 생각된다.
각각 merge와 rebase에서 충돌이 날 경우 처리해 주는 방법이 다른데 이 방법에 대해 알아보자.
git merge conflict
우선 서로 다른 브랜치가 같은 파일을 수정했다는 상황에서 시작해보자.
여기서 지금 master 브랜치와 record 브랜치가 동일한 b.txt라는 파일을 수정해서 commit을 진행하였다.
만약 여기서 merge를 하게 되면 어떻게 될까?
바로 b.txt 라는 파일이 병합하는 도중에 충돌이 났다고 알려준다.
그러고서는 브랜치명이 빨갛게 변한 것을 볼 수 있다.
여기서 간단하게 해당 파일을 찾아가서 수정하는 것도 방법이지만,
우리는 mergetool이라는 명령어를 통해 vscode로 해당 파일을 열어서 수정하고자 한다.
git mergetool 설정
mergetool을 사용하기 전에 우선 .gitconfig 파일에 mergetool을 설정을 해주자.
git config --global --edit
위 명령어를 입력하면 vscode나 설정에 따른 에디터가 실행될 것이다.
(vscode를 실행하려면 core editor를 vscode로 설정해 놔야한다.)
그리고 아래 설정들을 추가해주자.
[merge]
tool = vscode
[mergetool "vscode"]
cmd = code --wait $MERGED
[mergetool]
keepBackup = false
(* 여기서 keepBackup은 병합 충돌이 나면 보통 원본 파일을 백업해둘 텐데 그게 필요 없다고 설정해 둔 것이다.)
git merge conflict 해결
자 mergetool을 설정했다면 mergetool을 이용해 conflict를 해결해보자.
git mergetool
mergetool 명령어를 실행하게 되면 vscode가 열리면서 충돌된 파일을 보여준다.
자 이렇게 충돌난 파일을 잘 수정해서 정리해주자.
그리고 mergetool로 editor를 열었기 때문에 저장하고 파일을 닫아주자.
그다음 이제 git commit을 입력해 주면 충돌이 해결된다.
깔끔하게 충돌 없이 merge 된 것을 볼 수 있다.
git rebase conflict
자 그럼 rebase의 경우에는 어떤 식으로 해야 할까?
git merge conflict 예제 처럼 처음에 같은 상황에서 시작해보자.
그다음 바로 rebase를 실행해보자.
git merge와 다르게 좀 더 다양한 경고메시지와 힌트가 등장한다.
영문이 줄줄이 있는거 보니 아찔하다.
여기서는 hint에 적힌 그대로 행동하기만 하면 되는데, 사실 그냥 충돌 난 파일 수정하고 git rebase --continue만 실행해주면 끝이 난다.
여기서도 똑같이 mergetool을 이용해서 수정을 해주도록 하자.
어떤 방법이든 상관없이 충돌 난 파일을 어쨌든 수정해서 해결을 해야 한다.
그다음 파일을 다시 add를 해준 다음 git rebase --continue 명령어를 실행해 주면 된다.
순서는 다시 정리하자면 다음과 같다.
$ git rebase <브랜치 명>
# 충돌 난 파일을 git mergetool이나 다른 방식으로든 해결하고 나서
# git add로 다시 추가해줘야 한다.
$ git add .
# 여기서 git add를 했다고 해서 굳이 다시 commit을 할 필요는 없고
# git add 후 충돌로 멈췄던 git rebase를 continue 해주기만 하면 끝이다.
$ git rebase --continue
이렇게 간단한 git merge와 git rebase 충돌에 대해 해결하는 방법에 대해 알아봤는데,
사실 협업에서 충돌을 최대한 줄이기 위해서는 master 브랜치의 변화를 지속적으로 내 로컬로 가져오는 게 중요하다고 생각된다. 항상 최신 버전을 유지해야 나중에 병합할 때 충돌이 덜 날 것이라고 생각된다.
참고: https://backlog.com/git-tutorial/kr/stepup/stepup2_7.html