이롭게 현명하게

[Git] 깃 합치다 충돌났을 때 / 컨플릭트 (conflict) 본문

Git

[Git] 깃 합치다 충돌났을 때 / 컨플릭트 (conflict)

dev_y.h 2022. 12. 22. 18:17
728x90
반응형

※ 본 포스팅은 윈도우11 환경에서 작성되었습니다.

 


 

목차

컨플릭트(conflict) 과정

소스트리 컨플릭트

 

 


 


[ 컨플릭트(conflict) 과정 ]

Merge는 합병이라고 말한다. 합집합의 개념으로 이해하면 쉽다.

집합 A에 속하거나 집합 B에 속하는 모든 원소로 이루어진 집합을 합집합이라고 한다.

두 집합의 원소를 모두 쓰는 대신 중복되는 원소는 한 번만 사용한다.

 

1. Fast - forward

왼쪽 A  ⋃ 오른쪽 B = A ⋃ B

모자를 쓰지 않은 고양이와 모자를 쓴 고양이가 있다.

이 두 고양이의 합집합은 오른쪽(B)인 모자를 쓴 고양이가 된다.

A ⋃ B의 결과는 모자를 쓴 고양이인(B)의 모양과 똑같다. 즉 A(모자를 쓰지 않은 고양이) 커밋에 B 커밋의 합쳤을 때의 상태는 B커밋이 된다는 것이다.

master 브랜치는 페이지3을 가리키고 있고 devB는 페이지B를 가리키고있다.
페이지B의 부모가 페이지3이라서 이 둘을 합치면
master브랜치가 페이지3에서 페이지B로 이동한다.
master 브랜치와 devB 브랜치 모두 페이지 B를 가리키게 된다.
아무런 충돌날 상황 없이 merge가 된 상태이다

 

 

2. Merge Commit

왼쪽 A  ⋃ 오른쪽 B = A ⋃ B

A (모자를 쓰지 않고 꽃을 든 고양이)와 B(모자를 쓰고 꽃을 들고 있지 않은 고양이)가 있다. 

A ⋃ B의 결과는 모자를 쓰고 꽃을 들고 있는 새로운 고양이가 나타난다.

이 새로운 고양이는 Merge commit이다.

Fast - forward처럼 같은 결과가 나오는 것이 아닌 새로운 결과가 나타나는 것을 볼 수 있다.

페이지4를 기준으로 master 브랜치와 devA브랜치의 상황이 나뉘게 되었다.
master 브랜치에 devA를 합친다.
새로운 커밋이 만들어 지면서 페이지5와 페이지B가 합쳐진 버전의 새로운 버전을 만들게 된다.
master 브랜치는 새것1을 가리키게 된다.

 

 

 

3. conflict (충돌)

왼쪽 A  ⋃ 오른쪽 B = A ⋃ B

A ( 꽃을 들고 캡 모자를 쓴 고양이)와 B(꽃을 들고 있지 않고 중절모를 쓴 고양이)가 있다.

A ⋃ B의 결과는 꽃을 든 고양이이지만 어떤 모자를 써야 하는지 모르는 상태이다.

이것이 동시에 두 코드를 수정하여 충돌이 난상태이다.

 

음... 근데 충돌이 어떻게 나는가여..?

 

 

 

똑같은 상황에서 master와 devA을 합쳤을 때
예를 들어 페이지 B 버전이 '이 세계의 평화를 지키기 위해'라고 작성하였고 페이지 5는 '이 세계의 파괴를 막기 위해'라고 작성하였다.

페이지 B와 페이지 5가 서로 동일한 곳을 수정하였다는 컨플리트(conflict)가 나올 것이다.

 

 

 

 

 

 

 

 

 

 

¿ 아니 그래서 어떻게 해결하냐구여 ?

 

 

 

나는 이렇게 뜨면 갱장히 무섭다구여

 

 

 

 

어떻게 해결하시는지 궁금하시다면!

 

 

 

 

대답해 드리는게 인지상정!

 

 

 

 

Merge 할 때 두 버전이 같은 곳을 수정하였다면 이를 수동으로 고쳐주어야 한다.

 

 

index.html 파일에 compare 브랜치에서는  '이 세계의 평화를 지키기 위해'라고 작성하였고 base 브랜치는 '이 세계의 파괴를 막기 위해'라고 작성하였다.

 

 

 

<< 깃이 이 두 개의 버전을 Merge 하였을 때의 결과물을 보여준다.

두 결과물 모두를 보여준다.

위의 브랜치는 현재 있는 브랜치의 변경사항이고 밑은 내가 Merge 하고 싶은 대상의 브랜치의 변경사항이다.

 

 

