티스토리 뷰

개발/git

Git 이란? (2) - Git 명령어

애쿠 2023. 1. 29. 02:09

이번 장에서는 저장소를 만들고 설정하는 방법, 파일을 추적하거나(Track) 추적을 그만두는 방법, 변경 내용을 Stage 하고 커밋하는 방법을 알게 된다.

 

파일이나 파일 패턴을 무시하도록 Git을 설정하는 방법, 실수를 쉽고 빠르게 만회하는 방법, 프로젝트 히스토리를 조회하고 커밋을 비교하는 방법, 리모트 저장소에 Push 하고 Pull 하는 방법을 살펴본다.

Git command 정리

1. 저장소 만들기

git init

기존 디렉토리를 Git 저장소로 만들기

디렉토리 내에 .git 이라는 하위 디렉토리 생성된다.

git init

git clone

기존 저장소 clone 하기. 다른 프로젝트에 참여하려거나(Contribute) Git 저장소를 복사하고 싶을 때 사용

Subversion에서 "checkout" 과 같은 의미

git clone <remote_url> <project>

 

2. 로컬 저장소에서 작업한 내용 수정/저장

들어가기에 앞서, 워킹 디렉토리 내의 파일 상태에 대해 알아야 한다. 워킹 디렉토리의 모든 파일은 크게 Tracked(관리대상임)와 Untracked(관리대상이 아님)로 나눈다.

Tracked 파일은 이미 스냅샷에 포함돼 있던 파일이다.

 

Tracked 파일은 이미 Git이 알고 있는 파일들을 지칭한다. Tracked 파일은 또 Unmodified(수정하지 않음)와 Modified(수정함) 그리고 Staged(커밋으로 저장소에 기록할) 상태 중 하나로 나뉜다.

 

Tracked 파일 외 나머지 파일은 모두 Untracked 파일이다. Untracked 파일은 워킹 디렉토리에 있는 파일 중 스냅샷에도 Staging Area에도 포함되지 않은 파일이다.

 

처음 저장소를 Clone 하면 모든 파일은 Tracked이면서 Unmodified 상태이다. 파일을 Checkout 하고 나서 아무것도 수정하지 않았기 때문에 그렇다.

 

마지막 커밋 이후 아직 아무것도 수정하지 않은 상태에서 어떤 파일을 수정하면 Git은 그 파일을 Modified 상태로 인식한다.

 

실제로 커밋을 하기 위해서는 이 수정한 파일을 Staged 상태로 만들고, Staged 상태의 파일을 커밋한다. 이런 라이프사이클을 계속 반복한다.

 

git status

git 프로젝트 파일의 상태 확인하기

git status

# 상태를 간소화하여 출력하기
git status --short
git status -s

git add

Untraked, Tracked Modified 파일을 Staging Area에 Stage하기

# 특정 파일 담기
git add <file>

# 해당 경로 이하의 모든 파일 담기
git add .

git diff

Repository와 Working tree 간 차이 조회하기

# 모든 변경사항 조회
git diff

# 특정 파일에 대한 변경사항 조회
git diff <file>

# Repository와 Staging Area 비교
git diff --staged
git diff --cached

git commit

Staging Area에 저장해둔 내용으로 새로운 커밋을 만들어 Repository에 저장하기

git commit

# commit에 diff 포함하기
git commit -v

# commit과 동시에 commit message를 인라인으로 첨부하기
git commit -m '<message>'

# Staging Area를 생략하고 커밋하기
git commit -a
git commit -am '<message>'

git rm

파일을 tracked에서 제거하기

# 제거 시 실제 파일도 삭제됨
git rm <file>

# 파일은 그대로 두고 Git에서만 추적하지 않도록 하기
git rm --cached <file>

git mv

파일 이름 변경하기

git mv <from_file> <to_file>

# 위 명령어는 실제 다음과 같은 과정을 통해 동작
mv <from_file> <to_file>
git rm <from_file>
git add <to_file>

 

3. 커밋 히스토리 조회하기

git log

커밋 히스토리 조회하기

# 저장소의 커밋 히스토리를 시간순으로 보여줌.
git log

# 최근 몇개의 커밋만 조회
git log -2 # 최근 2개의 커밋만 조회

# 각 커밋의 diff도 같이 조회 조회
git log -p
git log --patch
git log -p <commit> # 특정 커밋의 diff만 조회

# 어떤 파일이 얼마나 수정되었는지에 대한 정보를 마지막에 추가로 출력
git log --stat

# 커밋 히스토리 출력 시 기본 형식 이외의 여러가지 포맷으로 출력.
git log --pretty=oneline # git log --online
git log --pretty=short # default
git log --pretty=full
git log --pretty=fuller
git log --pretty=format: "%h - %an, %ar : %s" # 아래의 유용한 format 옵션 참조

# 브랜치와 머지 히스토리를 보여주는 아스키 그래프 출력
git log --pretty=online --graph

# 모든 브랜치의 히스토리 내역을 편리하게 살펴보기
git log --all --decorate --oneline --graph

 

4. 되돌리기

--amend 옵션

완료한 커밋을 수정. 너무 일찍 커밋했거나 어떤 파일을 빼먹었을 때 그리고 커밋 메시지를 잘못 적었을 때 커밋 재작성할 수 있음

git commit --amend

로컬의 HEAD 커밋이 수정되어 새로운 체크섬을 가진 커밋이 만들어지고 새로운 HEAD가 된다.

원격 저장소와 작업 시 이미 push한 커밋을 수정할 경우 문제가 될 수 있으니 유의해야 한다.

파일을 unstage로 변경하기

