충돌은 일반적으로 두 개발자가 한 파일에서 같은 줄을 변경하거나 한 개발자가 파일을 수정하는 동안 다른 개발자가 파일을 삭제할 때 발생합니다.
예시
index.html을 branch1과 branch2로 브랜치를 나누어서 작업을 한다고 가정할때 두 브랜치가 같은 라인 코드를 수정 후 커밋을 합니다. 그리고 작업이 다 끝나면 master에서 이 브랜치들을 merge 하겠죠. 그러면 이때 conflict가 발생합니다.
master입장에선 '둘다 같은 라인 코드 수정했네? 난 몰라~ 확인하고 다시수정해줘" 라고 생각해요
master는 두 브랜치가 동일한 라인에 코드를 수정했으니 어떤 코드를 결정해줘야 할지 모르기 때문이에요. 그래서 수동으로 우리가 결정해줘야 합니다. 이 과정을 conflict 충돌 났다 라고 합니다
- 충돌이 일어난 파일로 들어가서 <<<<<< ,>>>>>>>> 해당 기호들을 확인 할 수 있다.
- <<<<<<<<HEAD 구문 ======= 이 기호 안에 있는 구문의 내용은 현재 선택되어 있는 브랜치의 내용이 HEAD입니다.
- 최종적으로 여기서 필요한 내용을 사용자가 직접 선택을 해서 구문을 남기고 정리를 해야한다.
예시 2
현재 브랜치에서 다른 브랜치를 머지할 때 아무 문제없이 잘 끝날 때도 있지만 어떤 경우에는 confilct(충돌)을 만나기도 합니다. conflict가 정확히 뭘까요? conflict는 두 브랜치의 동일한 파일에 상반된 내용이 있다는 뜻입니다. 이럴 때는 Git이 두 가지 중에서 어떤 내용을 머지의 결과로 해야할지 모르기 때문에 사용자가 결정해줘야 하는데요. 그래서 Git이 conflict를 발생시키는 겁니다.
conflict가 발생했을 때 여러분이 취할 수 있는 방법은 크게 2가지입니다.
1. 일단은 머지 작업을 취소하고 원래 상태로 돌아온다.
2. conflict(충돌)을 해결하고 머지를 완료한다.(위 예시 처럼 해결 하면 된다)
master 브랜치 - A type commit
premium 브랜치 - B type commit
이렇게 서로 다른 커밋을 했습니다.
지금 HEAD가 master를 가리키고 있으니까 저는 master 브랜치에 있는 건데요. 이 상태에서
git merge premium
커맨드를 실행해서 master 브랜치에 premium 브랜치를 머지하겠습니다.
실행했더니 conflict가 발생했습니다. sample이라는 파일에서 conflict가 났다는 걸 알 수 있네요.
이 상황에서 취할 수 있는 대응 방법 1번! 일단 머지를 취소하는 방법입니다. 머지 취소는 간단합니다.
git merge --abort
아무 일도 없었다는 듯이 모든 것이 머지하기 이전의 원상태로 돌아옵니다.
Rebase
- Git에서 한 브랜치에서 다른 브랜치로 합치는 방법은 Merge와 Rebase다.
- Merge와 Rebase의 실행결과는 같지만 커밋 히스토리가 달라진다.
- Merge는 쉽고 안전하지만 커밋히스토리가 지저분할 수 있다 반면 Rebase는 잘 모르고 사용할 경우 위험할 수있어 까다롭지만 커밋히스토리를 깔끔하게 관리할 수 있다.
- Rebase는 base를 새롭게 설정한다는 의미로 이해하면 좋다.
- $ git rebase [newbase]
git push 가 되지 않을때
나의 repository가 이미 업스트림에 맞게 최신화되었기 때문에 브랜치가 한단계 더 앞에 있어 현재 내 로컬브랜치와 출발점이 맞지않아 push 가 되지 않는 상황이 생긴다.
다행이 친절하게 git config pull.rebase true 이런 명령문으로 에러를 해결해 볼수도 있겠지만, config 설정을 해두면 원치 않을 경우에도위의 설정이 적용되어 나중에 불편한 상황이 올 수도 있다.
그렇다면 지금 할 수 있는 선택은 내 로컬에서 새로운 브랜치를 만들고, 그곳에서 rebase를 핸준다음, 원래 머지하려했던 나의 로컬 브랜치로 merge하는 법이다.
이렇게 진행하면 새로운 브랜치에 최신화된 코드를 내 로컬로 가져와서 나의 다른 로컬 브랜치랑 합치는 작업을 해볼 수 있다. 다른 브랜치를 새로 만든 이유는 혹시 모를 손실을 막기 위해 따로 브랜치를 파서 진행한다.
'블록체인 sw개발자' 카테고리의 다른 글
[MySQL] DB, 서버통신 (0) | 2023.09.20 |
---|---|
URI, URL 와 RESTful API (0) | 2023.09.11 |
Git Branch, Restore (0) | 2023.08.21 |
[JS] prompt 함수 confirm 함수 (0) | 2023.08.18 |
Git 기초 (0) | 2023.08.18 |