브랜치 병합 및 충돌 해결


기능 브랜치가 완성되었습니다. 토글이 작동하고, 변경 사항을 커밋했으며, 이제 팀의 나머지 코드가 있는 main에 그 작업을 통합하고 싶습니다. 대부분의 경우 이를 가져오는 것은 빠르고 조용합니다. Git이 두 브랜치를 비교하고, 겹치는 부분이 없음을 발견하고, 추가 단계 없이 작업을 통합합니다. 그러나 때때로 당신과 팀원이 다른 브랜치에서 정확히 같은 줄을 변경하면, Git이 어느 버전을 유지할지 추측할 수 없습니다. 이 상황은 두 명 이상의 사람이 커밋하는 거의 모든 프로젝트에서 나타납니다. 이는 브랜칭의 일반적인 일상적 부분이며, Git이 같은 줄에 대해 두 가지 아이디어를 발견했으며 어느 것이 우선인지 판단해 달라는 것을 의미합니다.
git merge로 브랜치 되돌리기
add-fahrenheit-toggle이라는 자신만의 브랜치에서 화씨 토글을 만들었고, main이 브랜칭 이후 이동하지 않았다고 가정해봅시다. main으로 전환하고 가져올 브랜치 이름과 함께 git merge를 실행합니다:
$ git switch main
$ git merge add-fahrenheit-toggle
Updating 4f2a891..8c3d1a0
Fast-forward
src/index.js | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)git merge <branch>는 항상 명명된 브랜치를 현재 있는 브랜치로 병합하므로, 먼저 main으로 전환하는 것이 중요합니다. 당신이 있는 브랜치가 병합을 받는 브랜치입니다. 이것을 실행한 후, main은 add-fahrenheit-toggle의 모든 커밋을 가지고 있습니다. 기능 브랜치 자체는 건드려지지 않습니다. 이제 계속 작업하거나 그 작업이 main에도 있으므로 삭제할 수 있습니다.
git merge branch-name은 그 브랜치의 커밋을 현재 있는 브랜치로 가져오므로, 먼저 main으로 전환하십시오. 대부분의 병합은 백그라운드에서 조용히 일어나고 당신은 계속 진행됩니다. 기능 브랜치 자체에 대해 아무것도 변하지 않습니다. 계속 사용하거나 main이 작업을 가지고 있으면 삭제할 수 있습니다. 병합 충돌의 모양
충돌은 병합의 양쪽에서 같은 줄이 변경되고 Git이 어느 버전을 원하는지 알 수 있는 방법이 없을 때 발생합니다. 팀원이 main에 로딩 스피너를 병합했고 src/index.js에서 함수를 변경했고, 당신의 add-fahrenheit-toggle 브랜치가 같은 함수를 변경하여 토글을 추가했다고 합시다. 지금 병합하면 완료하는 대신 중간에 중단됩니다:
$ git switch main
$ git merge add-fahrenheit-toggle
Auto-merging src/index.js
CONFLICT (content): Merge conflict in src/index.js
Automatic merge failed; fix conflicts and then commit the result.이것은 **병합 충돌(merge conflict)**입니다. 파일을 열면 Git이 두 버전이 정확히 어디서 불일치하는지 표시했음을 알 수 있습니다:
<<<<<<< HEAD
showLoadingSpinner(true);
=======
const tempF = celsiusToFahrenheit(tempC);
>>>>>>> add-fahrenheit-toggle<<<<<<< HEAD는 현재 당신의 브랜치(main의 경우)에 있는 것의 시작을 표시합니다. =======는 두 버전을 나눕니다. >>>>>>> add-fahrenheit-toggle은 들어오는 브랜치 버전의 끝을 표시합니다. 마커 사이의 모든 것은 같은 몇 줄이지만 두 가지 다른 방식으로 작성되었습니다.
충돌은 Git이 당신의 판단이 필요하다는 의미입니다. 아무것도 깨지지 않았습니다. Git이 같은 줄에 대한 두 가지 변경을 발견했고 어느 것을 원하는지 추측할 방법이 없으므로, 일시 정지하고 결정하도록 요청합니다. 파일을 편집할 때까지 한 버전, 양쪽 또는 그것들을 결합하는 새로운 것을 유지하는 방식으로 읽도록 한 다음 마커 줄 자체를 삭제합니다:
showLoadingSpinner(true);
const tempF = celsiusToFahrenheit(tempC);파일이 올바르게 보이면, 다른 변경과 정확히 같게 스테이징하고 커밋합니다:
$ git add src/index.js
$ git commit메시지 없이 git commit을 실행하면 Git이 이미 준비한 병합을 설명하는 메시지로 편집기가 열립니다. 저장하고 닫으면 병합이 완료됩니다.
<<<<<<<, =======, 및 >>>>>>>를 찾고, 원하는 방식으로 읽을 때까지 편집한 다음 마커 줄을 삭제합니다. git add와 git commit으로 마무리합니다. 나의 첫 충돌은 응급 상황처럼 느껴졌습니다. Git이 나에게 꽤 일반적인 질문을 하고 있었습니다. 다시 함께 가져오기
병합은 브랜칭을 할 가치 있게 만드는 것입니다. 브랜치에 다루어진 당신만의 히스토리 줄에서 안전하게 실험하고, 준비가 되면 충돌이 있든 없든 해당 작업을 main으로 다시 접으십시오. GitHub에서, 같은 작업은 일반적으로 당신의 머신에서 로컬 git merge 대신 풀 요청을 통해 일어납니다. 풀 요청 흐름 챕터는 공유 프로젝트에서 변경을 제안하고, 검토하고, 병합하는 것을 다룹니다. 이미 커밋한 후 병합이 의도하지 않은 곳에 어딘가에 도착하면, 사항 취소는 안전하게 백아웃하는 방법을 다룹니다.

