728x90
1.브랜치 합치기
새로운 기능을 추가했고 이제 그 기능을 "프로젝트에 반영해도 된다" 라고 결정이 되면
이제 기능추가 브랜치에서 작업한 내용을 master 브랜치로 합치는 작업을 한다.
순서는 다음과 같다.
-
master 브랜치를 선택한다. (이걸 CheckOut이라고 한다)
-
새로운 기능을 합쳐야 하므로 새로운 기능추가 브랜치를 우클릭한다.
-
Merge "브랜치 이름" into current branch 선택
(현재 선택되어 있는 master 브랜치로 "기능추가 브랜치"를 병합하겠다 라는 뜻)
브랜치 합치기 전>>
브랜치 합친 후 >>
브랜치 합치기 전 그래프에서는 브랜치를 만들고 커밋할 때 부터 각자 제 갈길 가던 놈들이 브랜치를 합치고 난 후에는 하나의 길로 합쳐지게 되었다.
"새로운 기능추가1" 브랜치를 master로 Merge했다 라는 뜻이다.
(제일 상단 Description 내역을 보면 git이 자동으로 두개의 브랜치를 합쳐서 버전을 만들어 준다.)
master브랜치 옆에 ↑2라는 것은 현재 로컬에 커밋되어있는 내역이 두개고 아직 원격저장소에는 push를 하지 않은 상태라는 것이다.
즉, push를 할 내역이 2건 있다라는 뜻이다.
소스트리에서 푸쉬하거나 이클립스에서 푸쉬를 해도 상관없다. (편한걸로 작업)
1)소스트리 상단 push 버튼 클릭
2)이클립스 프로젝트 우클릭- Team - Synchronizw Workspace에서 상단 버튼 클릭
이제 화살표가 없어진 것을 확인할 수 있다.
2.브랜치 충돌
보통 프로젝트는 다른 사람과 협업을 해서 진행해야 하는 일이 많기 때문에
충돌이 안나면 제일 좋지만 안나는 일은 거의 보지 못한 것 같다.
동일한 파일안에서 같은 소스를 건드려야 할 경우도 있기 때문에 누가 먼저 커밋을 하고 푸쉬를 해야 하냐에 따라 충돌이 발생하며.. 늦게 반영을 한 사람이 브랜치 충돌을 해결해야할 책임이 있다.
1번 브랜치 합치기 항목에서 똑같은 test.html파일을 건드려야 했는데 왜 충돌이 나지 않았을까?
>> 같은 라인의 코드를 건드린게 아니라 master 브랜치는 body밑에 h1 태그를 추가한 것이고 기능추가 브랜치는 head태그와 title 태그를 만들었기 때문이다.
(전혀 다른 라인의 줄을 각자 수정하면 git에서 자동으로 병합을 해준다)
그럼 이제 충돌 상황을 만들어보자.
충돌 상황을 만들기 전에 새로운_기능추가1이라는 브랜치는 성공적으로 임무완수를 했기 때문에 삭제를 하도록 한다. (여기서 작업을 해도 상관없지만 브랜치 삭제도 정리할겸... 삭제하고 다시만드는걸로)
브랜치 삭제
1)소스트리에서 삭제방법>> 삭제할 브랜치 우클릭 - Delete "브랜치 이름" 선택
2)이클립에서 삭제방법>>
프로젝트 우클릭 - Team - Advanced - Delete Branch - 삭제할 Branch 선택 후 OK
삭제를 완료하고 나면 "충돌테스트"라는 브랜치를 새로 만든다.
이제 충돌 상황을 만든다(같은 코드를 수정하면 된다)
브랜치를 "충돌테스트"로 잡아놓고 test.html에 form 태그를 하나 집어 넣고 커밋 & 푸쉬를 한다.
공통의 버전에서 충돌테스트 브랜치 버전으로 한칸 올라간다.
이제 master 브랜치에서 같은 라인의 줄을 수정한다.(충돌 발생)
master 브랜치에서는 Master name이라고 만들었고
충돌테스트 브랜치에서는 User name이라고 만들었다.
충돌테스트 브랜치 라고 하는 곳에서 기능 테스트가 끝나고 이제 master 브랜치와 소스를 합쳐야 하는 상황이 왔다고 가정하자.
master브랜치를 주 브랜치로 선택을 하고 병합하려고 하는 충돌브랜치를 우클릭해서 Merge "충돌브랜치" into current branch를 선택한다.
어떻게 될까?
다음과 같은 에러창이 뜬다.
두개의 다른 브랜치가 하나의 파일에서 같은 라인의 내용을 수정했기 때문에 Git은 누가 우선순위로 적용해야 될 지 모르므로, 충돌 에러창을 띄워주고 사용자가 처리하도록 던져준다.
충돌(Conflicts)이 발생하면 아래와 같은 아이콘으로 구별 할 수 있다.
1)폴더 아이콘 :
2)이클립스 아이콘 :
3)소스트리 아이콘 :
충돌이 난 test.html을 열어 확인해보자.
중간에 있는 ======= 기준으로
<<<<<<< HEAD 안에 내용이 master브랜치
>>>>>>>충돌테스트 안에 내용은 충돌테스트 브랜치 안에 있던 내용이다.
서로 다른 내용을 갖고 있기 때문에 어떻게 처리할지 사용자가 변경해야 한다. 두개 다 필요하면 다음과 같이 변경한다.
(<<<<<<<HEAD , ======= , >>>>>>>충돌테스트 내용제거)
이렇게 저장을 하고 소스트리로 되돌아가서 Unstaged files에 있는 파일 우클릭 - Resolve Confilcts - Mark Resolved 선택한다.
(충돌 해결했다라는 Git에게 알려주기 위함)
그 후에 Unstaged fiels에 있던 test.html 파일을 Staged files 영역으로 이동한다. 그 후에 상단에 Commit 버튼을 누르면 다음과 같이 뜬다.
-
두개의 브랜치를 병합했지만 충돌이 나고 그것을 해결을 했다라는 메세지를 Git이 자동으로 커밋 로그를 입력해준다.
-
그리고 커밋 & 푸쉬 진행
충돌된 브랜치가 제대로 합쳐진 것을 확인할 수 있다.
개인적인 생각은 충돌나는 상황이 실제 프로젝트에서 많고 이걸 해결하는데 상당부분 시간을 소요하는 것 같다.
지금은 당장 한줄만 수정했지만 실제 프로젝트에서는 몇 천줄, 몇 만줄이 충돌 날 수도 있다.
실제로 만들어놓고 연습해보는게 좋을 것 같다..
728x90
'Programming > Git' 카테고리의 다른 글
[Git] git revert 에러 (merge but no -m option was given) (0) | 2020.07.17 |
---|---|
[Git]시점 되돌리기(reset, revert) (0) | 2020.07.10 |
[Git] 소스트리 / 이클립스에서 브랜치 만들기(branch) (0) | 2019.04.23 |
[Git] Git 프로젝트에서 이클립스로 import 하기 (0) | 2019.04.22 |
[Git] 소스트리에서 원격저장소로 커밋하기 / Commit (3) | 2019.04.12 |
댓글