danbibibi
article thumbnail
Published 2023. 8. 9. 09:45
[Git] 2. Git 기초 DevOps

Git 저장소 만들기

저장소를 사용하는 방법에는 주로 아래 2가지 방법이 있다.

  • 아직 버전관리를 하지 않는 로컬 디렉토리 하나를 선택해서 Git 저장소를 적용하는 방법 
  • 다른 어딘가에서 Git 저장소를 Clone 하는 방법

 

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

버전관리를 하지 아니하는 기존 프로젝트를 Git으로 관리하고 싶은 경우 사용

$ cd /c/user/my_project

$ git init

$ git add *.c
$ git add LICENSE
$ git commit -m 'initial project version'

 

기존 저장소를 clone 하기

다른 프로젝트에 참여하려거나(Contribute) Git 저장소를 복사하고 싶은 경우 사용

$ git clone <url>

# 예시
# git clone https://github.com/libgit2/libgit2

 

수정하고 저장소에 저장하기

  • 워킹 디렉토리의 모든 파일은 크게 Tracked(관리대상임)와 Untracked(관리대상이 아님)로 나뉨
  • Tracked 파일 : 이미 스냅샷에 포함돼 있던 파일 (Unmodified, Modified, Staged) = Git이 알고 있는 파일
  • 처음 저장소를 Clone 한 경우, 모든 파일은 Tracked이면서 Unmodified 상태

# 파일의 상태 확인하기
$ git status

# 파일 상태 짤막하게 확인하기
git status -s

# 어떤 내용이 변경됐는지 확인하기
git diff

# 파일을 새로 추적하기, modified 상태의 파일을 stage 하기
# git add 파일명
$ git add cal.c

# 커밋하기
# git commit -m "커밋 메세지"
$ git commit -m "OOO 수정"

# add and commit 
$ git commit -a -m "OOO 수정"

# 파일 삭제하기 (삭제한 파일은 Staged 상태)
# 커밋하면 파일은 삭제되고 Git은 이 파일을 더는 추적하지 않음
# git rm 파일명
$ git rm cal.c

# Staging Area에서만 제거하고 워킹 디렉토리에 있는 파일은 남겨두기
$ git rm --cached README

#  ~ 로 끝나는 파일을 모두 삭제 (\ 탈바꿈)
$ git rm \*~

# 파일 이름 변경하기
$ git mv file_from file_to

# 위와 동일
$ mv README.md README
$ git rm README.md
$ git add README
이미 파일을 수정했거나 Staging Area에 추가했다면 -f 옵션을 주어 강제로 삭제해야 함
= 실수로 데이터를 삭제하지 못하도록 하는 안전장치
커밋 하지 않고 수정한 데이터는 Git으로 복구할 수 없기 때문!!

 

파일 무시하기

어떤 파일은 Git이 관리할 필요가 없음 (로그 파일, 빌드 시스템이 자동으로 생성한 파일 등)
.gitignore 파일을 만들고 그 안에 무시할 파일 패턴을 적으면 됨

# 확장자가 “.o” 나 “.a” 인 파일 무시
.[oa]

#  ~ 로 끝나는 모든 파일 무시
*~ : 

# 확장자가 .a인 파일 무시
*.a

# 윗 라인에서 확장자가 .a인 파일은 무시하게 했지만 lib.a는 무시하지 않음
!lib.a

# 현재 디렉토리에 있는 TODO파일은 무시하고 subdir/TODO처럼 하위디렉토리에 있는 파일은 무시하지 않음
/TODO

# build/ 디렉토리에 있는 모든 파일은 무시
build/

# doc/notes.txt 파일은 무시하고 doc/server/arch.txt 파일은 무시하지 않음
doc/*.txt

# doc 디렉토리 아래의 모든 .pdf 파일을 무시
doc/**/*.pdf
 

GitHub - github/gitignore: A collection of useful .gitignore templates

A collection of useful .gitignore templates. Contribute to github/gitignore development by creating an account on GitHub.

github.com

 

Staged와 Unstaged 상태의 변경 내용을 보기

단순히 파일이 변경됐다는 사실이 아니라 어떤 내용이 변경됐는지 살펴보려면

git status 명령이 아니라 git diff 명령을 사용해야 함

$ git diff # 수정했지만 아직 staged 상태가 아닌 파일을 비교
$ git diff --staged # 커밋하려고 Staging Area에 넣은 파일의 변경 부분을 보고 싶은 경우
$ git diff --cached # --staged와 같은 옵션

 

커밋 히스토리 조회하기

$ git log
$ git log -p -2
$ git log --pretty=oneline
$ git log --pretty=format:"%h %s" --graph
  • 저장소의 커밋 히스토리를 시간순으로 보여줌
  • 각 커밋의 SHA-1 checksum, 저자 이름, 저자 이메일, 커밋한 날짜, 커밋 메시지를 보여줌
  • 옵션 -p : 각 커밋의 diff 결과를 보여줌
  • 옵션 -2 : 최근 두 개의 결과만 보여줌
  • 옵션 --stat : 각 커밋의 통계 정보 조회 (얼마나 수정됐는지 확인 가능)
  • 옵션 --pretty=online : 각 커밋을 한 라인으로 보여줌

 

