Git의 역사
리누스 토르발즈
Linux를 개발했고, 그 과정에서 버전 관리 시스템인 git또한 직접 개발하여 배포.
CVS to SVN
•
CVS(Concurrent Versions System)는 1980년대에 개발된 중앙집중식 버전 관리 시스템이다. 파일 단위로 버전 관리를 수행하고, 브랜치와 태그 기능을 제공한다. 그러나 디렉토리 이름 변경이나 이동이 어렵고, 파일 이름 변경 시 이력이 유지되지 않는다. 원자적 커밋도 지원하지 않는다.
•
SVN은 2000년대 초반에 CVS의 한계를 극복하기 위해 개발되었다. 디렉토리 버전 관리가 가능하며, 파일 이름 변경 시 이력도 유지된다. 원자적 커밋을 지원한다.
SVN to GIT
•
SVN은 중앙집중식 버전 관리 시스템이다.
중앙 서버에 모든 버전 정보와 히스토리가 저장되고, 개발자들은 중앙 서버에서 필요한 파일만 체크아웃하여 작업한다. 변경사항을 커밋할 때마다 중앙 서버와 연결이 필요하다.
•
Git은 분산형 버전 관리 시스템이다.
대부분의 작업을 로컬에서 수행할 수 있기에 오프라인 작업이 가능하며, 성능 개선의 효과도 있다. SVN에 비해 빠르고 쉽게 브랜치를 생성하고 병합할 수 있다.
원자적 커밋(atomic commit)
원자적 커밋은 버전 관리 시스템에서 중요한 개념으로, 다음과 같은 특징을 가진다:
원자적 커밋은 구별되는 여러 변경사항들을 하나의 단일 작업 단위로 적용하는 것이다. 이는 커밋의 크기가 가능한 한 작고, 단 하나의 간단한 작업만을 포함하는 것을 의미한다.
원자적 커밋의 주요 특징
•
일관성: 커밋이 성공하면 모든 변경사항이 적용되고, 실패하면 모든 변경사항이 되돌려진다.
•
격리성: 한 번에 하나의 원자적 커밋만 처리되어 다른 작업과 독립적으로 수행된다.
•
가역성: 각 커밋이 작고 독립적이기 때문에 필요시 쉽게 되돌릴 수 있다.
•
명확성: 각 커밋은간닪나 문장으로 설명할 수 있을 만큼 명확해야 한다.
이점
•
버그 추적 용이성: 작은 단위의 커밋으로 인해 문제의 원인을 쉽게 찾을 수 있다.
•
코드 리뷰 효율성: 작은 변경사항 단위로 리뷰가 가능해 더 효과적인 코드 검토가 가능하다.
•
생산성 향상: 큰 작업을 작은 단위로 나누어 접근함으로써 복잡성을 줄이고 생산성을 높일 수 있다.
•
깔끔한 Git 히스토리: 각 커밋이 명확한 목적을 가지고 있어 프로젝트 히스토리를 이해하기 쉽다.
암호화
SHA-1(Secure Hash Algorithm 1)은 입력 데이터(파일, 메시지 등)를 고정된 크기의 해시 값으로 변환하는 해시 함수이다. Git에서 SHA-1은 파일 및 객체를 고유하게 식별하고 데이터 무결성을 확인하는 데 사용된다.
1.
해시 함수란?
해시 함수는 임의의 길이 입력 데이터를 고정된 길이의 해시 값(일반적으로 40자리 16진수)으로 변환한다. SHA-1의 경우 출력 길이는 항상 160비트(20바이트)이다.
2.
주요 특성
•
결정성: 같은 입력에 대해 항상 같은 해시 값을 생성한다.
•
충돌 저항: 서로 다른 입력이 같은 해시 값을 생성하기 어려워야 한다.
•
비가역성: 해시 값으로부터 원래 입력을 복원하는 것이 불가능하다.
•
민감성: 입력 데이터의 작은 변경도 해시 값이 크게 달라지게 만든다.
git hub와 git lab
둘 다 하나의 git 플랫폼, 디테일의 차이만 있을 뿐 비슷한 기능을 제공한다.
GitHub는 기본적으로 클라우드 기반 서비스로 제공되지만, GitHub Enterprise를 통해 기업이 자체 서버에 설치하여 사용이 가능하다. 이는 기업의 필요에 맞춘 다양한 기능을 제공하며, 보안 및 관리 측면에서도 유리하다.
반면 GitLab은 오픈 소스 버전이 있어 자체 서버에 설치해 사용할 수 있는 옵션이 더 쉽게 제공된다. GitLab의 설치는 비교적 간단하고, 커스터마이징 할 수 있는 점에서 많은 기업들이 선호한다.
즉, GitHub도 자체 서버에서 사용할 수 있는 옵션이 있지만, GitLab은 그 부분에서 더 많은 유연성을 제공한다.
git config alias
단축키? 를 지정하여 자주 쓰이는 기능을 간편하게 사용하고자 alias 설정을 하기도 한다.
많이들 하는 설정
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.lg "log --oneline --graph --decorate"
git config --global alias.last "log -1 HEAD"
git config --global alias.undo "reset --soft HEAD~1"
git config --global alias.df diff
git config --global alias.dc "diff --cached"
git config --global alias.pom "!git push && git status"