본문 바로가기
카테고리 없음

[git] git과 VCS, 파일시스템, 암호화, 복사

by hbIncoding 2024. 7. 31.

1. VCS(Version Control System)

  • 소프트웨어 개발에서 소스 코드, 문서, 설정 파일 등의 변경 이력을 관리하는 시스템입니다.
  • VCS는 파일의 변경 내용을 추적하고, 다양한 버전의 파일을 저장하며, 여러 개발자 간의 협업을 가능하게 합니다.
  • 소프트웨어 개발, 문서 관리, 설정 파일 관리에 주로 이용된다.
  • 주요 기능
    • 분경 이력 관리
    • 분산 및 협업
    • 백업 및 복구
    • 분기 및 병합
    • 태그 : 특정 시점의 버전을 태그로 관리하여 쉽게 찾기 가능
  • VCS의 종류
    • 로컬 버전 관리 시스템
      • 로컬 DB에서 관리
      • 협업이 어렵고, 장애 시 데이터 손실의 위험이 있음
      • 예시 : RCS
    • 중앙 집중식 버전 관리 시스템
      • 특징: 중앙 서버에 모든 버전 정보를 저장하고, 클라이언트가 서버에 접속하여 작업을 수행합니다.
      • 장점: 협업이 용이하며, 중앙에서 모든 버전 관리가 이루어집니다.
      • 단점: 서버 장애 시 전체 시스템에 영향을 미칩니다.
      • 예시: CVS, Subversion (SVN)
    • 분산 버전 관리 시스템
      • 특징: 각 개발자가 전체 저장소의 복사본을 로컬에 가지고 있으며, 로컬에서 작업하고, 필요 시 다른 저장소와 동기화합니다.
      • 장점: 서버에 의존하지 않고, 로컬에서 작업이 가능하며, 협업 및 백업이 용이합니다.
      • 단점: 복잡한 설정이 필요할 수 있습니다.
      • 예시: Git, Mercurial, Bazaar
  • VCS의 주요 툴 
    •  GIT
      • 특징: 분산 버전 관리 시스템으로, 성능이 뛰어나고, 비공식적인 프로젝트에서도 널리 사용됩니다.
      • 장점: 빠른 속도, 브랜칭 및 병합 기능, 분산형 작업 환경.
      • 도구: GitHub, GitLab, Bitbucket 등
    • SVN(subversion)
      • 특징: 중앙 집중식 버전 관리 시스템으로, 기존 CVS의 단점을 보완한 시스템입니다.
      • 장점: 간단한 사용법, 강력한 커밋 기능, 디렉터리의 버전 관리.
      • 도구: Apache Subversion
    • Mercurial
      • 특징: 분산 버전 관리 시스템으로, Git과 유사하지만, 사용이 더 간단합니다.
      • 장점: 쉬운 사용법, 빠른 처리 속도, 대규모 프로젝트에 적합.
      • 도구: Bitbucket (과거에는 Mercurial을 지원했으나 현재는 Git으로 전환)

 

2. Git Object

  • Git은 소스 코드 버전 관리를 위해 여러 유형의 객체를 사용한다.
  • 주로 네 가지로 구성되며, 각 객체는 고유의 SHA-1 해시를 통해 식별 된다.
  • 객체 유형
    • Blob(Binary Large Object)
      • 역할: 파일의 내용을 저장하는 객체입니다.
      • 특징: 파일의 메타데이터는 포함되지 않으며, 파일의 실제 내용만 저장됩니다. 파일이 변경될 때마다 새로운 Blob 객체가 생성됩니다.
      • 사용 예시: 소스 코드 파일, 텍스트 파일 등.
    • Tree
      • 역할: 디렉토리 구조를 표현하는 객체입니다. 트리 객체는 Blob 객체와 다른 트리 객체를 포함할 수 있습니다.
      • 특징: 파일의 이름, 권한, 그리고 Blob 객체의 해시를 저장하여 디렉토리 구조를 재현합니다.
      • 사용 예시: 프로젝트의 디렉토리 및 파일 구조.
    • Commit
      • 역할: 특정 시점의 스냅샷을 저장하는 객체입니다. Commit 객체는 트리 객체를 가리키고, 부모 커밋, 작성자 정보, 커밋 메시지를 포함합니다.
      • 특징: 프로젝트의 상태를 저장하고, 변경 이력을 관리합니다. 각 커밋은 이전 커밋을 참조하여 연속적인 이력을 구성합니다.
      • 사용 예시: 코드 변경의 기록, 버전 관리.
    • Tag
      • 역할: 특정 커밋을 가리키는 참조 객체입니다. 주로 릴리즈 버전 등 중요한 지점을 표시할 때 사용됩니다.
      • 특징: 가벼운 태그와 주석이 포함된 태그가 있습니다. 주석이 포함된 태그는 작성자 정보, 태그 메시지 등을 추가로 저장합니다.
      • 사용 예시: 릴리즈 버전 태그, 중요 지점 표시.

 