파일을 두 개 수정하고서 따로따로 커밋하려고 했지만, 실수로 git add . 라고 실행해 버렸다. 아래는 파일 하나를 unstage 상태로 변경시키는 방법이다.

git reset HEAD <file>

이번 예시에서는 unstage를 목적으로 사용했지만, 사실 git reset 명령어는 잘 모르고 사용하기에는 너무 위험하다. --hard 옵션과 함께 사용하면 작업한 코드를 통으로 날려먹을 수 있기 때문에 더욱 위험하다.

 

하지만 위에서 처럼 옵션 없이 사용하면 워킹 디렉토리의 파일은 건드리지 않는다.

Modified 파일 되돌리기

작업한 파일을 가장 최근 커밋된 버전으로 되돌리는 방법이다.

git checkout --

git checkout --<file> 명령어는 git reset과 마찬가지로 꽤 위험한 명령어라는 것을 알아야 한다. 원래 파일로 덮어썼기 때문에 수정한 내용은 전부 사라진다. 수정한 내용이 진짜 마음에 들지 않을 때만 사용하자.

 

사실 git checkout 명령어는 특정 커밋으로 이동하는 명령어다. 되돌리기 뿐만 아니라 다양한 동작을 하는 명령어라 git reset과 함께 한번 더 다뤄야할 내용이다.

 

5. 리모트 저장소

리모트 저장소는 인터넷이나 네트워크 어딘가에 있는 저장소를 말한다.

 

다른 사람들과 함께 일한다는 것은 리모트 저장소를 관리하면서 데이터를 거기에 Push 하고 Pull 하는 것이다. 리모트 저장소를 관리한다는 것은 저장소를 추가, 삭제하는 것뿐만 아니라 브랜치를 관리하고 추적할지 말지 등을 관리하는 것을 말한다.

git remote

# 연결된 원격 저장소 조회
git remote

# 원격 저장소와 URL 함께 보기
git remote -v

# 연결된 원격 저장소 url 조회, 일반적으로 origin 사용
git remote get-url <remote>

# 원격 저장소의 더 많은 정보 확인
git remote show <remote>

# 원격 저장소 연결하기
git remote add <단축이름> <url>

# 원격 저장소 이름 변경하기
git remote rename <from_단축이름> <to_단축이름>

# 저장소 제거하기
git remote remove <단축이름>

# 원격 레포지토리에서 사라져 더이상 추적할 수 없는 로컬 저장소의 브랜치를 제거한다
git remote prune <remote>

git fetch / pull

이 명령은 로컬에는 없지만, 리모트 저장소에는 있는 데이터를 모두 가져온다.

git fetch <remote>

git fetch 명령은 리모트 저장소의 데이터를 모두 로컬로 가져오지만, 자동으로 Merge 하지 않는다. 그래서 당신이 로컬에서 하던 작업을 정리하고 나서 수동으로 Merge 해야 한다.

 

리모트 저장소 브랜치에서 데이터를 가져올 뿐만 아니라 자동으로 로컬 브랜치와 Merge 하려면 다음과 같은 명령어를 사용한다.

git pull

이 명령어 들은 branch 챕터에서 조금 더 자세히 다룬다고 한다.

git push

로컬 저장소를 원격 저장소로 Push한다.

git push origin master

이 명령은 Clone 한 리모트 저장소에 쓰기 권한이 있고, Clone 하고 난 이후 아무도 Upstream 저장소에 Push 하지 않았을 때만 사용할 수 있다.

 

push 명령어 역시 branch 챕터에서 더 자세히 다룬다..

 

6. 태그

Git의 태그는 Lightweight 태그와 Annotated 태그로 두 종류가 있다.

  1. Lightweight 태그 : 특정 커밋에 대한 포인터로 임시로 생성하는 경우에 사용된다.
  2. Annotated 태그 : Git 데이터베이스에 태그를 만든 사람의 이름, 이메일과 태그를 만든 날짜, 그리고 태그 메시지도 저장한다. GPG 서명 등을 저장할 수 있어 정식 Tag 용도로 사용된다.
# tag를 알파벳 순서로 조회
git tag
git tag -l
git tag --list

# 태그 검색
git tag -l "v1.8.5*" # 1.8.5를 포함하고 있는 tag들만 검색

# Annotated 태그 생성
git tag -a v1.4 -m "my version 1.4"

# tag 상세 정보 조회
git show v1.4

# Lightweight 태그 생성
git tag v1.4-lw
git show v1.4-lw # 정보를 조회하여도 커밋정보 외에 별도의 정보를 출력하지 않는다

# 특정 커밋에 태그 붙이기
git tag -a <태그 이름> <커밋체크섬>

# 태그 공유하기
## 생성된 태그는 자동으로 원격 저장소에 태그를 전송하지 않으며 별도로 push해야 한다.
git push <remote> <tag>
git push <remote> --tags # 한번에 여러 tag push

# 특정 태그로 Checkout하기
git checkout <tag> # tag로 checkout, detached HEAD 상태가 됨
git checkout -b <branch> # 새로운 브랜치 생성, git switch -c <branch>

마치며

git에서 주로 사용되는 명령어들을 정리해봤다. 아직 추가적으로 정리할 내용들이 남아있는데 ignore에 대한 내용과 git reset에 대한 내용(시간이 되면 alias도 짚고 넘어가려고 한다)이다.

 

git branch로 넘어가기전에 다음 포스팅에서 짚고 넘어가려고 한다.

'개발 > git' 카테고리의 다른 글

GIT LFS(Large File Storage)란?  (0) 2023.02.20
Git이란? (4) - branch란?  (0) 2023.02.19
Git이란? (3) - gitignore / git reset 제대로 알고가기  (0) 2023.02.17
Git 이란? (1) - Git 기초  (0) 2023.01.28
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함