상세 컨텐츠

본문 제목

깃(Git)이란? 그 역사와 철학, 기능, 무엇이 특별한지

프로그래밍

by 릿카。 2024. 4. 4. 21:41

본문

코딩, 프로그래밍을 시작한다고 하면 깃허브를 사용하는건 피할 수 없는 과정인 것 같습니다.

https://stackoverflow.blog/2023/01/09/beyond-git-the-other-version-control-systems-developers-use/

현대의 프로그래머들의 93.87%가 깃을 이용한다고 합니다. 우리가 깃허브, 깃을 이용하게 된것은 어찌보면 당연하다고도 할 수 있습니다. 대부분의 딥러닝 모델들도 깃허브를 통해 배포되고, 어쩌구.. 
 
가장먼저 깃(Git)과 깃허브(Github)를 구분하는게 필요합니다.
 
Git은 아래에 자세히 설명하겠지만, 컴퓨터파일의 버전을 관리하도록 도와주는 여러 상용 시스템중에 하나입니다. 깃허브(Github)는 그런 깃 시스템을 저장시켜주는, 구글드라이브나 아이클라우드 드롭박스같은 (하지만 깃 전용인)온라인 사이트이구요. 그러니까 깃허브가 뭔지는 깃(Git)이 뭔지를 이해하면 쉽게 알 수 있습니다.
 
깃(Git)은 사실 말은 컴퓨터파일 버전관리라 했지만, 그냥 '비선형적인 작업흐름을 가지고 프로젝트 진행을 가능하게 해주는 추상적인 체계'로 이해하면 될것같습니다. 예컨대 작곡을 하던 소설을 쓰던 연구를 하던간에 써먹을 수 있는 셈입니다.
 

1. 깃(Git)의 정의:
 

깃은 시간이 지남에 따라 컴퓨터 파일의 변화를 추적하도록 설계된, 분산 버전 제어 시스템(DVCS, Distributed Version Control System)입니다. 이건 동일한 코드 기반(예컨데 C언어면 C언어, 파이썬이면 파이썬)에서 작업하는 여러 프로그래머 간의 작업을 조정하는 데 특히 유용합니다.

1.1 Git 정의의 핵심 사항

(1) 분산(distributed): 중앙 집중식 시스템과 달리, 모든 개발자는 프로젝트 코드와 이력의 완전한 로컬 복사본을 가지고 있습니다. 그러니까, Bob은 스타벅스에서, Alice는 방구석 침대에서, Denis는 휴양지 해변에서 각자의 컴퓨터나 노트북에 저장된 복사본을 가지고 (심지어는 오프라인으로도) 작업할 수 있습니다.
(2) 버전 제어(version control): 깃은 파일의 변경 사항을 기록하고 관리할 수 있는 방법을 제공합니다. 그를 통해 이전 버전으로 되돌리거나, 새로운 기능을 실험하고, 코드의 진화를 분석할 수 있습니다.
(3) 조정: Git은 협업을 용이하게 하여 원활한 코드공유를 보장하고, 변경사항을 통합하며 팀원 간의 conflicts를 해결합니다.
 
1.2 Git을 사용하는 여러 기업들
 
(1) 구글: 핵심 안드로이드 운영체제 개발을 포함하여, 여러 내부 구글 프로젝트가 깃에 의존하고 있습니다.
(2) 마이크로소프트: 마이크로소프트는 깃과 오픈 소스를 수용하는 방향으로 상당한 변화를 가져왔고, 윈도우와 비주얼 스튜디오 코드(VSCode)와 같은 주요 프로젝트에 적극적으로 사용했습니다.
(3) Facebook (Meta): 메타는 소셜 플랫폼을 강화하는 대규모 코드 기반을 위해 Git을 광범위하게 사용합니다.
(4) Amazon: Git은 Amazon의 방대한 서비스와 인프라를 관리하는 데 중요한 역할을 합니다.
(5) Apple: Apple은 내부 tool들을 널리 공개하지는 않고있지만, Git를 기반으로 한 구성 요소가 있는 맞춤형 하이브리드 버전 제어 시스템을 사용하는 것으로 알려져 있습니다.
 