3. Git 명령어

  • Git 기본 명령어
    • git init
      • 설명: 새로운 Git 저장소를 초기화합니다.
      • 사용 예시: git init
    • git clone
      • 설명: 원격 저장소를 복제하여 로컬 저장소를 생성합니다.
      • 사용 예시: git clone <repository_url>
    • git status
      • 설명: 현재 작업 디렉토리의 상태를 확인합니다.
      • 사용 예시: git status
    • git add
      • 설명: 파일을 인덱스에 추가합니다.
      • 사용 예시: git add <file>
    • git commit
      • 설명: 인덱스에 추가된 변경 사항을 커밋합니다.
      • 사용 예시: git commit -m "Commit message"
    • git log
      • 설명: 커밋 히스토리를 확인합니다.
      • 사용 예시: git log
    • git diff
      • 설명: 변경된 내용을 확인합니다.
      • 사용 예시: git diff
    • git branch
      • 설명: 브랜치를 관리합니다.
      • 사용 예시: git branch (브랜치 목록 보기), git branch <branch_name> (새 브랜치 생성)
    • git checkout
      • 설명: 브랜치를 전환하거나 파일을 체크아웃합니다.
      • 사용 예시: git checkout <branch_name>
    • git merge
      • 설명: 다른 브랜치의 변경 사항을 현재 브랜치에 병합합니다.
      • 사용 예시: git merge <branch_name>
  • 원격 저장소 명령어
    • git remote
      • 설명: 원격 저장소를 관리합니다.
      • 사용 예시: git remote -v (원격 저장소 보기), git remote add <name> <url> (원격 저장소 추가)
    • git fetch
      • 설명: 원격 저장소의 변경 사항을 가져옵니다.
      • 사용 예시: git fetch
    • git pull
      • 설명: 원격 저장소의 변경 사항을 가져와서 병합합니다.
      • 사용 예시: git pull
    • git push
      • 설명: 로컬 커밋을 원격 저장소에 푸시합니다.
      • 사용 예시: git push <remote> <branch>
  • 고급 명령어
    • git stash
      • 설명: 작업 중인 변경 사항을 임시로 저장합니다.
      • 사용 예시: git stash
    • git rebase
      • 설명: 하나의 브랜치에서 다른 브랜치의 커밋을 재적용합니다.
      • 사용 예시: git rebase <branch>
    • git reset
      • 설명: 커밋을 초기화하거나 특정 상태로 되돌립니다.
      • 사용 예시: git reset --hard <commit> (커밋 초기화)
    • git revert
      • 설명: 이전 커밋을 취소하는 새 커밋을 생성합니다.
      • 사용 예시: git revert <commit>
    • git tag
      • 설명: 특정 커밋에 태그를 추가합니다.
      • 사용 예시: git tag <tag_name>
    • git cherry-pick
      • 설명: 특정 커밋을 다른 브랜치에 적용합니다.
      • 사용 예시: git cherry-pick <commit>
    • git bisect
      • 설명: 바이섹트 알고리즘을 사용하여 버그를 추적합니다.
      • 사용 예시: git bisect start, git bisect good <commit>, git bisect bad <commit>
  • 기타 유용한 명령어
    • git config
      • 설명: Git의 설정을 관리합니다.
      • 사용 예시: git config --global user.name "Your Name", git config --global user.email "you@example.com"
    • git show
      • 설명: 특정 커밋의 변경 내용을 보여줍니다.
      • 사용 예시: git show <commit>
    • git rm
      • 설명: 파일을 Git의 관리에서 제거합니다.
      • 사용 예시: git rm <file>
    • git mv
      • 설명: 파일을 이동하거나 이름을 변경합니다.
      • 사용 예시: git mv <old_name> <new_name>
    • git clean
      • 설명: 작업 디렉토리에서 추적되지 않는 파일을 제거합니다.
      • 사용 예시: git clean -f

 

