GIT
분산 버전 관리 시스템(Distributed Version Control System)으로, 소프트웨어 개발에서 코드의 변경 사항을 추적하고 여러 사람이 동시에 하나의 프로젝트에 작업할 수 있도록 지원하는 도구이다. 2005년에 리누스 토르발스에 의해 처음 개발되었다.
- 분산된 형태 : 사용자는 레포지토리의 전체 복사본을 로컬 컴퓨터에 보유하게 된다. 이는 네트워크에 의존하지 않고 작업할 수 있게 해준다.
- 데이터 무결성 : Git은 SHA-1 해시를 사용하여 커밋(변경 사항)을 식별한다. 커밋 ID는 내용에 따라 SHA-1 해시에 기반한 ID를 생성한다.
- 브랜치와 병합 : 사용자는 다양한 브랜치에서 독립적으로 작업할 수 있으며, 각 기능별로 브랜치를 만들어서 사용할 수 있다. 이후 이러한 변경 사항을 메인 프로젝트에 병합할 수 있다.
- 성능 : Git은 성능에 중점을 두고 설계되었고, 대규모 프로젝트에서 빠른 속도로 작업할 수 있다.
- 보안 : 변경 사항과 버전의 무결성을 유지하기 위해 내용의 해시를 사용한다.
버전관리 > 백업 > 협업 순으로, GIT을 사용하는 이유인 것 같다.
예시
에이블 스쿨 폴더를 만들어서 당일에 배웠던 내용들을 commit 해보려고 한다.
설치하면 좋은 것
VS-Code -> Extension -> Git Graph
Git의 현재 상황(?)을 확인할 수 있다. 시각화되어 있어서 초보자들에게는 매우 유익한 툴인 것 같다.
간단한 사용법[add -> commit]
- local working directory에 work1.txt 라는 파일을 만든다. 내용은 1이라는 숫자만 들어가도록 작성한다.
- 커밋을 진행해보려 했지만, 오류 발생! 이유는 git repository를 초기화 해주지 않았기 때문이다.
- git init 명령어를 통해 해당 폴더를 git repository로 사용할 수 있도록 초기화 해준다.
- git add work1.txt 명령어를 통해 Working directory에 있는 것을 Stage Area로 올려놓는다.
- git commit -m <메세지명> 나의 경우엔, version 1을 줄여서 v1이라고 작성했다.
- Stage Area에 있는 것을 .git 폴더로 올라간다. 즉, 버전을 바꾸는 것을 commit이라고 한다.
- 작성자, 시간 등을 하나의 텍스트로 만들어서 SHA1 해시를 만들어 낸다.
- commit 뒤에 있는 40글자로 되어있는 것이 해쉬값이다. DB는 행이 하나씩 추가될 때마다 id 값이 1씩 증가하는데, git의 경우에는 분산관리시스템이기 때문에 내용에 따라 commit ID가 달라진다.
- 이 commit ID가 main에 저장되는 것이다.
- 그러면 Repository(.git) 에 올라간다.
- 위와 같은 내용을 반복하면 된다. 이번에는 work1.txt에 2라는 내용을 추가하고, work2.txt를 만들어서 2라는 내용을 만들어 생성한다.
- 위와 같이 현재 v2까지 커밋이 된 것을 확인할 수 있다.
장점
- 각각의 버전은 어떤 일을 했는 지 충분히 확인할 수 있다.
- 수정한 부분은 어떤 부분이 수정되었는 지 확인할 수 있다.
- 누가 바꾸었는지?(책임소재가 분명해짐...) 부모 노드가 어떤 것인 지 등의 내용을 확인할 수 있다.
특징
- 파일이 바뀔 떄만 용량이 커진다. 변경이 없는 경우에는 이전의 것을 그대로 가져다 쓴다.
- git은 파일의 내용과 파일명을 분리해서 저장한다. 그렇기 때문에 파일의 내용이 동일하면 이전의 저장되었던 파일의 내용을 가져와 사용한다.
- 각각의 버전은 스테이지의 스냅샷이라고도 한다. 이것을 잘 활용하여야 버전관리의 디버깅을 잘 사용할 수 있다고 한다.
HEAD
'HEAD'는 현재 작업중인 브랜치의 최신 커밋을 가리키는 포인터이다. Git에서 작업을 할 때, 'HEAD'는 항상 현재 체크아웃된 커밋을 나타낸다.
'HEAD'의 역할
- 현재 작업중인 커밋 식별 : 'HEAD'는 현재 작업중인 브랜치의 최근 커밋을 가리키므로, 어떤 커밋이 현재 작업 중인지 쉽게 알 수 있다.
- 커밋하기 : 새로운 커밋을 생성할 때, 'HEAD'가 가리키는 현재 커밋을 기반으로 새 커밋이 만들어진다. 새 커밋이 생성되면 'HEAD'가 가리키는 현재 커밋을 기반으로 새 커밋이 만들어진다.
- 브랜치 전환 : 브랜치를 전환할 때 (git checkout), 'HEAD'는 새로운 브랜치의 최근 커밋을 가리키게 된다. 또는, 기존의 branch로 이동해서 작업도 가능하다.
'HEAD'의 타입
- Detached HEAD : 때때로 'HEAD'는 특정 브랜치를 가리키지 않고 특정 커밋을 가리킬 수 있다. 이 상태를 'Detached HEAD' 상태라고 한다. 예를 들어, 과거의 어떤 커밋으로 체크아웃을 했을 때 발생한다. 이 상태에서 작업하고 커밋하면, 새 커밋은 어떤 브랜치에도 속하지 않게 된다. 이러한 커밋들은 새 브랜치를 생성하고 그 브랜치를 현재 커밋에 연결하지 않는 이상 접근하기 어려울 수 있다.
- 중요한 사실이 있다. main이라는 branch를 체크 아웃 하는 것이 아니라, 해당 커밋을 checkout 하는 경우 새로운 커밋을 하고 checkout main을 해버리면 방금 했던 새로운 커밋은 그냥 사라지게 된다. 어찌보면.. 당연한 소리.. 그렇지만 그림으로 설명하는 것이 가독성이 좋을 것 같다.
- Attached HEAD : 대부분의 경우 'HEAD'는 현재 체크아웃된 브랜치를 가리키며, 이는 "Attached HEAD" 상태이다. 이 상태에서는 'HEAD'가 자동으로 해당 브랜치의 최신 커밋을 따라가며, 브랜치의 최신 상태를 반영한다.
git checkout main을 한 뒤에는 v4는 사라져 버리는 것을 확인할 수 있다. 이 점은 매우 주의가 필요하다.. 작업했던 것이 사라질 수도 있으므로..!
RESET
'git reset' 명령어는 Git에서 매우 강력한 도구로, 현재 브랜치의 HEAD를 이전 상태로 되돌리는 데 사용된다. 이 명령어는 주로 커밋된 변경사항을 취소하거나, 스테이징된 변경사항을 언스테이징하는 등의 작업에 활용된다.
주요 사용 방법
- 커밋 취소하기 : 최근의 커밋들을 취소하고, 해당 커밋들의 변경사항을 작업 디렉토리로 되돌릴 수 있다.
- 스테이징된 변경사항 언스테이징하기 : 파일 경로를 지정하지 않고 옵션을 사용하면, 스테이징 영역에 있는 모든 변경사항을 언스테이징할 수 있다.
- 브랜치의 HEAD 변경하기 : 특정 커밋으로 브랜치의 HEAD를 이동시켜, 브랜치의 포인터를 업데이트 할 수 있다.
옵션
- '--soft' : HEAD는 이동시키지만, 스테이징 영역과 작업 디렉토리는 그대로 유지한다. 커밋만 취소되고, 변경사항은 스테이징 영역에 남아있게 된다.
- '--mixed' (Default) : HEAD를 이동시키고, 스테이징 영역의 변경사항을 언스테이징한다. 작업 디렉토리의 파일은 그대로 유지된다.
- '--hard' : HEAD를 이동시키고, 스테이징 영역과 작업 디렉토리의 변경사항도 모두 취소한다. 이 옵션은 변경사항을 완전히 제거하기에 매우 매우 주의해서 사용해야 한다.
- detached HEAD를 한 뒤, 새로운 exp1.txt 파일을 생성하여 add & commit 작업을 진행
- 'git branch exp' 명령어를 통해 브랜치 이름이 exp인 브랜치를 생성한다.
- 이렇게 되면 HEAD의 위치 즉, 마지막 커밋에서 브랜치가 생성되는 명령어 이다.
- Delete branch 이후에 'git reset --hard'를 진행하면 아래와 같이 exp가 아예 사라지는 모습을 볼 수 있다.
- 브랜치를 생성해서 작업을 한 모습이다.
- 이 작업물을 main과 login 작업했던 버전을 merge할 것이다.
MERGE
'git merge' 명령어는 Git에서 두 개 이상의 브랜치를 하나로 합치는 데 사용된다. 이를 통해 다른 브랜치에서 개발된 기능이나 변경사항을 메인 브랜치에 통합할 수 있다.
기본 작동 원리
- Fast-forward Merge : 소스 브랜치(main)의 모든 커밋이 타겟 브랜치의 커밋 이후에 위치할 경우, Git은 단순히 타겟 브랜치의 포인터를 소스 브랜치의 최신 커밋으로 이동한다. 이 경우엔, 별도의 병합 커밋이 생성되지 않는다.
- Three-way Merge : 두 브랜치의 최신 커밋과 두 브랜치의 공통 조상을 사용하여 병합을 수행하는 방식이다. 이는 두 브랜치가 서로 다른 커밋에서 발생한 변경사항을 가지고 있을 때 사용한다. Three-way merge 과정에서는 새로운 "병합 커밋"이 생성되며, 이 커밋은 두 브랜치의 변경사항을 모두 포함한다. 충돌이 발생할 경우, 수동으로 해결한 후 병합 커밋을 완료해야 한다.
이것을 이제 commit 해주면 된다.!!
HEAD와 main을 통해 시간여행을 할 줄 알아야 한다!! 이것을 할 줄 알아야 진정한 GIT 사용자..!
'개발 > 에이블스쿨' 카테고리의 다른 글
[웹 크롤링] 네이버 증권, 다음 증권도 크롤링 해보자! (2) | 2024.03.07 |
---|---|
[AIVLE-SCHOOL] 매번 헷갈리는 Python Numpy에 대해서 알아보자! (0) | 2024.02.27 |