git은 무엇인가?

소스코드를 관리하거나 버전을 관리하기 위한 시스템, 소프트웨어 공학에서는 형상관리 도구에 포함된다고 할 수 있다.

VCS( Version Control System, 버전관리 시스템 )
SCM( Source Code Management, 소스코드 관리 ) < SCM( Software Configuration Management, 형상관리 )

  • 리눅스를 만든 Linus Torvalds가 만들었다. (단 2주만에... 대단하다)
  • git(버전관리 시스템)과 github(웹 서비스)는 같지 않습니다(같다고 혼용하면 안됩니다)
  • 2022년에 실시한 stackoverflow survey에서 전체 93.87%라는 압도적인 비율을 차지하고 있다(업계 1위로 자리 잡고 있다)
    https://survey.stackoverflow.co/2022/#section-version-control-version-control-systems

git의 필요성

당장 현실로 느껴지는 것은 stackoverflow 설문조사에서 볼 수 있듯이 개발을 직업으로 가지면 git을 사용할 줄 알아야 된다는 것입니다.
(회사에서는 git을 사용해서 협업하고 있는데 제가 사용할 줄 모르면 원활한 협업이 힘들겠죠? "📨팀장님: 탕비실 ... go?")
개인이 개발하더라도 git의 특징과 장점이 있기 때문에 사용하는 것이 (정신건강에) 좋다고 생각합니다.

발표자료_최종 -> 발표자료_최종_수정 -> ... -> 발표자료_진짜_진짜_최종_수정2 -> ... 언제까지?? 이 많은 파일들을 다 가지고 있어야 되나? ㅠㅠ

git을 사용하면 위와 같은 고민을 하지 않아도 됩니다.
파일 단위가 아니라 라인 단위로 추적하기 때문에 관련된 파일을 다 기록하거나 기억할 필요가 없다는 것입니다.

비유를 들면, 조별 과제를 한다고 하였을 때

팀장님이 usb를 팀원들에게 개별적으로 나눠 줌
=> 팀원들이 작업해서 팀장님에게 usb를 전달
=> 팀장님은 모든 usb를 연결해서 각각 확인
(소스코드 주고 받기)
=> 팀장님은 원하는 내용을 복사 붙여넣기하여 최종 결과물을 파일에 반영
(배포)
=> 반영된 파일을 usb에 저장하고 다시 작업할 때 팀원들에게 다시 usb를 전달
(소스코드 주고 받기, 기능 개발)
=> ... (반복)

기능 구현하고 하나의 버전으로 배포하는 과정이라고 볼 수 있는데, 이를 위해 번거로운 과정(비효율적)을 거치고 있다는 생각이 들지 않으시나요?

특징

  • 단순한 구조와 빠른 속도
  • 분산형 저장소를 지원한다 (네트워크가 되지 않더라도 독립적으로 로컬에서 개발을 하고, 이후 네트워트가 가능할 때 원격 저장소와 동기화를 할 수 있다)
  • 비선형적 개발(수천개의 브랜치)이 가능하다

장점

  • 서로 소스코드를 주고 받지 않아도 동시작업이 가능하기 때문에 생산성이 증가한다
  • 수정내용은 commit 단위로 관리하며, 배포 뿐 아니라 원하는 시점으로 Checkout(Switch) 가능하다
  • 새로운 기능 추가는 Branch로 개발하여 편안하게 실험(개발)이 가능하며, 성공적으로 개발이 완료될 경우 Merge하여 반영한다
  • 인터넷이 연결되지 않아도 개발할 수 있음 (네트워크가 되지 않아 서버에 접속이 되지 않아도, 로컬에서 먼저 개발을 진행할 수 있다)

구조

Git Objects

  • Blob
    파일 하나의 내용에 대한 정보
  • Tree
    Blob이나 subtree의 메타데이터(디렉토리 위치, 속성, 이름 등)
  • Commit
    커밋 순간의 스냅샷

reference

https://git-scm.com/book/en/v2/Git-Internals-Git-Objects

profile
$ npm run dev:ryan

0개의 댓글