※ git 기초
아래 내용은 Git 기초에 대한 내용이지만 Git 이 설치되어있으면 조금 더 이해하기 편합니다.
아래 내용 중에 명령어를 실행하는 부분이 많습니다.
Git 을 설치하고 디렉토리에서 마우스 오른쪽 클릭을 하시면 Git Bash Here 메뉴를 사용해 쉽게 Git 명령어를 사용하실 수 있습니다.
1. Git 차이점 - 스냅샷
기존에 많이 사용하던 SVN 과 사용자 인터페이스는 비슷하지만 정보를 취급하는 방식은 다릅니다.
VCS 시스템 대부분은 관리하는 정보가 파일들의 목록입니다. 기존 SVN, Perforce, Bazaar 등의 시스템은 각 파일의 변화를 시간순으로 관리하면서 파일들의 집합을 관리합니다.(보통 델타 기반 버전관리 시스템이라고 합니다.)
Git 은 시간순으로 정보를 저장하지도 취급하지도 않습니다.
대신 정보를 파일 시스템 스냅샷의 연속으로 취급하고 크기가 아주 작습니다.
커밋하거나 프로젝트의 상태를 저장할 때마다 파일이 존재하는 그 순간을 중요하게 여깁니다.
파일이 달라지지 않았으면 Git은 성능을 위해서 파일을 새로 저장하지 않습니다.
단지 이전 상태의 파일에 대한 링크만 저장합니다.
Gite 은 데이터를 스냅샷의 스트림처럼 취급합니다.
이것이 Git 이 다른 VCS 와 구분되는 점입니다. 이 점 때문에 Git 은 다른 시스템의 버전 컨트롤 개념과 다르다는 것이고 많은 부분을 새로운 관점으로 바라봅니다.
2. 거의 모든 명령을 로컬에서 실행
거의 모든 명령이 로컬 파일과 데이터만 사용하기 때문에 네트워크에 있는 다른 컴퓨터는 필요 없습니다.
프로젝트의 모든 히스토리가 로컬 디스크에 있기 때문에 모든 명령이 순식간에 실행됩니다.
(대부분의 명령어가 네트워크의 속도에 영향을 받는 VCS를 사용하셨다면 차이가 느껴지실 겁니다.)
Git 은 프로젝트 히스토리를 조회할 때 서버 없이 조회합니다.
그냥 로컬 데이터베이스에서 히스토리를 읽어서 보여 줍니다.
(그래서 아주 빠른 속도로 히스토리를 조회할 수 있습니다.)
파일을 비교하기 위해 리모트에 있는 서버에 접근하고 나서 예전 버전을 가지고 올 필요가 없습니다.
그래서 오프라인 상태이거나 VPN 에 연결하지 못해도 막힘 없이 일 할 수 있습니다.
3. 무결성
Git 은 데이터를 저장하기 전에 항상 체크섬을 구하고 그 체크섬으로 데이터를 관리합니다.
그래서 체크섬을 이해하는 Git 없이는 어떠한 파일이나 디렉토리도 변경할 수 없습니다.
SHA-1 해시를 사용하여 체크섬을 만들고(40자 길이의 16진수 문자열) 파일의 내용이나 디렉토리 구조를 이용하여 체크섬을 구합니다.
Git 은 모든 것을 해시로 식별하기 때문에 파일을 이름으로 저장하지 않고 해시로 저장합니다.
1. 데이터를 추가할 뿐...
Git 으로 어떤 행위를 하든 데이터베이스에 데이터가 추가 됩니다.
되돌리거나 데이터를 삭제할 방법은 없습니다.
다른 VCS 처럼 Git 도 커밋하지 않으면 변경사항을 잃어버릴 수 있습니다.
하지만, 일단 스냅샷을 커밋하고 나면 데이터를 잃어버리기 어렵습니다.
2. 세가지 상태
- Committed
- 데이터가 로컬 데이터베이스에 안전하게 저장되었다는 것을 의미합니다.
- Modified
- 수정한 파일을 아직 로컬 데이터베이스에 커밋하지 않은 것을 말합니다.
- Staged
- 현재 수정한 파일을 곧 커밋할 것이라고 표시한 상태를 의미합니다.
Git 디렉토리는 Git 이 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳을 말합니다.
다른 컴퓨터에 있는 저장소를 Clone 할 때 Git 디렉토리가 만들어집니다.
워킹 트리는 프로젝트의 특정 버전을 Checkout 한 것입니다. Git 디렉토리는 지금 작업하는 디스크에 있고 그 디렉토리 않에 압축된 데이터베이스에서 파일을 가져와서 워킹 트리를 만듭니다.
Staging Area 는 Git 디렉토리에 있습니다. 단순한 파일로 곧 커밋할 파일에 대한 정보를 저장합니다.
(Git 에서 하용하는 Index 입니다.)
Git 으로 하는 일은 기본적으로 아래와 같습니다.
- 워킹 트리에서 파일을 수정합니다.
- Staging Area 에 파일을 Stage 해서 커밋할 스냅샷을 만듭니다.
(모든 파일을 추가할 수도 있고 선택하여 추가할 수도 있습니다.) - Staging Area 에 있는 파일들을 커밋해서 Git 디렉토리에 영구적인 스냅샷으로 저장합니다.
Git 디렉토리에 있는 파일들은 Committed 상태입니다.
파일을 수정하고 Staging Area 에 추가했다면 Staged 상태가 됩니다.
그리고 Checkout 하고 난 뒤 수정했지만, 아직 Staging Area 에 추가하지 않았으면 Modified 상태입니다.
4. CLI
Git 은 CLI 로 사용할 수 있고 GUI 를 사용할 수 있습니다.
Git 의 모든 기능을 지원하는 것은 CLI 입니다.
그래서 CLI 를 사용할 줄 알면 GUI 도 사용할 수 있습니다.
하지만 GUI 를 사용할 줄 안다고 해서 CLI 를 사용할 수 있지는 않습니다.
5. 저장소에 저장
워킹 디렉토리의 모든 파일은 Tracked(관리대상임) 와 Untracked(미관리대상) 로 나뉩니다.
상태 | 설명 | |
Tracked | 이미 스냅샷에 포함돼 있던 파일, 관리 대상 | |
Unmodified | 수정하지 않은 상태 | |
Modified | 수정한 상태 | |
Staged | 커밋으로 저장소에 기록할 상태 | |
Untracked | 워킹 디렉토리에 있는 파일 중 스냅샷에도 Staging Area 에도 포함되지 않은 파일, 관리 대상 아님 |
처음 저장소를 Clone 하게 되면 모든 파일은 Tracked 이면서 Unmodified 상태입니다. 파일을 Checkout 하고 나서 아무것도 수정하지 않았다라는 의미 입니다.
마지막 커밋 이후 아직 아무것도 수정하지 않은 상태에서 어떤 파일을 수정하면 Git 은 그 파일을 Modified 상태로 인식합니다. 실제로 커밋을 하기 위해 수정한 파일을 Staged 상태로 만들고, Staged 상태의 파일을 커밋합니다.
6. 기본 명령어
1. 사용자 정보
Git 을 설치하고 나서 가장 먼저 해야하는 것은 사용자이름과 이메일 주소를 설정하는 것입니다.
Git 은 커밋할 때마다 이 정보를 사용합니다. 한 번 커밋한 후에는 정보를 변경할 수 없습니다.
$ git config --global user.name "이름"
$ git config --global user.email 이메일@테스트.com
-- global 옵션으로 설정하는 것은 최초 한번만 하면 됩니다.
(GUI 에서는 처음 실행할 때 이 설정을 입력하게 합니다.)
2. 설정 확인
--list 옵션을 실행하면 설정한 모든 것을 확인할 수 있습니다.
$ git config --list
user.name=이름
user.email=이메일@테스트.com
...
key 값으로 특정 key 에 설정된 값을 확인할 수 있습니다.
$ git config <key>
$ git config user.name
3. 도움말 보기
명령어에 대한 도움말이 필요한 경우 아래 명령어를 실행하시면 됩니다.
$ git help <verb>
$ git help config
도움말 전체를 볼 필요 없이 각 명령에서 사용할 수 있는 옵션들에 대해서 간략히 살펴볼 수도 있습니다.
-h, --help 옵션을 사용하면 Git 명령어에서 사용할 수 있는 옵련들에 대한 간단한 도움말을 출력할 수 있습니다.
$ git add -h
$ git add --help
4. Git 저장소 만들기
1. 기존 디렉토리를 Git 저장소로 만드는 방법
Git 으로 관리하지 않던 프로젝트를 Git 으로 관리하고 싶은 경우에 사용합니다.
프로젝트 디렉토리로 이동한 수 아래 명령어를 실행합니다.
$ git init
이 명령어를 실행하면 .git 이라는 디렉토리가 생성됩니다.
.git 디렉토리에는 저장소에 필요한 뼈대 파일이 들어있습니다.
서버에 있는 리모트 저장소와 연결하기 위해 아래 명령어를 실행합니다.
$ git remote add <리모트 저장소명> <주소>
$ git remote add origin https://github.com/실제_주소
이후 Git 이 파일을 관리하기 위해서는 파일을 추가하고 커밋해야합니다.
git add, git commit 명령어는 아래에 있습니다.
2. 기존 저장소를 Clone 하는 방법
Git 으로 관리하는 프로젝트를 복사하고 싶을 때 사용합니다.
$ git clone <주소>
$ git clone https://github.com/실제_주소
(https://, git://, SSH(user@server:path/to/repo.git) 도 사용할 수 있습니다.)
SVN 같은 VCS 에 익숙한 사용자에게는 checkout 이 아니라 clone 이라는 명령어가 생소할 것 입니다.
Git 과 차이점은 서버에 있는 거의 모든 데이터를 복사한다는 것입니다.
git clone 을 실행하면 프로젝트 히스토리를 전부 가져옵니다.
실제로 서버의 디스크가 망가져도 클라이언트 저장소 중 하나를 가져다가 복구하면 됩니다.
(서버에만 적용된 설정은 복구할 수 없지만 모든 데이터는 복구 됩니다.)
5. 파일 상태 확인
파일의 상태를 확인하기 위해서는 git status 명령어를 사용합니다.
$ git status
파일 상태를 단순하게 보고 싶을 경우에는 -s, --short 옵션을 사용합니다.
$ git status -s
$ git status --short
표시 | 설명 |
?? | 아직 관리하지 않는 새 파일 |
A | 새로 생성한 파일 |
M | 수정한 파일 |
6. 파일 추가하기
1. 추가
$ git add <file_name>
git add 명령어를 실행하면 파일이 Tracked 상태이면서 커밋에 추가될 Staged 상태가 됩니다.
2. 되돌리기
이전 버전에서는 checkout 만 사용하면 되었지만 2.23 버전에서는 switch 와 restore 를 사용합니다.
$ git checkout <file_name>
# 실제 사용
$ git add test.java
$ git checkout test.java
먼저 이전 버전에서 사용하는 checkout 명령어는 브랜치와 Working tree 가 모두 변경됩니다.
실제로 checkout 명령어는 브랜치를 변경할 때도 사용합니다.
# checkout 명령어를 이용해 브랜치 변경할 때 사용하는 방법
$ git checkout <branch_name>
이전 버전에서 checkout 명령어를 이용해 브랜치도 변경하고 Working tree 도 변경하였지만 2.23 버전부터는 역할이 분리되었습니다.
# git switch 브랜치 변경
$ git switch <branch_name>
$ git switch develop
restore 명령어는 Working tree 를 복원합니다.
# git restore Working tree 되돌리기
$ git restore <file_name>
# 실제 사용
$ git add test.java
$ git restore test.java
7. 커밋
1. 커밋
$ git commit
메시지를 인라인으로 첨부하여 실행할 때는 -m 옵션을 사용합니다.
$ git commit -m "메시지 내용 작성"
git commit 명령어를 실행하면 커밋한 브랜치 정보와 체크섬 정보 그리고 수정된 파일이 몇개이고 삭제, 추가된 라인이 몇 라인인지 알려줍니다.
Git 은 Staging Area 에 속한 스냅샷을 커밋합니다. 수정은 했지만 아직 Staging Area 에 넣지 않은 것은 다음에 커밋할 수 있습니다. 커밋할 때마다 프로젝트의 스냅샷을 기록하기 때문에 나중에 스냅샷끼리 비교하거나 예전 스냅샷으로 되돌릴 수 있습니다.
2. 되돌리기
간혹 완료한 커밋을 수정해야할 때가 있습니다.
(작업이 완료되기 전에 커밋하거나 중요한 파일을 빼먹었을 때 .. 등)
다시 커밋하고 싶으면 파일 수정 작업을 하고 Staging Area 에 추가한 다음 --amend 옵션을 사용하여 커밋을 재작성할 수 있습니다.
# 최초 커밋
$ git commit -m "실수로 한 커밋"
# 커밋 수정 - 파일 추가
$ git add file.java
# 커밋 수정 - 최초 커밋 수정
$ git commit --amend
위에서 실행한 3개의 명령어는 모두 한개의 커밋으로 기록됩니다.
8. 푸시
변경한 파일을 원격 저장소로 이동하기 위해서는 git push 명령어를 사용해야합니다.
$ git push <저장소명> <브랜치명>
$ git push origin master
그 동안 로컬 저장소에서 수정한 파일과 수정 이력들을 원격 저장소로 전송합니다.
9. 파일 내용 비교
$ git diff
git diff 명령어를 실행하면 수정했지만 staged 상태가 아닌 파일을 비교할 수 있습니다.
커밋하려고 Staging Area 에 넣은 파일의 변경 부분을 보고 싶으면 --staged 옵션을 사용합니다.
$ git diff --staged
이 외에도 많은 옵션을 제공하고 있습니다.
10. 파일 삭제하기
Git 에서 파일을 제거하려면 git rm 명령어를 사용해야합니다.
Tracked 상태의 파일을 삭제한 후에 커밋을 해야합니다.
이 명령을 실행하면 디렉토리에 있는 파일도 삭제되기 때문에 실제로 파일도 지워집니다.
$ git rm <file_name>
Staging Area에서만 제거하고 워킹 디렉토리에 있는 파일은 지우지 않고 남겨둘 수 있습니다.
사용자 하드디스크에 있는 파일은 남겨두고 Git 만 추적하지 않는 방법입니다.
.gitignore 파일에 추가하지 않았거나 git 에서 더 이상 추적하지 않기 원하는 파일이 생겼을 때 사용합니다.
$ git rm --cached <file_name>
11. 파일 이름 변경
VCS 시스템과는 달리 Git 은 파일 이름의 변경아니 파일의 이동을 명시적으로 관리하지 않습니다.
파일 이름을 변경하고 싶을 경우 git mv 명령어를 실행합니다
$ git mv file_name_from file_name_to
$ git mv README.md README
12. Git 변경 이력 조회
Git 의 히스토리 정보를 조회할 때 사용합니다.
$ git log
가장 최근 커밋을 가장 먼저 보여줍니다.
그리고 각 커밋의 SHA-1 체크섬, Author, Date, Message 정보를 보여줍니다.
git log 에는 다양한 옵션을 제공합니다.
# -p --patch 각 커밋의 diff 결과를 보여줍니다.
$ git log -p
$ git log --patch
# --stat 각 커밋의 통계 정보를 조회할 수 있습니다.
$ git log --stat
# --pretty 화면에 표시되는 내용을 선택할 수 있습니다.
# oneline, short, full, fuller 가 있습니다.
$ git log --pretty=oneline
# --pretty=format 은 별도의 포맷으로 결과를 볼 수 있습니다.
$ git log --pretty=format"%h - %an, %ar : %s"
옵션 | 설명 |
%H | 커밋 해시 |
%h | 짧은 길이의 커밋 해시 |
%T | 트리 해시 |
%t | 짧은 길이 트리 해시 |
%P | 부모 해시 |
%p | 짧은 길이 부모 해시 |
%an | Author 이름 |
%ae | Author 메일 |
%ad | Author 시각(형식은 --date=옵션 참고) |
%ar | Author 상대적 시각 |
%cn | Committer 이름 |
%ce | Committer 메일 |
%cd | Committer 시각 |
%cr | Committer 상대적 시각 |
%s | 요약 |
※ git log 옵션 정보입니다.
옵션 | 설명 |
-p | 각 커밋에 적용된 패치를 보여줍니다. |
--stat | 각 커밋에서 수정된 파일의 통계정보를 보여줍니다. |
--shortstat | --stat 결과 중 수정한 파일, 추가된 라인, 삭제된 라인만 보여줍니다. |
--name-only | 커밋 정보중에서 수정된 파일의 목록만 보여줍니다. |
--name-status | 수정된 파일의 목록을 보여줄 뿐만 아니라 파일을 추가, 수정, 삭제인지 보여줍니다. |
--abbrev-commit | 40자 짜리 SHA-1 체크섬을 전부 보여주는 것이 아니라 처음 몇 자만 보여줍니다. |
--relative-date | 정확한 시간을 보여주는 것이 아니라 상대적인 형식으로 보여줍니다.(2 days ago 등) |
--pretty | 지정한 형식으로 보여줍니다. (oneline, short, full, fuller, format) |
--oneline | --pretty=oneline --abbrev-commit 두 옵션을 함께 사용한 것과 같습니다. |
13. Remote 저장소 확인
인터넷이나 네트워크 어딘가에 있는 저장소를 Remote 저장소라고 합니다.
$ git remote -v
remote 명령어에 -v 옵션을 사용하면 단축이름과 URL을 함께 볼 수 있습니다.
$ git remote show <저장소명>
$ git remote show origin
remote show 명령어를 사용하여 Remote 저장소의 구체적인 정보를 확인할 수 있습니다.
Remote 저장소의 이름을 변경하거나 저장소를 추가,삭제할 수 있습니다.
# Remote 저장소 이름 변경
$ git remote rename <remote_name_from> <remote_name_to>
# Remote 저장소 추가
$ git remote add <remote_name> <URL>
# Remote 저장소 삭제
$ git remote remove <remote_name>
14. Tag
다른 VCS 에서도 마찬가지로 릴리즈할 때 v1.0 등을 사용해 버전을 식별합니다.
이것을 태그라고 합니다.
1. 태그 목록 조회
# 생성된 태그 목록 조회
$ git tag
$ git tag -l
$ git tag --list
tag(-l, --list 옵션) 명령어를 이용해 이미 생선된 태그 목록을 조회할 수 있습니다.
(알파벳 순서로 태그를 보여줍니다.)
2. 태그 생성
git tag 는 Lightweight 태그와 Annotated 태그로 두 종류가 있습니다.
Lightweight Tag | 브랜치와 비슷합니다. 브랜치처럼 가르키는 지점을 최신 커밋으로 이동시키지 않습니다. |
Annotated Tag | Git 데이터베이스에 태그를 만든 사람의 이름, 이메일과 태그를 만든 날짜, 그리고 태그 메시지도 저장합니다. |
일반적으로는 Annotated 태그를 만들어 많은 정보를 사용할 수 있도록 하는 것이 좋습니다. 하지만 임시로 생성하는 태그이거나 정보를 사용할 필요가 없는 경우에는 Lightweight 태그를 사용할 수 있습니다.
# Annotated Tag git tag -a
$ git tag -a v1.0 -m "메시지"
# 만들어진 태그 정보 확인
$ git show v1.0
# Lightweight Tag git tag
$ git tag v1.1
# 만들어진 태그 정보 확인
$ git show v1.1
태그를 만든 후 원격 저장소에 생성한 태그를 전송하여야합니다.
# 태그 하나씩 전송
$ git push origin <tag_name>
$ git push origin v1.0
# 여러 태그 전송
$ git push origin --tags
15. Alias
리눅스 서버에서 alias 를 만들고 사용한 경험이 있다면 이해가 빠릅니다.
자주 사용하는 명령어를 반복적으로 작성하다보면 조금 더 쉽게 명령어를 쓸 수 있지 않을까?
(git add -> git a, git commit -m -> git cmsg ... 등으로 변경하고 싶은 경우가 있습니다.)
이런 경우에는 git config 명령어를 사용하여 alias 를 등록할 수 있습니다.
$ git config --global alias.a add
$ git config --global alias.unstage 'reset HEAD --'
$ git a
# $ git addd와 같습니다.
$ git unstage <file_name>
# $ git reset HEAD -- <file_name> 과 같습니다.
※ 기초 마무리
Git 은 워낙 범위가 넓기 때문에 모든 내용을 다룰 수는 없습니다.
Git 이 동작하는 방식과 많이 사용하는 명령어의 내용을 추가할 예정입니다.
'개발 > GIT' 카테고리의 다른 글
[Git] .md에 mermaid 적용 (0) | 2024.09.02 |
---|---|
[github action] github action 간단한 예제 (0) | 2024.07.10 |
[GIT] Windows Git Bash profile 설정 (2) | 2021.07.30 |
[GIT] Windows 10 GIT 설치 (0) | 2021.01.28 |
댓글