Label 오른쪽의 Commit Message 부분에서 마우스 오른쪽 클릭 시 Create Branch로 Branch를 하나 만들 수 있다.
Branch의 이름을 적고 Checkout 여부를 설정 후 생성.
Local의 현재 상황은 Main과 Origin, Feat1 Branch 모두 Commit3를 가리키고 있다. 하지만 GitHub Repository에서는 Branch 게시가 안되어서 Feat1 Label 옆에는 Origin이 붙지 않는 것이다.
Feat1에 Checkout된 상태에서 [feat111.md] 파일을 생성 후 수정하고 저장, Staging, Commit까지 해보자.
feat1 Branch가 Commit4를 가리키고 있다.
Branch 게시를 하게 되면 GitHub Repository에 Branch가 생성되고 Commit4까지 Push된다. 결국에는 Local과 GitHub 둘 다 Feat1 Branch는 Commit4를 가리키고, Main Branch는 Commit3를 가리키는 상태이다.
GitHub의 Dropdown 창에서 현재까지 생성된 Branch들을 선택하여 볼 수 있다.
현재 HEAD Pointer가 가리키고 있는 Commit은 commit2이다.
Checkout이 Main Branch에 되어있다는 뜻.
그 Commit일 때의 버전(상태)을 보여주는 것.
따라서 상단에 [feat111.md] 파일이 만들어지기 전인 commit3의 상태임을 알 수 있다.
Main Branch에 Checkout된 상태로 Commit하면 자동으로 Branch가 갈라지게 된다.
결과적으로 'commit3 수정'은 commit3에서 Main 내용을 수정한 것이고, 'commit4'는 Main의 내용을 Base로 Feat1이라는 Branch에서 개발을 해나가는 것이다.
이번에는 Feat1 Branch Checkout을 하고 파일을 수정하여 '222 추가' Commit을 남겨보자.
이전 그림에서 Main과 Feat1 Branch의 색깔이 서로 바뀌었다. 최신 Commit 기준으로 왼쪽에 그래프가 붙으니 주의해서 보자.
Push하여 깔끔하게 정리, Main Branch Checkout
Create 'New' Branch, Checkout
'FF' Commit
"Main을 Base로 Merge = New를 Main에 넣는다."
Main Branch Checkout
FF Commit 마우스 우클릭 후 Merge into Current Branch = 현재 Checkout되어 있는 Branch에 New Branch를 Merge하겠다.
일단 체크 안하고 Merge
Main과 New Branch 둘 다 'FF'라는 Commit을 가리키고 있다.
New Branch의 모든 기능이 Main Branch에 Merge되었으니 New Branch는 삭제해도 된다.
Feat1 Branch에서 Feat2 Branch를 새로 만들어서 각각 한 번씩 Commit.
Feat1 Branch에서는 [file3.md]를 생성 후 Commit.
Feat2 Branch에서는 [file2.md]를 생성 후 Commit.
Feat1과 Feat2는 공통적으로 [file1.md]와 [file111.md]를 가지고 있지만 같은 부분을 수정해서 Commit하지 않았고, 서로 겹치지 않는 파일도 하나씩 가지고 있기에 Conflict 없이 Merge가 가능한 것.
Main Branch의 최신 Commit에서도 [file1.md]만 있고 Repository 자체의 최신 Commit까지도 [file1.md]는 수정되지 않았기 때문에 마찬가지로 Conflict 없이 Merge 가능.
Merge Feat1 Branch into Main Branch를 하게되면 Main Branch에는 Feat1의 기능이 전부 추가된 것이다.
결국 전부 합쳐졌다. 먼저 Push해준다.
이제 모든 기능들이 Main Branch에 Merge되었으니, 필요없는 Branch를 정리해주면 된다.
Feat2 Branch Label에는 Origin이 붙지 않은 이유는 Feat2 Branch를 생성한 뒤에 게시와 Push를 안하다가 그대로 Merge 후에 Push하니까 GitHub Repository에는 애초에 없던 Branch가 되는 것이다.
결국 Local에서만 잠깐 있다 사라진 Branch라는 것.
참고로 Delete Branch 말고 Delete Remote Branch는 GitHub와 연결된 Branch를 제거한다는 것이다. 물론 GitHub에서도 사라진다.
깔끔하게 정리된 모습
Main Branch에서 [file1.md] 수정 후 Commit
수정 내용은 Line9의 "conflict222"
Crash Branch에서 똑같은 파일인 [file1.md] 수정 후 Commit
수정 내용은 Line8의 "conflict111"
같은 라인의 코드를 수정하고 Merge를 시도하면 Conflict 발생
현재 변경 사항과 수신 변경 사항 둘 중 하나를 선택하여 Conflict를 해결하면 된다.
두 변경 사항 모두 수락하는 방법도 존재한다.
변경 사항 비교를 누른다면 좀 더 자세한 Conflict 정보가 제공된다.
두 변경 사항 모두 수락하면 코드는 이렇게 각자의 수정 사항이 반영된 합쳐진 코드로 결정된다.
참고로 Merge하는 것도 어떤 Git Log의 변화이기 때문에 하나의 Commit으로 남겨진다.
Push 후에 Delete Branch로 정리