[WDC] 00:: git의 모든 것

✍🏻 Checklist

소프트웨어 형상 관리(Configuration Management) 시스템이란?

  • 소프트웨어의 변경 사항을 추적하고 통제하는 체계이다. 버전 관리, 변경 관리라는 말과 혼용되곤 하지만 형상 관리가 이 모든 것들보다 포괄적인 언어이다.

형상 관리 시스템이 탄생한 이유

  • 소프트웨어 개발과 같이 제품의 구조가 복잡하며 여러 분야의 사람들이 협업을 하고 그 작업이 장시간 지속되어야 하는 경우에는 제작 과정 중 뿐만 아니라 제품이 지속되는 동안 지속적인 유지 보수가 다양한 사람들에 의해 이루어져야 하기 때문에 이를 추적하고 관리하기 위해서 탄생했다.

git은 어떤 특징을 가진 어떤 방식의 형상관리 시스템일까?

  • Client/Server(중앙 집중형) 방식, 분산, 비선형 저장소 방식 중 분산, 비선형 방식의 형상 관리 시스템을 채택한다. Git 이를 채택함으로써 갖는 특징은 다음과 같다.

    1) 분산형 개발
    2) 비선형 개발에 대한 강력한 지원
    3) 대형 프로젝트에 대한 효율적인 관리

하나의 서버에 집중되어 모든 작업 내역이 저장되는 중앙 집중형 형상관리 체계와 달리 개개인의 작업 히스토리 역시 각자의 서버에 저장해 관리될 수 있어 같은 파일 하나를 여러명이 동시에 작업하는 병렬 개발이 가능하며 'commit'이라는 행위 자체가 공동 코드로 즉시 병합됨을 의미하지 않아 개인 작업/공동 작업으로 분리될 수 있다. 따라서, 예기치 못 한 충돌이나 변경 사항을 해결하기 위한 시간을 최소화 시켜준다는 특성을 가지고 있다.

git은 어떻게 개발되게 되었을까?

git이 분산형 시스템을 채택한 이유는?
  • 대다수의 리눅스 커널 개발자들이 사용하던 비트키퍼에 대한 접근을 포기한 후, 리누스 토르발스가 비트키퍼와 같은 시스템을 사용하고자 했지만 자신에게 맞는 접근이 자유로운 시스템을 찾지 못 해 만들게 된 분산형 개발 관리 체계이다. 이 때 참고한 세가지 기준은 다음과 같다.
    1. 무엇을 하지 "않을지"의 예로 CVS(동시 버전 시스템)을 들며, 고민이 되면 정확히 반대의 결정을 할 것
    2. 비트키퍼의 워크플로우 같은 분산형을 지원할 것
    3. 우연이든 고의든 변질에 대한 강력한 안전기준을 포함할 것

git과 GitHub은 어떻게 다를까요?

  • git은 말그대로 형상관리 툴이고 github는 git을 공유/업로드 할 수 잇는 눈에 보이는 웹 호스팅 서비스, 즉 플랫폼이다.

git의 기본 명령어

  • git clone : 원격 저장소에 있는 작업/프로젝트를 로컬 저장소로 가지고 오는(복제) 명령어
  • git add : 작업 중인 로컬 저장소에 있는 파일들을 스테이징 상태로 변경시켜주는(커밋 가능한 상태) 명령어
  • git commit : 로컬 저장소(디렉토리)에 있는 모든 파일에 대한 스냅샷(이전 스냅샷과 비교하여 변경된 부분)을 기록하는 명령어
  • git push : 로컬 저장소에서 작업한 후 commit한 내역을 원격 저장소로 보내는 명령어
  • git pull : push와 반대로 원격 저장소에 업로드된 작업 내역을 로컬 저장소로 가져오고 싶을 때 사용하는 명령어
  • git branch : 여러 명이 각기 다른 저장소에서 작업하고 싶을 때 작업 공간(branch)를 만들어주는 명령어로 모든 브랜치의 목록을 보거나, 생성하고 삭제할 수 있음
  • git stash : 지금 바로 commit 하고 싶지는 않지만 다른 작업을 해야 할 때 저장해놓고 나중에 가져와서 쓰려고 할 때 사용하는 저장소이자 명령어

git의 Object, Commit, Head, Branch, Tag 개념

  • Object : git은 기본적으로 key-value를 가진 객체들의 저장소라고 볼 수 있다. git 에 데이터를 추가할 때, 객체(object) 를 생성한 후 해당 객체 내용의 SHA-1 해시값을 key 로써 사용하게 된다. blob, tree, commit, tag가 이 객체에 해당한다.
  • Commit : commit 객체는 tree 객체에 대한 참조, 부모(이전 커밋) 객체와 작성자와 같은 메타 데이터에 대한 참조를 저장한다.
  • Head : 현재 체크아웃된 브랜치의 가장 최신 커밋을 가리키는 것이 Head이다. Head는 브랜치 이름을 가리키고 있으며 '*'로 표시가 된다.
  • Branch : 효과적으로 파일의 변경사항에 대한 스냅샷을 보여주는 포인터의 일종이다. 새로운 기능을 추가하거나 버그/이슈를 수정할 때 브랜치를 생성/사용하여 효율적으로 작업을 할 수 있다.
  • Tag : 특정 commit에 별명을 붙여주는 명령어로 Tag를 통해서 commit 상태로 쉽게 변경하거나 reset을 통해 돌아가는 것 역시 쉽다. release 버전을 명시해 특정 태그에 해당하는 버전을 배포할 수도 있다.

git 시스템이 히스토리를 저장하는 방식

리모트 git 저장소에 원하지 않는 파일이 올라갔을 때 이를 되돌리는 방법

  • git log에서 해당 파일이 업로드된 commit id를 확인하고
git reset --hard 되돌리고자 하는 commit id

를 입력하여 되돌린다.

좋은 웹페이지 즐겨찾기