Git-기본 개념
버전 관리 시스템
Version Control System (VCS) 소프트웨어 개발자가 함께 작업하고 전체 작업 내역을 유지하도록 도와주는 소프트웨어입니다.
다음은 VCS의 기능입니다.
- 개발자가 동시에 작업 할 수 있습니다.
- 서로의 변경 사항을 덮어 쓸 수 없습니다.
- 모든 버전의 기록을 유지합니다.
다음은 VCS의 유형입니다-
- 중앙 집중식 버전 관리 시스템 (CVCS).
- 분산 / 분산 버전 제어 시스템 (DVCS).
이 장에서는 분산 버전 제어 시스템, 특히 Git에만 집중할 것입니다. Git은 분산 버전 제어 시스템에 속합니다.
분산 버전 관리 시스템
중앙 집중식 버전 제어 시스템 (CVCS)은 중앙 서버를 사용하여 모든 파일을 저장하고 팀 협업을 가능하게합니다. 그러나 CVCS의 가장 큰 단점은 단일 장애 지점, 즉 중앙 서버의 장애입니다. 안타깝게도 중앙 서버가 한 시간 동안 다운되면 그 시간 동안 아무도 협업 할 수 없습니다. 최악의 경우에도 중앙 서버의 디스크가 손상되고 적절한 백업이 수행되지 않으면 프로젝트의 전체 기록이 손실됩니다. 여기에서 DVCS (분산 버전 제어 시스템)가 그림에 등장합니다.
DVCS 클라이언트는 디렉토리의 최신 스냅 샷을 확인할뿐만 아니라 저장소를 완전히 미러링합니다. 서버가 다운되면 모든 클라이언트의 저장소를 서버로 다시 복사하여 복원 할 수 있습니다. 모든 체크 아웃은 저장소의 전체 백업입니다. Git은 중앙 서버에 의존하지 않기 때문에 오프라인 일 때 많은 작업을 수행 할 수 있습니다. 오프라인 일 때 변경 사항을 커밋하고, 분기를 만들고, 로그를보고, 기타 작업을 수행 할 수 있습니다. 변경 사항을 게시하고 최신 변경 사항을 적용하려면 네트워크 연결 만 필요합니다.
Git의 장점
무료 및 오픈 소스
Git은 GPL의 오픈 소스 라이선스에 따라 출시되었습니다. 인터넷을 통해 자유롭게 사용할 수 있습니다. Git을 사용하면 한 푼도 지불하지 않고도 자산 프로젝트를 관리 할 수 있습니다. 오픈 소스이므로 소스 코드를 다운로드하고 요구 사항에 따라 변경을 수행 할 수도 있습니다.
빠르고 작은
대부분의 작업이 로컬에서 수행되므로 속도 측면에서 큰 이점을 제공합니다. Git은 중앙 서버에 의존하지 않습니다. 그렇기 때문에 모든 작업에 대해 원격 서버와 상호 작용할 필요가 없습니다. Git의 핵심 부분은 C로 작성되어 다른 고급 언어와 관련된 런타임 오버 헤드를 방지합니다. Git은 전체 저장소를 미러링하지만 클라이언트 측의 데이터 크기는 작습니다. 이것은 클라이언트 측에서 데이터를 압축하고 저장할 때 Git의 효율성을 보여줍니다.
암시 적 백업
데이터가 여러 개있는 경우 데이터 손실 가능성은 매우 드뭅니다. 모든 클라이언트 측에있는 데이터는 저장소를 미러링하므로 충돌 또는 디스크 손상시 사용할 수 있습니다.
보안
Git은 보안 해시 함수 (SHA1)라는 공통 암호화 해시 함수를 사용하여 데이터베이스 내의 개체를 식별하고 이름을 지정합니다. 모든 파일과 커밋은 체크 아웃시 체크섬에 의해 체크섬되고 검색됩니다. 이는 Git을 몰라도 Git 데이터베이스의 파일, 날짜, 커밋 메시지 및 기타 데이터를 변경할 수 없음을 의미합니다.
강력한 하드웨어 필요 없음
CVCS의 경우 중앙 서버는 전체 팀의 요청을 처리 할 수있을만큼 강력해야합니다. 소규모 팀의 경우 문제가되지 않지만 팀 규모가 커짐에 따라 서버의 하드웨어 제한으로 인해 성능 병목 현상이 발생할 수 있습니다. DVCS의 경우 개발자는 변경 사항을 푸시하거나 풀해야하는 경우가 아니면 서버와 상호 작용하지 않습니다. 모든 무거운 작업은 클라이언트 측에서 발생하므로 서버 하드웨어는 실제로 매우 간단 할 수 있습니다.
더 쉬운 분기
CVCS는 저렴한 복사 메커니즘을 사용합니다. 새 브랜치를 생성하면 모든 코드를 새 브랜치에 복사하므로 시간이 많이 걸리고 효율적이지 않습니다. 또한 CVCS에서 분기를 삭제하고 병합하는 작업은 복잡하고 시간이 많이 걸립니다. 그러나 Git을 사용한 지점 관리는 매우 간단합니다. 분기를 생성, 삭제 및 병합하는 데 몇 초 밖에 걸리지 않습니다.
DVCS 용어
로컬 저장소
모든 VCS 도구는 작업 복사본으로 개인 작업 공간을 제공합니다. 개발자는 개인 작업 공간에서 변경을 수행하고 커밋 후 이러한 변경 사항이 저장소의 일부가됩니다. Git은 전체 저장소의 비공개 사본을 제공하여 한 단계 더 나아갑니다. 사용자는이 저장소에서 파일 추가, 파일 제거, 파일 이름 바꾸기, 파일 이동, 변경 사항 커밋 등과 같은 많은 작업을 수행 할 수 있습니다.
작업 디렉토리 및 준비 영역 또는 색인
작업 디렉토리는 파일이 체크 아웃되는 위치입니다. 다른 CVCS에서 개발자는 일반적으로 수정을하고 변경 사항을 저장소에 직접 커밋합니다. 그러나 Git은 다른 전략을 사용합니다. Git은 수정 된 모든 파일을 추적하지 않습니다. 작업을 커밋 할 때마다 Git은 스테이징 영역에있는 파일을 찾습니다. 수정 된 모든 파일이 아닌 스테이징 영역에있는 파일 만 커밋으로 간주됩니다.
Git의 기본 워크 플로를 살펴 보겠습니다.
Step 1 − 작업 디렉토리에서 파일을 수정합니다.
Step 2 − 이러한 파일을 준비 영역에 추가합니다.
Step 3− 스테이징 영역에서 파일을 이동하는 커밋 작업을 수행합니다. 푸시 작업 후 변경 사항을 Git 저장소에 영구적으로 저장합니다.
두 개의 파일, 즉 "sort.c"와 "search.c"를 수정하고 각 작업에 대해 두 개의 다른 커밋을 원한다고 가정합니다. 스테이징 영역에 하나의 파일을 추가하고 커밋 할 수 있습니다. 첫 번째 커밋 후 다른 파일에 대해 동일한 절차를 반복합니다.
# First commit
[bash]$ git add sort.c
# adds file to the staging area
[bash]$ git commit –m “Added sort operation”
# Second commit
[bash]$ git add search.c
# adds file to the staging area
[bash]$ git commit –m “Added search operation”
얼룩
Blob은 Binary L아르 게 Ob젝. 파일의 각 버전은 blob으로 표시됩니다. Blob은 파일 데이터를 보유하지만 파일에 대한 메타 데이터는 포함하지 않습니다. 바이너리 파일이며 Git 데이터베이스에서는 해당 파일의 SHA1 해시로 이름이 지정됩니다. Git에서 파일은 이름으로 주소가 지정되지 않습니다. 모든 것이 내용으로 지정됩니다.
나무
트리는 디렉터리를 나타내는 개체입니다. Blob 및 기타 하위 디렉터리를 보유합니다. 트리는 다음과 같이 이름이 지정된 Blob 및 트리에 대한 참조를 저장하는 이진 파일입니다.SHA1 트리 객체의 해시.
커밋
Commit은 저장소의 현재 상태를 유지합니다. 커밋의 이름도SHA1해시시. 커밋 객체를 연결 목록의 노드로 간주 할 수 있습니다. 모든 커밋 객체에는 부모 커밋 객체에 대한 포인터가 있습니다. 주어진 커밋에서 부모 포인터를보고 커밋 기록을 확인하여 뒤로 이동할 수 있습니다. 커밋에 여러 상위 커밋이있는 경우 해당 특정 커밋은 두 분기를 병합하여 생성 된 것입니다.
지점
분기는 또 다른 개발 라인을 만드는 데 사용됩니다. 기본적으로 Git에는 Subversion의 트렁크와 동일한 마스터 분기가 있습니다. 일반적으로 분기는 새 기능에 대한 작업을 위해 생성됩니다. 기능이 완료되면 마스터 브랜치와 다시 병합되고 브랜치를 삭제합니다. 모든 분기는 분기의 최신 커밋을 가리키는 HEAD에 의해 참조됩니다. 커밋 할 때마다 HEAD가 최신 커밋으로 업데이트됩니다.
태그
태그는 저장소의 특정 버전으로 의미있는 이름을 할당합니다. 태그는 브랜치와 매우 유사하지만 차이점은 태그는 변경할 수 없다는 것입니다. 즉, 태그는 아무도 수정할 의도가없는 분기입니다. 특정 커밋에 대한 태그가 생성되면 새 커밋을 생성하더라도 업데이트되지 않습니다. 일반적으로 개발자는 제품 릴리스에 대한 태그를 만듭니다.
복제
복제 작업은 저장소의 인스턴스를 만듭니다. 복제 작업은 작업 복사본을 체크 아웃 할뿐만 아니라 전체 저장소를 미러링합니다. 사용자는이 로컬 저장소로 많은 작업을 수행 할 수 있습니다. 네트워킹이 관련되는 유일한 시간은 저장소 인스턴스가 동기화 될 때입니다.
손잡이
풀 작업은 원격 저장소 인스턴스의 변경 사항을 로컬 인스턴스에 복사합니다. 풀 작업은 두 저장소 인스턴스 간의 동기화에 사용됩니다. 이것은 Subversion의 업데이트 작업과 동일합니다.
푸시
푸시 작업은 로컬 저장소 인스턴스에서 원격 저장소 인스턴스로 변경 사항을 복사합니다. 변경 사항을 Git 저장소에 영구적으로 저장하는 데 사용됩니다. 이것은 Subversion의 커밋 작업과 동일합니다.
머리
HEAD는 항상 분기의 최신 커밋을 가리키는 포인터입니다. 커밋 할 때마다 HEAD가 최신 커밋으로 업데이트됩니다. 가지의 머리는.git/refs/heads/ 예배 규칙서.
[CentOS]$ ls -1 .git/refs/heads/
master
[CentOS]$ cat .git/refs/heads/master
570837e7d58fa4bccd86cb575d884502188b0c49
개정
개정판은 소스 코드의 버전을 나타냅니다. Git의 개정은 커밋으로 표시됩니다. 이러한 커밋은 다음으로 식별됩니다.SHA1 보안 해시.
URL
URL은 Git 저장소의 위치를 나타냅니다. Git URL은 구성 파일에 저장됩니다.
[tom@CentOS tom_repo]$ pwd
/home/tom/tom_repo
[tom@CentOS tom_repo]$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = [email protected]:project.git
fetch = +refs/heads/*:refs/remotes/origin/*