프로그래밍을 하다보면 작성한 코드들의 버전을 관리해야 하는 상황이 많이 생긴다.
어제 작성한 코드와 오늘 작성한 코드의 그저 저장된 상태로는 변경 내역을 추적하기가 어렵다.
매번 다른 이름으로 파일을 저장하며 관리 할 수 도 있겠지만, 이 방법은 저장공간을 낭비할 수 있다.
“프로그램최종 파일”
“프로그램찐 최종 파일”
“프로그램_찐찐 최종 파일”
“프로그램_진짜 찐찐찐 최종 파일”
파일을 단순히 덮어쓰거나, 다른 이름으로 저장하는 방식으로는 과거 특정한 시점으로 파일을 되돌리기 어렵다.
페이지에서 어떤 하나의 디자인을 다시 과거로 돌리려 할 때가 있다면, 그 시점이 언제인지 명확하게 알기 힘들뿐더러 다른 코드와 함께 수정 되어 있다면, 즉시 해당 버전으로 되돌리기가 매우 어렵게 된다.
대규모 프로젝트는 대부분 여러 개발자가 함께 협업하여 개발을 한다. 각각의 기능을 분담하여 개발을 하고, 나중에 각각의 내용들을 모아 하나의 파일로 합치는 과정이 매우 어렵다.
작성한 코드의 양이 방대하고, 누가 어떤 파일에서 어떻게 코드를 수정했는지 파악하기 힘들기 때문이다.
서로의 코드를 일일이 비교하며 개발해야 한다면 많은 부분에서 효율성이 떨어지게 된다.
“Git”은 이러한 문제들을 해결해주는 방안으로 등장하게 되었다.
“버전 관리를 도와주는 SW, 버전 관리 시스템(Version Control System)”
리눅스의 아버지라고 불리는 Linus Torvalds 가 전 세계 수많은 개발자와 함께 오픈 소스 프로젝트를 진행하다 버전 관리에 어려움을 느껴 만든 도구이다.
버전 관리 시스템인 Git은 여러 개발자가 동시에 작업할 때 코드 충돌을 방지하고 작업 내역을 체계적으로 관리하는 데 도움을 준다.
분산 버전 관리, 가볍고 빠른 브랜치 관리, 그리고 다양한 협업 플랫폼과의 통합으로 인해 현대 소프트웨어 개발에서 널리 사용되고 있다.
Git을 잘 사용하기 위해서는 중요한 컨셉을 잘 알아둘 필요가 있다. 사용하는 입장에서 Git을 바라볼 때, 어떤 흐름으로 파일이 관리가 되는지 알아보자.
Git에는 크게 3가지의 영역으로 나눠져 있다.
add 명령어를 통해 파일 임시로 옮겨 놓는다.*commit 명령어를 통해 파일을 저장한다.*
Git은 위 3가지 영역을 그림과 같이 파일이 순서대로 영역을 옮겨가며 수정된 내역을 하나의 버전으로 저장되도록 관리할 수 있다.
Git이 아무 파일이나 수정된 내역을 추적(tracking)하지 않는다.
또한 Git이 변경사항을 추적(Tracking)하기는 하지만, 당장 버전에 등록할지를 말지를 지정해 둘 수 있는 상태들이 있다.
Git이 File을 바라보는 관점에서 상태가 다음과 같이 나눠진다.
*Working directory 에 존재**Staging Area*에는 올라가있지 않는 상태 → Unstaged*Staging Area*에는 올라가있는 상태 → staged
지금까지 알아본 Git은 기본적으로 개인 Local 환경에서 동작하는 소프트웨어이다.
Local에서 저장해 놓은 Git 히스토리에 문제가 발생하게 되면, 지금까지 저장한 내용들을 쉽게 잃어 버리게 될 수 있다.
또한 다른 개발자들과의 협업을 위해서라면 서로 공유할 수 있는 하나의 저장소가 필요한데, 이것을 Remote 환경 즉,하나의 서버에 저장할 수 있도록 제공하는 서비스가 바로 Github이다.

Local에서 Remote에 등록할 때는 기본적으로 Github의 원격 Repository와 연결해 줘야 한다. 연결이 된 상태에서 push 라는 명령어를 사용하여 원격 Repository에 Git 히스토리를 등록할 수 있다.
반대로, 원격 Repository(Github)에서 Local에 가져와 사용하고 싶을 때는 pull 이나 fetch 명령어를 통해 불러올 수 있다.
Git에 대한 상세한 기능에 대해서는 다음 포스트를 통해 알아보자
귀