🥞 BE
home

알아두면 좋은 Git

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"