GIt 병합과 충돌(merge, conflict)
병합(merge)
브랜치를 따로 파서 git push 명령어를 통해 깃허브 홈페이지에 올리면 다음과 같이 노란색 박스가 생긴다.
feature/login 브랜치에 push가 되었으며, Compare & pull request를 할 수 있다.
해당하는 버튼을 누르면 pull request를 할 수 있다.
먼저 상단에서는 어떤 브랜치를 어떤 브랜치에 병합할지를 선택할 수 있다.
지금 설정은 main 브랜치에 feature/login브랜치를 병합한다는 의미이다.
다음으로 제목, 부가설명을 입력하고 Reviewer, Assignee 등을 설정할 수 있다.
부가설명 입력은 마크다운을 지원하기 때문에 마크다운 문법을 적용할 수 있다.
마지막으로 맨 밑에서는 커밋 개수, 변경된 파일 개수, 기여자 수와 변경된 파일 내역을 확인할 수 있다.
모든 입력을 완료하고 병합을 하길 원한다면 Create pull request 버튼을 눌러 병합을 진행할 수 있다.
버튼을 눌렀다고 바로 병합이 된 것이 아니다.
상단 Pull requests 옆에 1 이라는 숫자가 생기며 새로운 pull request가 생긴 것을 볼 수 있다.
여기서 최종적으로 판단을 한 이후, Merge pull request 버튼을 눌러 최종적으로 병합을 진행할 수 있다.
병합이 잘 된 모습이다. 이제 main 브랜치는 feature/login 브랜치와 병합되었으며 내용 역시 업데이트되었음을 볼 수 있다.
하지만 지금은 아무 문제 없이 병합이 잘 되었지만, 여러 명이 동시에 작업을 하다 보면 문제가 발생할 수 있다.
그 전에 먼저 원격 브랜치와 로컬 브랜치를 동기화해보자.
동기화(fetch)
먼저 기존에 있던 브랜치 feature/login을 제거하였다.
이후 터미널에서 git branch -r을 통해 원격 브랜치를 확인해보면 여전히 feature/login이 살아있는 것을 볼 수 있다.
살아있다 생각하여 git pull origin feature/login을 통해 feature/login 브랜치로부터 pull을 받으려 하면 찾을 수 없다는 메시지가 나온다. 그런데 git branch -r 을 통해 확인하면 여전히 살아있는 모습이다.
이를 해결하기 위해 동기화를 진행하는 명령어는 git fetch -p 이다.
git fetch 명령을 통해 feature/login 브랜치가 사라진 것을 확인할 수 있다.
충돌(conflict)
먼저 충돌 상황을 만들어주기 위해 다음과 같이 두 개의 작업 환경을 만들어두었다.
이후 각각의 브랜치에 feature/1과 feature/2 두 가지의 브랜치를 만들어주었다.
feature/1 브랜치에서는 test.txt를 feature/1이라 편집하고, feature/2 브랜치에서는 test.txt를 feature/2라 편집해 푸쉬해주었다.
깃허브 홈페이지를 보면 다음과 같이 feature/1과 feature/2가 push됐다는 것을 확인할 수 있다.
먼저 feature/1을 머지해준다. 정상적으로 Able to merge가 나오며 머지가 되는 것을 확인할 수 있다.
하지만 feature/1을 머지한 이후 feature/2를 머지하려 하면 Can't automatically merge 라는 문구가 나온다.
그래도 Don't worry, you can still create the pull request라는 문구가 나온다.
이 브랜치는 충돌이 일어나 해결해야 한다는 문구가 나온다.
Resolve conflicts를 눌러 충돌을 해결하자.
충돌이 일어나는 부분이 노란색 배경과 주황색 괄호로 표시되어 있다.
<<<<<<< feature/2 밑에는 feature/2 브랜치에서 작업한 내용,
<<<<<<< feature/1 밑에는 feature/1 브랜치에서 작업한 내용이 나와 있다.
이 부분을 원하는 브랜치의 작업 내용으로 수정해준 뒤 Mark as resolved 버튼을 누르자.
충돌이 해결되었고 Commit merge 버튼이 활성화되었다.
위와 같은 과정을 통해 충돌을 해결하고 병합을 진행할 수 있다.