이 포스팅에서 작성하는 내용은 제대로 파는 Git & GitHub - by 얄코 에서 발췌하였습니다.
1. Git vs SVN
Git | SVN | |
파일 관리 방식 | Snapshot | Delta |
서버 운영 방식 | 분산 버전 관리 | 중앙집중식 버전 관리 |
1.1) Delta vs Snapshot
- Delta 방식
위의 그림처럼, 변경된 내용에 대해서만 version에 포함된다.
예를 들어, version 3의 파일들을 확인해보자
File A : 가장 최근에 변경된 version 2로 가서 File A를 가져온다.
File B : 가장 최근에 변경된. 즉, version 1로 가서 File B를 가져온다.
File C : version 3에서 File C를 가져온다.
즉, 최근에 변경된 내역으로 가서 파일을 가져와야 한다.
이 방식도 효율적이지만, commit이 상당히 많은 경우에는 속도가 느려질 수 있다.
- Snapshot 방식
위의 그림처럼, 모든 버전에서 모든 파일들을 가지고 있다.
예를 들어, version 3의 파일들을 확인해보자
단순히, version3에 있는 세 파일을 가져오면 된다.
이렇게 되면 각 버전마다의 많은 용량을 차지할거라고 생각하지만, 효율적인 방식으로 저장한다고 한다.
즉, version에 해당하는 파일들을 이전 커밋 내역들을 볼 필요 없이 가져올 수 있다.
1.2) 중앙집중식 버전 관리 vs 분산 버전 관리
- 중앙집중식 버전 관리
위의 그림처럼, 버전 관리를 중앙 서버에서만 한다.
즉, 서버에서 의존관리를 하며 중앙 서버에 의존한다.
- 분산 버전 관리
위의 그림처럼, 서버에서도 하고 로컬 저장소에서도 버전관리를 진행한다.
즉, 중앙집중식 서버관리가 로컬을 포함해 여러 개가 있다고 생각하면 된다.
그리하여, svn에서는 commit이 서버로 넣는 행위지만 git에서는 commit 후 따로 push로 원격 저장소에 따로 넣어줘야 한다.
장점
1. 분산관리로 인해 장애 대응이 수월하다.
2. 로컬에 한 번 가져오면 인터넷이 없어도 버전관리가 가능하며 그만큼 빠르다.
2. Git의 공간
Git은 아래의 3가지 공간으로 이루어져있다.
Working Directory | repository에서 수정한 파일이나 새로 추가된 파일들, ignore된 파일들이 이 공간에 있는다. - untracked : Add된 적 없는 파일 or ignore 된 파일 - tracked : Add 된 적 있고, 변경내역이 생긴 파일 |
Staging Area | git add 로 파일을 커밋할 준비를 하면, 이 공간에 있는다. 커밋을 위해 Working Directory와 구분하는 공간이라고 보면 된다. |
Repository (= .git directory) |
Staging Area에서 commit 하면, 이 공간에 있는다. |
- git restore [파일 명] : working Directory 에서 파일을 제거
해당 파일의 수정 내역 초기화 - git restore --staged [파일 명] : Staging Area -> working Directory 로 파일을 이동. (잘못 add 한 파일을 다시 복구)
= git reset HEAD [파일명]
위의 3가지 공간을 이용해 reset을 할 수 있다.
- --soft : 그간의 수정내역들이 repository 에서 Stagina Area로 이동한다.
- (default) --mixed : 그간의 수정내역들이 repository 에서 Working Directory로 이동한다.
- --hard : repository의 버전을 덮어씌움. (기존에 수정하던 내역 남지 않음)
3. Git HEAD
현재 속한 브랜치의 최신 커밋 시점
- git switch 명령어를 이용해 브랜치를 변경하는 경우, 자동으로 각 브랜치의 HEAD로 이동한다.
Git checkout
- checkout 을 이용해 시간을 이동할 수 있다.
(reset, revert는 앞의 커밋내역을 날리는 반면, checkout은 날리지 않고 시간 이동만 한다는 개념이다.) - 시간을 이동하면서 임의의 가상 브랜치를 만들어 이동하며, 여기서 브랜치를 만들어 다시 가지를 뻗을 수 있다.
다른 브랜치로 이동할 땐, switch를 이용해서 복귀가능하다. - git checkout HEAD^ : HEAD에서 1커밋 이전으로 이동
- ^ or ~의 갯수만큼 이전으로 이동한다.
ex) git checkout HEAD~5 : HEAD로 부터 5 커밋 이전으로 디오 - git checkout - : 시간을 1 커밋 되돌린다.
- ^ or ~의 갯수만큼 이전으로 이동한다.
'Git' 카테고리의 다른 글
[Git] Review Comment Pending (0) | 2023.05.28 |
---|---|
[Git] branch, log, hooks (0) | 2023.03.19 |
[Git] clean, restore, reflog, tag (0) | 2023.03.19 |
[Git] Git fetch pull, config, hunk, stash (0) | 2023.03.19 |
[Git] Git 기초 (0) | 2023.03.17 |