4. GitHub와 Gist

  • 소프트웨어 개발 프로젝트를 호스팅하고 버전 관리할 수 있는 웹 기반 플랫폼입니다.
  • Gist는 GitHub의 한 서비스로, 간단하게 스니펫 코드, 메모, 단일 파일 등을 저장하고 공유할 수 있는 플랫폼
  • gist는 말 그대로 좀더 간편한데 예를 들어 복잡한 디렉토리구조는 gist에 push 할 수 없다.
  • 차이점
    • 목적:
      • GitHub는 주로 전체 프로젝트와 협업을 위한 플랫폼입니다.
      • Gist는 작은 코드 스니펫이나 단일 파일을 공유하고 저장하는 데 중점을 둡니다.
    • 기능:
      • GitHub는 이슈 트래킹, 위키, 프로젝트 관리 등의 종합적인 협업 도구를 제공합니다.
      • Gist는 간단한 코드 저장과 공유 기능에 중점을 둡니다.
    • 규모:
      • GitHub는 대규모 프로젝트와 팀 협업을 지원합니다.
      • Gist는 소규모 코드 스니펫과 메모를 공유하는 데 적합합니다.

 

5. 로컬 Repository 와 원격 Repository

  • 로컬 레포지토리
    • 사용자의 컴퓨터에 저장된 Git 리포지토리입니다. 로컬 리포지토리는 프로젝트의 모든 파일, 변경 이력, 브랜치 등을 포함합니다.
    • 개발자가 코드를 작성하고 수정할 때, 모든 작업은 먼저 로컬 리포지토리에서 이루어집니다.
  • 원격 레포지토리
    • 네트워크를 통해 접근할 수 있는 Git 리포지토리입니다.
    • GitHub, GitLab, Bitbucket 등과 같은 호스팅 서비스에 저장됩니다.
    • 원격 리포지토리는 팀 협업을 위해 사용되며, 모든 팀원이 변경 사항을 공유하고 동기화할 수 있습니다.
  • 로컬 레포지토리에서 작업을 한 것을 원격 레포지토리에 반영하거나
  • 원격 레포지토리에 적용된 사항을 로컬 레포지토리에 가져올 수 있다.

 

6. 파일 시스템과 디렉토리

  • 컴퓨터의 운영 체제에서 데이터를 저장하고 조직하는 방법입니다.
  • 파일 시스템은 파일과 디렉토리를 관리하여 데이터가 저장 장치에 효율적으로 저장되고, 쉽게 검색 및 액세스될 수 있도록 합니다.
  • 주요 기능
    • 파일 관리: 파일을 생성, 삭제, 읽기, 쓰기 등의 작업을 수행할 수 있습니다.
    • 디렉토리 관리: 디렉토리를 생성, 삭제, 탐색할 수 있습니다.
    • 저장 공간 관리: 저장 장치의 공간을 효율적으로 사용하도록 합니다.
    • 보안 및 접근 제어: 파일과 디렉토리에 대한 접근 권한을 설정하고 관리할 수 있습니다.
  • 주요 파일 시스템 종류:
    1. FAT (File Allocation Table): 오래된 파일 시스템으로 DOS와 초기 윈도우 시스템에서 사용되었습니다.
    2. NTFS (New Technology File System): Windows NT와 그 이후 버전에서 사용되는 파일 시스템으로, 보안, 압축, 암호화 기능을 제공합니다.
    3. EXT (Extended File System): 리눅스에서 사용되는 파일 시스템으로, ext2, ext3, ext4 등 다양한 버전이 있습니다.
    4. HFS+ (Hierarchical File System Plus): macOS에서 사용되는 파일 시스템입니다.
    5. APFS (Apple File System): 최신 macOS 및 iOS 장치에서 사용되는 파일 시스템입니다.
  • 디렉토리란
    • 파일 시스템에서 파일을 조직화하는 방법 중 하나로, 파일을 포함할 수 있는 컨테이너입니다.
    • 디렉토리는 파일뿐만 아니라 다른 하위 디렉토리를 포함할 수도 있습니다.
    • 이를 통해 계층적 구조를 형성하여 파일을 체계적으로 관리할 수 있습니다.
    • 주요 기능:
      1. 조직화: 파일을 논리적으로 그룹화하여 쉽게 관리할 수 있습니다.
      2. 경로 (Path): 파일과 디렉토리의 위치를 지정하는 데 사용됩니다. 절대 경로와 상대 경로로 나눌 수 있습니다.
        • 절대 경로: 루트 디렉토리부터 시작하는 전체 경로입니다. 예: /home/user/docs/file.txt
        • 상대 경로: 현재 작업 디렉토리로부터의 경로입니다. 예: ../docs/file.txt
      3. 탐색: 디렉토리 구조를 통해 파일을 탐색하고 찾을 수 있습니다.
      4. 계층 구조: 루트 디렉토리에서 시작하여 여러 하위 디렉토리로 나뉘는 트리 구조를 형성합니다.

 

