오늘 git branch 부터 시작해서 pr 까지 종합적으로 엄청 여기저기 돌아다니며 많은 공부를 했다. 내가 정확히 이해하지 못했던 가장 핵심은 conflict 였다. conflict는 같은 곳을 수정하면 발생하는 것을 말한다. 기본적으로 merge하면 코드들을 자동적으로 더하고 수정하는 것을 git merge 명령어가 알아서해주는데 같은 곳을 수정하면 그렇게 바꿔주지 않는다. 여기서 2 way merge 와 3 way merge 를 알아야한다.
2개의 브랜치를 비교해서 merge 하는 것을 말한다. 단순히 코드끼리 비교해서 코드가 추가됐거나 빠진 건 알아서 더해서 커밋을 만들지만, 같은 곳을 수정하게 되면 conflict가 발생한다. 라인 단위로 같은 곳이 두 곳이면 두 곳이 충돌이 일어나고 세 곳이면 세 곳에서 발생한다. 이렇게 두 브랜치끼리 비교하는 것을 2 way merge라고 한다.
중요하다. 3 way merge는 2 way merge를 좀 더 잘 대처하기 위해서 나왔다. 3 way merge는 merge하려는 두 커밋과 공통된 조상 (베이스) 를 비교해서 수정된 부분으로 merge한다. 이걸 쉽게해주는 tool이 있다.
git mergetool 라고 입력하면 GUI로 된 mergetool
을 사용할 수 있는데, 이건 인터넷에서 다운받아서 gitconfig 도 설정해줘야한다. 많은 mergetool 이 있는데 그중에서 생활코딩 같은 경우 p4merge 를 안내한다.
설정까지 모두 마치면 깃이 충돌난 상황에서 git mergetool 이라고 입력하면 아까 설정한 p4merge가 실행된다. mergetool은 커밋사이의 공통조상, 즉 베이스와 비교해서 자동으로 merge한 결과를 아래에 보여준다.
자동으로 해주는 부분은 베이스의 커밋을 기준으로 베이스와 코드가 다르면 코드가 다른 커밋의 내용으로 대체한다. 그러나 베이스 커밋을 기준으로 merge하려는 두 커밋 모두 같은 부분을 서로 달리 코드를 수정했다면 mergetool에서 직접 원하는 코드로 수정해서 저장해주면 된다.