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
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 |