되돌리기

  • 커밋을 했는데 Stage 하는 것을 깜빡하고 빠트린 파일이 있는 경우
  • --amend 옵션으로 커밋을 고치는 작업은, 추가로 작업한 일이 작아도 이전 커밋을 완전히 새로 고쳐서 새 커밋으로 변경하는 것을 의미
  • 빠뜨린 것을 넣거나 변경하는 것을 새 커밋으로 분리하지 않고 하나의 커밋에서 처리 가능
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

 

파일 상태를 Unstage로 변경하기

reset 명령은 위험하지만, 옵션 없이 사용하는 경우 워킹 디렉토리의 파일은 건드리지 않음

$ git reset HEAD <file>

 

Modified 파일 되돌리기

수정한 내용이 전부 사라지기 때문에, 꽤 위험한 명령어

$ git checkout -- <file>
# git checkout -- CONTRIBUTING.md

 

리모트 저장소

  • 리모트 저장소를 관리할 줄 알아야 다른 사람과 함께 일할 수 있음
  • 리모트 저장소 : 인터넷이나 네트워크 어딘가에 있는 저장소
  • 리모트 저장소 관리 = 저장소를 추가, 삭제하는 것뿐만 아니라 브랜치를 관리하고 추적할지 말지 등을 관리하는 것

 

리모트 저장소 확인하기

  • git remote 명령으로 현재 프로젝트에 등록된 리모트 저장소를 확인 가능
  • 옵션 -v : 단축이름과 URL을 함께 볼 수 있음
$ git remote
$ git remote -v

 

리모트 저장소 추가하기

기존 워킹 디렉토리에 새 리모트 저장소를 쉽게 추가할 수 있음

$ git remote add <단축이름> <url>
# git remote add pb https://github.com/paulboone/ticgit

 

로컬 저장소에는 없지만 Paul의 저장소에 있는 것을 가져오려면 아래과 같이 실행

$ git fetch pb

 

리모트 저장소를 pull하거나 fetch하기

$ git fetch <remote>
pull은 원격 저장소의 소스를 가져오고 merge 하지만 fetch의 경우 단지 소스를 가져올 뿐 merge 하지 않음

 

리모트 저장소에 push 하기

  • Clone 한 리모트 저장소에 쓰기 권한이 있고, 아무도 Upstream 저장소에 Push 하지 않았을 때만 사용 가능
  • 먼저 다른 사람이 작업한 것을 가져와서 Merge 한 후에 Push 할 수 있음
$ git push origin master

 

리모트 저장소 살펴보기

리모트 저장소의 구체적인 정보 확인

$ git remote show <리모트 저장소 이름>
# git remote show origin

 

리모트 저장소 이름 변경 & 삭제

# remote 저장소 이름 변경
$ git remote rename pb paul

# remote 저장소 삭제
$ git remote remove paul
$ git remote rm paul

 

 

태그

$ git tag
$ git tag -l "v1.8.5*" #  1.8.5 버전의 태그들만 검색하고 싶은 경우

 

Annotated 태그

  • Git 데이터베이스에 태그를 만든 사람의 이름, 이메일과 태그를 만든 날짜, 그리고 태그 메시지도 저장
  • tag 명령을 실행할 때 -a 옵션을 추가하여 만듦
  • -m 옵션 : 태그를 저장할 때 메시지를 함께 저장할 수 있음
  • git show 명령으로 태그 정보와 커밋 정보를 모두 확인할 수 있음
$ git tag -a v1.4 -m "my version 1.4"
$ git show v1.4

 

Lightweight 태그

  • 브랜치와 비슷한데 브랜치처럼 가리키는 지점을 최신 커밋으로 이동시키지 않음
  • 단순히 특정 커밋에 대한 포인터일 뿐
  • Lightweight 태그를 만들 때는 -a, -s, -m 옵션을 사용하지 않음 (이름만 달아줄 뿐)
  • git show 를 실행하면 별도의 태그 정보를 확인할 수 없음 (단순히 커밋 정보만을 보여줌)
일반적으로 Annotated 태그를 만들어 이 모든 정보를 사용할 수 있도록 하는 것이 좋지만,
임시로 생성하는 태그거나 이러한 정보를 유지할 필요가 없는 경우에는 Lightweight 태그를 사용할 수도 있음

 

나중에 태그하기 

$ git tag -a v1.2 9fceb02
  • 예전 커밋에 대해서도 태그할 수 있음
  • 명령 끝에 checksum을 명시

 

태그 공유하기

$ git push origin <태그 이름>
$ git push origin --tags
  • git push 명령은 자동으로 리모트 서버에 태그를 전송하지 않음
  • 태그를 만들었으면 서버에 별도로 Push 해야함
  • --tags 옵션 : 한 번에 태그를 여러개 push 하고 싶은 경우 사용, 리모트 서버에 없는 태그를 모두 전송 가능

 

Git Alias

Git의 명령을 전부 입력하는 것이 귀찮다면 git config 를 사용하여 각 명령의 Alias을 쉽게 만들 수 있음

$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
$ git config --global alias.last 'log -1 HEAD'
$ git config --global alias.unstage 'reset HEAD --'

 

 

 

 

 

'DevOps' 카테고리의 다른 글

CI/CD(지속적 통합/배포) 정리  (0) 2024.02.28
[Git] cherry-pick  (0) 2023.12.01
[Git] 커밋 메시지 템플릿 설정  (0) 2023.11.30
[Git] 3. Git branch  (0) 2023.09.01
[Git] 1. 시작하기  (0) 2023.07.24
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로