(내용 출처 : https://tuwlab.com/ece/22202)



1. GIT이란?

 GIT은 소프트웨어를 중심으로 하는 프로젝트에서 빈번하게 발생할 수 있는 문제를 해결하기 위해 등장한 형상 관리 도구(Configuration Management Tool)입니다.

소프트웨어 공학의 프로젝트 진행 및 관리 방법에서 비중 있게 다뤄지는 영역 중 하나이기도 합니다.


 많이 쓰이는 형상 관리 도구로는 SVN과 GIT이 있습니다. SVN과 GIT은 모드 소스코드의 효율적인 관리를 위한 형상 관리 도구이지만, 비슷하면서도 많은 점이 다르다고 할 수 있습니다. SVN과 GIT의 가장 큰 차이점은 '분산'입니다. SVN은 중앙 집중식 소스코드 관리 방식인데 반해, GIT은 분산 소스코드 관리 방식입니다. 즉, GIT을 사용할 경우 중앙 저장소가 폭파되더라도 분산되어 있는 로컬 저장소를 이용해 중앙 저장소를 복원할 수 있습니다.


 SVN과 GIT은 상호 장단점에 대한 의견이 분분합니다. 하지만, 요즈음에는 SVN을 사용하던 대부분의 기업들이 GIT으로 점차 옮겨가는 추세이고, 형상 관리 도구에 처음 입문하는 사람들 중 대부분이 GIT으로 입문한다는 점으로 미루어 보았을 때, GIT을 사용하는 것을 추천합니다.




2. GIT을 사용하면 어떤 일들이 가능할까?

  1. 소스코드 주고받기가 필요 없고, 같은 파일을 여러 명이 동시에 작업하는 등 병렬 개발이 가능해지며, 버전 관리가 용이해져 생산성이 증가합니다. 

  2. 소스코드의 수정 내용이 Commit 단위로 관리되고, Fetch 형식으로 배포할 수 있기 때문에 프로그램의 변동 과정을 체계적으로 관리할 수 있고, 언제든지 지난 시점의 소스코드로 점프(Checkout)할 수 있습니다.

  3. 새로운 기능을 추가하는 Experimental Version을 사용하는 경우, Branch를 통해 충분히 실험을 한 뒤 본 프로그램에 합치는 방식(Merge)으로 개발을 진행할 수 있습니다.

  4. 분산버전관리이기 때문에, 인터넷이 연결되지 않은 곳에서도 개발을 진행할 수 있으며, 중앙 저장소가 폭파되어도 다시 원상복구할 수 있습니다.

  5. 팀 프로젝트가 아닌, 개인 프로젝트일지라도 GIT을 통해 버전 관리를 하면 체계적인 개발이 가능해지고, 프로그램이나 패치를 배포하는 과정도 간단해집니다.



3. GIT관련 주요 용어

  1. 저장소(Repository)
     소스코드가 저장되어 있는 여러 개의 브랜치(Branch)들이 모여 있는 디스크상의 물리적 공간을 의미합니다. GIT에서는 저장소가 로컬 저장소(Local Repository)와 원격 저장소(Remote Repository)로 나뉩니다. 

     작업을 시작할 때 원격 저장소에서 로컬 저장소로 소스코드를 복사해서 가져오고(Clone), 이후 소스코드를 변경한 다음 Commit을 합니다. 이 때, 커밋한 소스는 로컬 저장소에 저장되며, 푸시를 하기 전에는 원격 저장소에 반영되지 않습니다.

  2. 체크아웃(Checkout)
     특정 시점이나 Branch의 소스코드로 이동하는 것을 의미합니다. 체크아웃 대상은 Branch, Commit, Tag입니다. 체크아웃을 통해 과거 여러 시점의 소스코드로 이동할 수 있습니다.

  3. 스테이지(Stage)
     작업한 내용이 올라가는 임시 저장 영역입니다. 이 영역을 이용하여 작업한 내용 중 Commit에 반영할 파일만 선별하여 커밋을 수행할 수 있습니다.

  4. 커밋(Commit)
     작업한 내용을 로컬 저장소에 저장하는 과정입니다. 각각의 커밋은 의미 있는 변경 단위이고, 변경에 대한 설명을 커밋 로그로 남깁니다. 대개 하나의 커밋은 '회원 가입 기능 추가', '검색 버그 수정'과 같이 하나의 주제로 묶을 수 있는 변경 단위가 됩니다. 

  5. 태그(Tag)
     커밋의 임의 위치에 쉽게 찾아갈 수 있도록 붙여놓은 이정표를 태그라 합니다. 태그가 붙여진 커밋은 Commit ID 대신 태그명을 입력하여 쉽게 체크아웃 할 수 있습니다.

  6. 푸시(Push)
     로컬 저장소의 내용 중 원격 저장소에 반영되지 않은 커밋을 원격 저장소로 보내는 과정입니다.

  7. 풀(Pull)
     푸시와 반대로 원격 저장소에 있는 내용 중 로컬 저장소에 반영되지 않은 내용을 가져와서 로컬 저장소에 저장하는 과정을 의미합니다. 이를 통해 다른 팀원이 변경하고 푸시한 내용을 로컬 저장소로 가져올 수 있습니다.

     푸시 과정에서 충돌(Collision)이 일어나서 푸시가 거절된 경우, 풀을 통해 원격 저장소의 변경 내용을 반영한 뒤 다시 푸시를 시도해야 합니다.

  8. 브랜치(Branch)
     커밋을 단위로 구분된 소스코드 타임라인에 분기해서 새로운 커밋을 쌓을 수 있는 가지를 만드는 것, 혹은 그 가지를 브랜치라 합니다. 브랜치 중에 개발의 주축이 되는 브랜치를 마스터 브랜치(Master Branch)라 하며, 모든 브랜치는 마스터 브랜치에서 분기되어 최종적으로 다시 마스터 브랜치에 병합(Merge)되며 개발이 진행됩니다.

  9. 포크(Fork)
     저장소를 복제해서 새로운 독립된 저장소를 만드는 작업을 의미합니다. 공개된 오픈 소스 프로젝트를 자신이 프로젝트 매니저가 되어 입맛대로 수정하고 싶을 때 사용하는 기능이 바로 Fork입니다. 원격 저장소를 로컬 저장소로 복제한 뒤 새로운 원격 저장소에 푸시하는 과정을 한 번에 해결할 수 있도록 도입한 기능이 Fork입니다.

  10. 병합(Merge)
     브랜치와 반대되는 개념으로, 하나의 브랜치를 다른 브랜치와 합치는 과정을 의미합니다.

     두 개의 브랜치를 합쳐 하나의 브랜치로 만드는 3-Way Merge가 모든 병합 작업의 기본이 됩니다. 병합의 대상이 되는 두 브랜치는 주종관계가 성립하며, 따라서 'A브랜치와 B브랜치를 병합한다'라는 말은 모호한 표현이 됩니다. 즉, 'A 브랜치를 B 브랜치에 병합'하는 작업과 'B 브랜치를 A 브랜치에 병합'하는 작업은 서로 다른 작업입니다.

      병합도 커밋의 한 종류입니다. 일반적인 커밋은 조상 커밋이 하나인 커밋인데 반해, 병합의 조상 커밋이 둘 이상인 경우입니다. 3-Way Merge는 '서로 다른 두 커밋으로부터 하나의 새로운 커밋을 생성하는 작업'입니다.

     병합 과정에서 두 개의 브랜치에서 파일의 같은 부분을 서로 다르게 수정한 경우 충돌이 발생하며, 병합이 일시정지 됩니다. 이 경우, 충돌이 발생한 부분을 직접 수정하거나, Merge Tool 등을 활용하여 충동을 해결한 뒤 병합을 계속 진행하면 됩니다.


'Git' 카테고리의 다른 글

[GIT] macOS에서 Git 사용하기 (2)  (0) 2018.01.23
[GIT] macOS에서 Git 사용하기 (1)  (0) 2018.01.18

+ Recent posts