충돌하는 원인이 되는 부분을 수동적으로 판단하여 수정한다.

 

 

 

이렇게 해결하면 새로운 Merge commit이 생긴다.

 

 

이제 잘 알았나옹!

 

 


[ 소스트리 컨플릭트 ]

<준비되어야 할 것>

 

[Git] 소스트리 설치하기

목차 설치 전 작업 소스트리 설치 과정 소스트리 시작하기 [설치 전 작업] [Git] Git 설치하기 / Git 설치 / Git 2.38.1 설치 [깃 설치하기] ※ 본 포스팅은 윈도우11의 환경에서 진행되었습니다. 디폴트(

devyihyun.tistory.com

 

[Git] 깃 시작하기 / 깃 로컬 저장소 만들기

[Git] 깃 초기화 / 깃 로컬 저장소 / Git 로컬 저장소 만들기 / Git 폴더 생성 / 깃 연동하기 / 리포지토리 만들기 [깃헙에 코드를 올리는 과정] 1. 내 컴퓨터에 프로젝트 폴더에 ‘ 여기 깃을 쓸 거다! '

devyihyun.tistory.com

 

1. 소스트리에 접속하여 로컬 저장소인 studygit을 열어준다.

feat/devB 브랜치에 위치해 준다.

 

 

2. VScode에서 studygit에 있는 index.html을 수정한다.

이때 VScode는 깃과 연동이 되어있어 왼쪽 하단에 보면 현재 브랜치를 확인할 수 있다.

 

index.html을 수정해 줍니다.

수정 전

 

수정 후

 

<VScode에서 커밋하는 방법>

3. 왼쪽 메뉴에 브랜치 모양의 아이콘을 클릭한다.

소스트리처럼 깃을 조작할 수 있는 패널이다.

 

4. index.html을 수정하였다는 것을 알 수 있다.

index.html을 클릭하면 어디가 수정되었는지 알 수 있다.

 

5. index.html 옆에 있는 + 버튼을 클릭하면 Stage Area에 업로드된다.

+버튼을 누른 후

 

6. 커밋 메시지를 입력하고 커밋 버튼을 클릭한다.

 

7. 왼쪽 아래에 브랜치 옆에 새로고침 모양이 보인다. 이 새로고침 버튼은 pull/push 상황에 클릭하면 된다.

새로고침 버튼 클릭 후 OK 버튼 클릭하면 push가 완료되었다.

 

8. 소스트리에서 패치를 클릭하여 새로고침 해준다.

패치 클릭 전

'이 세계의 파괴를 막기 위해' 커밋을 볼 수 있다.

패치 클릭 후

 

9. '이 세계의 파괴를 막기 위해'를 master 브랜치에 merge 하기 위해 브랜치를 master로 옮겨준다.

 

10. master 브랜치에서 pull을 한다.

pull 클릭

Add sourcetree text를 기점으로 master브랜치와 devB의 상태가 나눠져 있는 것을 확인할 수 있다.

 

11. merge를 원하는 대상인 feat/devB를 클릭한 후 병합을 클릭한다.

확인 버튼 클릭

... 충돌이 납니다...!

뭐지 왜 충돌나지

충돌이 낫다고 하니 고쳐줍니다.

컨플리트가 난 파일은 커밋하지 않은 변경사항에 stage 아래에 있게 된다.

 

12. VScode에서 깃 패널을 클릭하면 index.html 파일이 나타난다.

충돌 난 부분을 수동적으로 수정해 줍니다.

수정 전
수정 후

 

 

13. 커밋하지 않은 변경사항에서 index.html을 스테이지에 올린 후 커밋 버튼을 클릭한다.

 

14. 커밋 버튼을 누른 후 커밋 메시지 입력창에 자동으로 입력이 되어있다.

origin/master에 바뀐 내용 즉시 푸시 체크 후 커밋 버튼 클릭

 

15. master 브랜치에서 Merge branch 'feat/devB'를 확인할 수 있다.

충돌 후 수정한 index.html을 볼 수 있다.

 

 

 

[Git] 저장소 복제하기 / 포크(fork)

목차 포크(fork) 과정 브랜치 vs 포크 포크 깃 명령어 및 소스트리 [ 포크(fork) 과정] 개발자 A와 개발자 B가 만든 mygit 오픈소스가 많은 관심을 받게 되었습니다. 이때 개발자 C가 mygit 프로젝트에 참

devyihyun.tistory.com

 


잘못된 정보는 댓글에 남겨주시면 감사하겠습니다!😊

댓글과 좋아요는 큰 힘이 됩니다!

728x90
반응형
Comments