Git

[Git] 버전 관리 시스템(Version Control System)과 Git 기본 명령어

구루싸 2020. 10. 6. 16:29
반응형
SMALL

나름 길었던 추석 연휴가 끝나니

날씨가 갑자기 추워졌네요

환절기에 감기 조심하세요^^

이번 학습 주제는 바로 Git입니다

Git은 버전 관리 시스템 중 하나로써

지금은 모르면 안되는 녀석입니다

버전 관리 시스템(VCS)은 파일 변화를

시간에 따라 기록했다가 특정 시점의 버전을

다시 꺼내서 쓸 수 있는 시스템입니다

VCS를 사용하면 각 파일을 이전 상태로

되돌리거나 수정 내용을 비교해서

책임을 추적할 수도 있어 용이한데요

VCS는 크게 세 가지로 나뉘고 아래와 같습니다

종류 설명
로컬 버전 관리 시스템(LVCS) - 많은 사람들이 버전을 관리하기 위해 디렉토리로 파일을 복사하는 방법을 쓰는데, 이 방법은 작업하던 디렉토리를 지워버리거나, 실수로 파일을 잘못 고칠 수 있고, 잘못 복사할 수 있는데 이런 점을 방지하고자 아주 간단한 데이터베이스를 사용하는 로컬 VCS를 이용해 파일의 변경 정보를 관리함
예) RCS(Revision Control System) : 기본적으로 파일에서 변경되는 부분(Patch Set)을 관리
중앙 집중식 버전 관리 시스템(CVCS) - 프로젝트를 진행하다 보면 다른 개발자와 함께 작업해야 하는 경우가 많은데 이럴 때 생기는 문제를 해결하기 위해 CVCS가 개발됨
- 파일을 관리하는 서버가 별도로 있고 클라이언트가 중앙 서버에서 파일을 받아서 사용(Checkout)
- 로컬 VCS에 비해 누가 무엇을 하고 있고, 누가 무엇을 할지 관리할 수 있으나 중앙 서버에 문제가 발생하면 모든 것을 잃을 수 있다.
예) CVS, Subversion, Perforce 
분산 버전 관리 시스템(DVCS) - 클라이언트는 단순히 파일의 마지막 스냅샷을 Checkout하지 않고 저장소 전체를 복사
- 서버에 문제가 생기면 이 복제물로 다시 작업을 시작할 수 있음
- 클라이언트 중에서 아무거나 골라도 서버를 복원할 수 있고 Checkout이 곧 백업이 되며 리모트(Remote) 저장소가 존재하여 동시에 다양한 그룹과 다양한 방법으로 협업할 수 있음
예) Git, Mecurial, Bazaar, Darcs 

오늘의 학습 주제는 Git은 바로

분산 버전 관리 시스템(DVCS)의 일종인데

다른 버전 관리 시스템(VCS)과는 달리

데이터를 다루는 방법에서

차이점을 가지고 있습니다

VCS 대부분은 관리하는 정보가 파일들의 목록이고 

각 파일의 변화를 시간 순으로 관리하면서 

파일들의 집합을 관리하지만 

Git은 이런 식으로 데이터를 저장하지 않고 

데이터를 파일 시스템 스냅샷의 스트림으로

취급하여 크기가 아주 작습니다
또한 저장소 전체를 복사하므로 

거의 모든 명령을 로컬에서 실행하여

오프라인 상태이거나 VPN에 연결하지 못해도

막힘 없이 commit 할 수 있습니다

그럼 Git은 어떻게 무결성을 유지할까요?

Git은 무결성을 위해 데이터를 저장하기 전에

항상 SHA-1 해시를 사용한 체크섬을 구하고
체크섬으로 데이터를 관리합니다


Git은 파일을 Committed, Modified, Staged 상태로 관리하는데

이 세 가지 상태는 Git 프로젝트의 세 가지 단계인

Git 디렉토리, 워킹 트리, Staging Area와 연결됩니다

1. 워킹 트리에서 파일을 수정한다.(Modified)
2. Staging Area에 파일을 Stage해서 Commit할 스냅샷을 만든다.(Staged)
3. Staging Area에 있는 파일들을 커밋해서 Git 디렉토리에 영구적인 스냅샷으로 저장한다.(Committed)

이제 아래의 링크를 통해 Git을 설치해보겠습니다

git-scm.com/download/win

 

Git - Downloading Package

Downloading Git Now What? Now that you have downloaded Git, it's time to start using it.

git-scm.com

저는 Windows 환경에 설치할 것인데

다른 환경이신 분은 각자의 환경에 맞게 설치해주세요

설치를 완료하고 나면 가장 먼저

사용자 이름과 이메일 주소를 설정해야 하는데요

아래의 명령어를 통해 가능합니다

git config --global user.name "사용자 이름"
git config --global user.email 이메일

위의 명령어에서 --global 옵션을 제외하면

프로젝트마다 다른 이름과 이메일 주소를

사용할 수 있으며 설정한 내용을

확인하는 방법은 아래와 같습니다

/* 설정한 모든 정보 */
git config --list
/* 특정 Key에 대한 정보 */
git config user.name

만약 config에 대한 정보를

좀 더 보려면 help를 이용할 수 있습니다

git help config
git config --help

이제 Git 저장소를 생성해보겠습니다

Git 저장소를 만드는 방법은

기존 프로젝트나 디렉토리를 이용하는 방법과

다른 서버에 있는 저장소를 Clone하는 방법이 있는데