1.3 깃(Git)의 철학
 
(1) 단순 차이의 나열이 아닌, 스냅샷(체크포인트) :  Git는 단순히 변화를 일련의 차이로 추적하는 것이 아니라 프로젝트의 이력을 축소된 스냅샷(체크포인트)의 시퀀스로 봅니다. 이를 통해 상태 간에 자유롭게 왕복할 수 있고, 새로운 아이디어를 실험할 때의 위험도 적습니다. 게임에서의 체크포인트와 동일한 개념입니다.

https://ljvmiranda921.github.io/notebook/2018/10/25/git-workflow/

 
(2) 속도와 효율성 집착: 깃은 거의 모든 작업을 놀라운 수준으로 최적화했습니다. 데이터 구조를 지능적으로 사용하여 코드비교, 브랜치(branch) 생성 및 변경사항 병합(merge)과 같은 작업을 빠르게 처리할 수 있습니다.

(3) 신뢰성, 무결성(Integrity): Git은 강력한 컨텐츠 주소지정 시스템(Hash 함수)을 사용하여 각 파일과 변경 사항에 고유한 체크섬을 할당합니다. 이는 데이터 손상이나 조작으로부터 프로젝트 기록을 보호하는 방패 역할을 합니다.
 
(4) 분산(distributed), 탈집중화: Git은 중앙 집중식 시스템과 달리 각 개발자에게 프로젝트 저장소의 완전한 로컬 복사본을 제공합니다. 이러한 분산화는 오프라인 작업과 높은 수준의 협업을 지원하여 개발자가 쉽게 병렬 작업을 수행할 수 있도록 합니다.
 
2. 깃(Git)의 매우 간략한 역사
 
깃의 이야기는 2005년 리눅스 커널의 개발 속에서 시작됩니다. 리눅스의 배후에 있는 장본인이기도 한 리누스 토르발스는 대규모 분산 프로젝트의 필요를 충족시킬 수 있는 버전 제어 시스템을 찾았습니다. 그 당시 기존의 상용 솔루션은 너무 비용이 많이 들거나 그가 원하는 성능과 유연성이 부족했습니다. 토르발스의 좌절은 영감의 불씨를 지폈고, 그는 자신만의 솔루션을 개발하게 되었습니다. 깃이 탄생했습니다.
 
더 자세한 이야기는 구글검색을 통해 찾아볼 수 있습니다.
 
3. 깃(Git)은 무엇이 특별한가?
 
Git을 매우 매력적으로 만드는 몇 가지 기능에 대해 자세히 살펴보겠습니다:

(1) 단순하고 쉬운 분기점(Branch) : 깃(Git)의 분기 모델은 유난히 가볍고 유동적입니다. 분기를 만들고 전환(switch)하는 것은 쉽고 빠르며, 개발자들은 이러한 민첩성을 통해 다양한 개발라인을 실험하고 분리할 수 있습니다.

(2) 스테이징 영역: 일종의 중간지대, 회색지대와 비슷합니다. 이 중간 작업공간을 사용하면, 커밋에 포함된 변경 사항을 세밀하게 제어할 수 있습니다. 이를 통해, 코드의 진화에 대한 응집력있는 이야기를 들려주는 신중하게 선별된 커밋을 만들 수 있습니다.

https://medium.com/@lucasmaurer/git-gud-the-working-tree-staging-area-and-local-repo-a1f0f4822018


(3) '비선형' 히스토리: 깃은 분기와 병합이 프로젝트의 여정을 나타내는 복잡한 웹을 형성하는 비선형 작업 흐름을 용이하게 합니다. 이러한 유연성은 여러 개발자가 병렬로 작업하거나 복잡한 기능을 처리할 때 유용합니다.

https://www.bitsnbites.eu/a-tidy-linear-git-history/


(4) 협업(Collaboration) : 깃은 진정한 협업 환경을 조성합니다. 개발자는 코드를 쉽게 공유하고 변경 사항을 검토하며, 팀 간의 작업들을 통합하는 프로세스를 간소화할 수 있습니다.

관련글 더보기

댓글 영역