커밋 객체의 구조
커밋 객체들의 구조그리고 두번째 이후의 커밋들을 보면 paraent 라는 속성으로, 각 이전 커밋 객체들도 바라보며, 이전 커밋들에 대한 정보도 같이 저장하고 있습니다.
브랜치(branch) : 브랜치는 커밋 사이를 이동할 수 있는 일종의 "포인터"로, 브랜치를 사용하는 이유는 독립적으로 어떤 작업을 진행하기 위서 입니다. 필요에 의해 만들어지는 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행할 수 있습니다. 이렇게 만들어진 여러개의 브랜치는 병합(merge)을 통해 하나의 브랜치로 다시 합칠수 있습니다.
main(master) : 프로젝트에서 가장 처음 만들어지는 브랜치
브랜치의 구조그림을 보시면, 커밋 객체는 3개가 있고, 98ca9가 가장 첫번째 커밋이며, f30ab가 가장 마지막 커밋 입니다. 그리고 브랜치는 v1.0,master 이렇게 두개의 브랜치가 있으며, 둘 다 f30ab라는 커밋 객체를 바라보고 있고, 현재 사용자는 master라는 브랜치를 바라보고 있는 상황입니다.
브랜치 만들기!
브랜치 이동하기!
새로운 브랜치에서 커밋하기
병합 : 여러개의 브랜치를 하나의 브랜치로 합치는 작업을 병합이라고 합니다. 병합에는 fast-forward와 3way merge 이렇게 2가지 방식이 존재합니다.
fast-forward
1. 이렇게 3개의 브랜치가 있는 상황에서,
master 브랜치와 hotfix 브랜치를 병합 한다고 했을 때에는
master 브랜치와 hotfix 브랜치가 바라보고 있는 커밋 객체가 같은 라인 상에 있는 상황 이기 때문에, fast forward 방식으로 병합을 진행하게 됩니다.fast forward 병합을 진행하고 난 이후에는 이렇게 master 브랜치가 바라보는 객체만 바뀌게 됩니다.
이런식으로 브랜치가 바라보는 포인터만 이동을 하는 방식을 fast-forward 방식 이라고 합니다.
2. 명령어 : git merge 브랜치이름
3. 사용 : 먼저 합칠 브랜치로 이동을 한 뒤, 명령어와 함께 합쳐질 브랜치 이름을 입력합니다.
4. 결과 : 결과를 보면 어떤 방식으로 병합을 진행했는지와 병합의 결과가 출력 됩니다.
3 way merge
1.
이렇게 2개의 브랜치가 있는 상황에서,
master 브랜치와와 iss53 브랜치를 병합 한다고 했을 때에는
master 브랜치와 iss53 브랜치가 바라보고 있는 커밋 객체가 다른 라인 상에 있는 상황 이기 때문에, 3 way merge 방식으로 병합을 진행하게 됩니다.
3 way merge 방식의 병합을 진행하고 난 이후에는 fast forward와는 다르게 새로운 커밋 객체가 새로 생기게 되고, 브랜치가 그 커밋 객체를 바라보게 됩니다.
3 way merge는 C4와 C5의 커밋 객체와 이 둘이 공통 조상인 C2 이렇게 3개의 커밋 객체를 비교 해서 새로운 커밋 객체를 생성한 다음 브랜치를 새로 생성한 커밋 객체를 바라보게 하는 방식입니다.
2. 명령어 : git merge 브랜치이름
3. 사용 : fast forward와 같습니다.
4. 결과 : 결과를 보면 fast forward 방식과 다르게 recursive strategy라는 출력이 나오는 것을 볼 수 있습니다.
5. 충돌 : 또 fast forward 방식과 다르게 3 way merge는 공통 부모 커밋 객체에서 각 커밋 객체가 수정한 부분이 겹칠 수도 있는데 이러한 상황을 충돌이라고 합니다.
만약 병합을 시도했는데 이런식으로
CONFLICT (content): Merge conlflict in 파일이름 Automatic merge failed; fix conflicts and then commit the result.
라는 문구가 뜬다면 파일이름에서 충돌이 발생하여 병합에 실패를 했다는 의미이다. 이렇게 충돌이 발생하면 커밋이 만들어 지지 않고, 해당 파일에 가면 이런식으로 어느 부분에서 충돌이 일어났는지 표시가 되어있다.
이렇게 표시된 충돌을 해결하고 git add 와 git commit 명령어를 사용하면 된다.
참고
1. 사내 세미나
2. 브랜치란?