기존 디렉토리를 이용하는 방법을 살펴보겠습니다

테스트를 위해 D 드라이브에

GitTest라는 디렉토리를 생성하고

명령 프롬프트에서 해당 디렉토리로

이동한 후에 아래의 명령어를 입력합니다

/* 저장소에 필요한 Skeleton이 들어있는 하위 디렉토리 .git을 생성 */
git init

현재 단계는 Git이 파일을 관리하지 않는데

Git이 파일을 관리하게 하려면

저장소에 파일을 추가하고 Commit해야합니다

이를 위해 GitTest 폴더에 test.txt 파일을 생성한 후

아래의 명령어를 입력합니다

git add *.txt
git commit -m "test"
/* Staging Area 생략 */
git commit -a -m "test"
/* 파일 되돌리기(Undo) */
git commit --amend
/* Modified 파일 되돌리기(Undo) */
git checkout -- README
/* Unstage로 변경 */
git reset HEAD README --hard

드디어 Git이 파일 버전 관리를 시작하는데

아래의 명령어로 파일의 상태를 확인할 수 있습니다

git status
git status -s
git staus --short

앞서 Git의 파일 상태를 봤는데

파일들을 생성해보고 각 단계에 따라

위의 명령어로 확인해보시는걸 추천드립니다!

다음으로 아래의 명령어를 통해

파일을 비교해 볼 수도 있습니다

/* 수정했지만 아직 staged 상태가 아닌 파일을 비교 */
git diff
/* Commit을 위해 Staging Area에 넣은 파일의 변경 부분 확인 */
git diff --staged
git diff --cached

이제부터 몇가지 명령어들을

순차적으로 나열하겠습니다

/* 파일 삭제 */
git rm log/\*.log
/* 이미 파일을 수정했거나 Index(Staging Area)에 추가했을 경우 */
git rm -f log/\*.log
/* Staging Area에서만 삭제 */
git rm --cached README
/* 파일 이름 변경 */
git mv README.txt README

참고로 위의 명령어 중 파일 이름 변경을 위한

git mv는 아래와 같은 효과를 같습니다

mv README.txt README
git rm README.txt
git add README

이제 Git의 History를 보는 방법을 보겠습니다

History는 가장 최근 Commit이 먼저 출력됩니다

먼저 git log 명령의 주요 옵션들을 보겠습니다

옵션 설명
-p 각 Commit에 적용된 패치를 출력
--stat 각 Commit에서 수정된 파일의 통계정보를 출력
--shortstat --stat 명령의 결과 중에서 수정한 파일, 추가된 라인, 삭제된 라인만 출력
--name-only Commit 정보 중에서 수정된 파일의 목록만 출력
--name-status 수정된 파일의 추가, 삭제, 수정 정보를 포함한 목록 출력
--abbrev-commit SHA-1 체크섬 처음 몇 자리만 출력
--relative-date 정확한 시간이 아닌 상대적인 형식을 출력
--graph 브랜치와 머지 히스토리 정보까지 아스키 그래프로 출력
--pretty 지정한 형식으로 출력
--since, --after 명시한 날짜 이후의 Commit 출력
--until, --before 명시한 날짜 이후의 Commit 출력
--author 입력한 저자의 Commit만 출력
--committer 입력한 Committer의 Commit만 출력
--grep Commit 메시지 안의 텍스트를 출력
-S Commit 변경(추가/삭제) 내용 안의 텍스트를 출력
-(n) 최근 n개의 Commit 출력
/* 각 Commit의 diff 결과를 최근 2개만 출력 */
git log -p -2
/* 각 Commit의 통계 정보 출력 */
git log --stat
/* 히스토리 내용을 보여줄 때 기본 형식 외에 옵션으로 출력 */
git log --pretty=oneline // 한 라인 출력
git log --pretty=short
git log --pretty=full
git log --pretty=fuller
git log --pretty=format:"%h = %an, %ar : %s"
git log --pretty=format:"%h %s" --graph

아래는 위의 명령어 중 --pretty=format에

쓰이는 몇 가지 옵션들입니다

옵션 설명
%H Commit Hash
%h 짧은 길이 Commit Hash
%T Tree Hash
%t 짧은 길이 Tree Hash
%P 부모 Hash
%p 짧은 길이 부모 Hash
%an 저자 이름
%ae 저자 이메일
%ad 저자 시각
%ar 저자 상대적 시각
%cn Committer 이름
%cd Committer 이메일
%cd Committer 시각
%cr Committer 상대적 시각
%s 요약

 

마지막으로 어떤 파일을

Git이 관리하기를 원치 않을 때

해당 파일을 무시하는 방법을 보겠습니다

이를 위해 .gitignore 파일을 생성하고

아래의 패턴 규칙을 활용해 내용을 작성합니다

- 아무 것도 없는 라인이나, '#'로 시작하는 라인은 무시
- 표준 Glob 패턴을 사용
- 슬래시(/)로 시작하면 하위 디렉토리에 적용되지 않음
- 디렉토리는 슬래시(/)를 끝에 사용하는 것으로 표현
- 느낌표(!)로 시작하는 패턴의 파일은 무시하지 않음

Git에 대해 소개만 하려다가

명령어들을 쭉 정리하게 되었네요

이것으로 오늘의 학습을 마치겠습니다
그럼 이만-_-

반응형
LIST

'Git' 카테고리의 다른 글

Merge 종류 알아보기  (1) 2024.10.14