7. 암호화 방식 SHA

  • 데이터를 해시값으로 변환하는 암호화 해시 함수 패밀리입니다.
  • 해시 함수는 임의 크기의 입력 데이터를 고정된 크기의 해시값(디지털 지문)으로 변환합니다.
  • SHA 알고리즘은 주로 데이터 무결성 검증, 디지털 서명, 암호화 시스템에서 사용됩니다.
  • 주요 SHA 알고리즘
    • SHA-1:
      • 출력 크기: 160비트 (20바이트)
      • 상세 정보: SHA-1은 초기의 SHA 알고리즘으로, 널리 사용되었지만 충돌 저항성에 문제가 발견되어 현재는 안전하지 않다고 간주됩니다. 주요 보안 애플리케이션에서는 더 이상 사용되지 않습니다.
    • SHA-2:
      • 출력 크기: SHA-2는 여러 버전으로 나뉘며, 각각 다른 출력 크기를 가집니다.
        • SHA-224: 224비트 (28바이트)
        • SHA-256: 256비트 (32바이트)
        • SHA-384: 384비트 (48바이트)
        • SHA-512: 512비트 (64바이트)
      • 상세 정보: SHA-2는 SHA-1의 문제를 해결하기 위해 개발되었으며, 다양한 출력 크기를 제공하여 다양한 보안 요구 사항을 충족합니다. 현재 많은 보안 애플리케이션에서 널리 사용됩니다.
    • SHA-3:
      • 출력 크기: SHA-3도 여러 버전으로 나뉩니다.
        • SHA3-224: 224비트 (28바이트)
        • SHA3-256: 256비트 (32바이트)
        • SHA3-384: 384비트 (48바이트)
        • SHA3-512: 512비트 (64바이트)
      • 상세 정보: SHA-3는 Keccak 해시 함수에 기반하며, SHA-2와는 구조적으로 다릅니다. SHA-3는 SHA-2와 함께 사용하거나 대체할 수 있으며, 추가적인 보안성을 제공합니다.
  • SHA 알고리즘의 특징
    • 고정된 출력 크기: SHA 알고리즘은 입력 데이터의 크기와 상관없이 고정된 크기의 해시값을 생성합니다.
    • 단방향 함수: 해시값으로부터 원래 데이터를 복원하는 것은 불가능합니다.
    • 충돌 저항성: 서로 다른 두 입력 데이터가 동일한 해시값을 생성하는 확률이 매우 낮습니다.
    • 무결성 검증: 데이터가 변조되지 않았음을 확인할 수 있습니다. 데이터와 함께 해시값을 전송하면, 수신자는 해시값을 계산하여 데이터의 무결성을 확인할 수 있습니다.
  • SHA 알고리즘의 활용
    • 데이터 무결성 검증: 파일 전송, 데이터 저장 시 데이터의 무결성을 확인하기 위해 사용됩니다.
    • 디지털 서명: 디지털 서명 생성과 검증 과정에서 SHA 알고리즘이 사용됩니다.
    • 암호화 시스템: 패스워드 해시, 암호화 키 생성 등 다양한 암호화 시스템에서 SHA 알고리즘이 활용됩니다.

8. 얕은 복사와 깊은 복사

  • 얕은 복사
    • 객체의 최상위 수준만 복사
    • 중첩된 객체나 배열은 원본 객체의 참조를 공유한다.
    • 메모리 사용이 적고, 복사 속도가 빠름
    • 중첩된 객체를 수정하면 원본 객체도 영향을 받음
  • 깊은 복사
    • 객체의 모든 수준을 재귀적으로 복사
    • 객체나 배열도 복사본을 만든다.
    • 메모리 사용이 많고 복사가 느림
    • 중첩된 객체를 수정해도 원본 객체는 영향을 받지 않음