GitHub는 Git들이 모여있는 곳(Hub)를 의미한다. 이는 프로그래머들이 사용하는 개발자 코드 공유 사이트이자 소셜 코딩 공간이다.
GitHub가 무엇인지 알아보려면, 먼저 Git을 알아야 할 필요가 있다.
Git은 버전 컨트롤 시스템(Version Control System)의 일종으로 '레포지토리(Repository)'라고 불리는 디렉터리 하위 파일들의 삭제와 생성, 수정을 추적하여 버전을 관리하는 소프트웨어이다.
이 Git 프로그램을 활용하면 프로젝트 기록을 스스로 관리하며 프로젝트 생성 및 복구, 삭제, 병합 등을 할 수 있는데, 이때 이 Git 시스템을 통해 관리하는 프로젝트들을 올려둘 수 있는 호스팅 서비스 중 하나이자, 가장 대표적인 서비스가 바로 GitHub라고 이해하면 된다.
예를 들어 ‘GitHub 분석리포트’라는 이름의 파일을 관리하는 것을 생각해보자. 이 파일을 그대로 수정해서 리포트를 작성할 수도 있지만, 모종의 이유로 다른 버전이 필요할 수도 있다. 그러면 개발자는 이 파일을 필요에 따라 ‘GitHub 분석리포트_버전_A’, ‘GitHub 분석리포트_버전_B’ 등 두 개로 구분해서 관리하게 된다. 더 나아가 버전_A-1, A-2 등으로 더 다양하고 세분화해서 나눌 수도 있다. Git은 이런 일련의 과정을 조금 더 체계적으로 관리할 수 있도록 도와준다.
위의 사례를 Git에서 쓰는 용어로 간단히 정리하면, 'GitHub 분석리포트'를 A와 B, 두 개 버전으로 나눈 것을 ‘Branch(브랜치)를 나눈다’라고 한다. 또한 이렇게 나눈 각각의 버전을 시간순으로 구분한 것을 ‘Commit(커밋)을 작성한다'라고 얘기한다.
실제 프로젝트에서는 ‘Main 브랜치’를 정해 두고, 새로운 기능을 구현해야 할 때 먼저 해당 브랜치에서 새로운 브랜치를 분기한다. 이후 분기한 브랜치에 커밋들을 작성하는 방식으로 버전을 관리한다.
Git 저장소(Repository)는 Git이 버전 관리를 하고 있는 폴더를 의미한다. Git Repository에는 파일이 변경이력에 따라 구분되어 저장되며, 위치에 따라 Github 서버와 같은 원격 저장소(Remote Repository)와 개인 pc의 로컬 저장소(Local Repository)로 구분된다.
내 PC에서 수정된 파일이 곧바로 저장되는 Workspace와 Git 파일이 저장되는 Local Repository를 혼동할 수 있으니, 서로 구분할 수 있도록 하자.
이에, 사용자는 1) Workspace에서 작성된 파일을 원격 저장소에 올리고, 2) 반대로 다른 사용자에 의해 수정된 파일을 원격 저장소에서 Workspace로 받아올 수 있다.
나뭇가지 혹은 분점을 말하는 Branch는 말 그대로, 기준이 되는 큰 줄기가 있고 그 줄기에서 옆으로 나오는 가지와 같은 구조이다.
기준이 되는 큰 줄기를 Master Branch라고 하고, 각각의 개발자는 Master Branch에서 Checkout하고 자신만의 Branch를 만든다. 각각의 개발자로부터 나온 줄기들을 Feature Branch라고 한다. Feature branch에서 개발자들은 각자 개발을 하다가 개발이 끝나고 Commit을 하면, 자신의 Feature Branch를 Master Branch로 합치게 된다. 이렇게 Feature Branch에서 Master Branch로 합치는 과정을 Merge라고 한다.
Git은 Commit을 할 때마다 파일이 존재하는 순간을 중요하게 생각한다. 만약 파일이 수정되지 않았다면, Git은 빠른 성능을 위해서 파일을 새로 저장하지 않고 이전 상태의 파일에 대한 링크만 저장한다. 이런 경우에는 수정 사항을 저장하지 않고, 파일의 스냅샷을 시간순으로 저장한다.
위와 같이 저장될 때 스냅샷으로 저장되기 때문에 개발자가 중앙 서버에서 새로운 프로젝트를 받으면(Git Checkout) 해당하는 Repository의 특정 시점의 스냅샷을 받게 된다. 일반적으로는 가장 최신 버전을 받는다.
이렇게 개발자들이 각각의 스냅샷을 Checkout 받고 개발을 하면, 최종적으로 각자의 변경사항을 반영한 스냅샷을 만드는 과정이 필요하게 된다. 그러기 위해서 특정한 기준이 필요한데, 그럴 때 필요한 것이 Branch이다.
GitHub Repository 생성에 대해 작성 예정