1편 - 깃 기초

2021. 9. 20. 00:59배움엔 끝이없다/Git 배워보기

안녕하세요, 이번 추석 연휴 동안 게임을 만들 계획이었는데

깃에 push를 안 해놓고 와서 아무것도 못 하게 된 김에 평소 해야겠다고 생각한 git 공부를 하기로 했습니다.

지난번 게임잼 때 저만 몰라서 굉장히 난처했는데요, 이번에 깃 공식문서를 보고 배워보려 합니다.

(공식문서..맞죠?)

 

참고 문서 : https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control

 

배운 내용들 기록도 하는 김에 저처럼 처음 배우는 분들을 위해 문서 내용을 요약해서 올려보려 합니다.

제가 이해한 대로 적었으며 필요 없을 것 같은 기능은 뺐습니다.

또 각종 명령어의 실행 결과는 첨부하지 않았습니다.

 

챕터 1. 깃 시작하기

챕터 1은 깃의 기본 개념과 설치 방법을 다룹니다. 설치 방법은 생략하겠습니다.

 

Snapshot 저장 방식

깃이 다른 버전 관리 프로그램과 다른 점은 파일 저장 방식에 차이가 있는데,

깃은 버전마다 파일의 변경사항을 저장하는 방식이 아닌, 파일들의 snapshot을 저장하는 방식을 사용합니다.

여기서 snapshot은 파일의 압축된 복사본 형태입니다.

 

깃 프로젝트의 3가지 공간

working directory(working tree) : 로컬에서 제가 사용하는 공간입니다. 여기서 파일을 수정할 수 있습니다.

staging area(index) : working directory에서의 변경사항을 staging area에 올려놓고 나중에 commit 합니다.

git directory(repository) : commit을 하면 이 저장소에 저장됩니다.

working directory에서 파일을 수정해서 staging area를 거쳐 git directory에 변경된 파일을 저장하는 방식입니다.

 

깃 파일의 3가지 상태

modified : working directory에서 수정된 파일

staged : 수정된 파일이 staging area에 올라가면 staged 상태입니다.

committed : commit을 한 상태로 git directory에 저장된 상태입니다.

 

깃 config 설정

깃에는 config 설정파일이 3가지가 있으며, 하위 설정이 상위 설정을 override 합니다.

 

.git/config : 해당 깃 디렉토리에 대한 config

~/.gitconfig : 유저에 대한 config (옵션 --global)

[path]/etc/gitconfig : 시스템의 config (옵션 --system)

 

명령어: git config 옵션

 

처음 깃을 시작할 때 계정 정보를 등록해줘야 합니다.

git config --global user.name "HappyFaceFriend" : 유저명 설정

git config --global user.email yjl980730@gmail.com : 이메일 설정

 

 

챕터 2. 깃 기본 명령어

Git Repository 만들기

깃 리포지토리를 만드는 방법은 두 가지가 있습니다.

git init : 새로운 git repository를 로컬에서 만듭니다. .git 폴더 안에 관련 파일들을 저장합니다.

git clone <url> : 이미 있는 git repository의 주소로부터 데이터를 받습니다.

 

clone 시 데이터를 받아올 때 해당 버전의 상태뿐만 아니라 이전 커밋 내용들까지 전부 읽어오기 때문에

서버의 repository가 파괴되더라도 clone 해놓은 repository로 거의 완전하게 복구가 가능하다고 합니다.

깃의 이런 로컬에 repository의 모든 데이터를 받아놓는 특징 때문에 offline 상태에서도 버전 컨트롤이 가능합니다.

 

Stage와 git add 명령어, untracked 파일과 .gitignore

git status : 현재 working directory와 staged area의 상태를 볼 수 있습니다.

git add <file> : Untracked 파일은 Tracked 파일로 설정하고, modified 파일은 staged 파일이 되며 해당 파일의 스냅샷을 stage area에 올립니다.

 

깃은 Tracked 파일들의 변화만 감지하며, working directory에 새로 추가된 파일은 Untracked 파일이 됩니다.

git add 명령어로 Tracked 파일로 만들어 줄 수 있으며,

계속 Untracked 상태로 두고 싶은 유저 세팅이나 빌드 등은 .gitignore 파일에 별도로 작성하여 관리할 수 있습니다. 

깃허브에서 https://github.com/github/gitignore 에 여러 프로젝트들에 쓰이는 gitignore 파일들을 정리해 두었습니다.

 

git diff : 변경 되었지만 staged 되지 않은 (modified) 파일들의 내용을 어느 부분이 바뀌었는지까지 보여줍니다.

git diff --staged : staged 된 내용들을 볼 수 있습니다.

 

git commit 명령어

git commit -m "메세지" : staged 된 파일들을 git repository에 커밋

git commit -a : 모든 tracked 파일들을 자동으로 add 후 커밋

git commit --amend : 현재 수정사항을 이전 커밋에 추가(스테이지, 메세지 변경 가능) (스냅샷 다시 찍는 동작)

 

파일 제거 및 되돌리기

git rm <file> : working directory와 git directory 모두에서 파일 제거 (untracked 상태가 됨) working directory에서 삭제하고 add 한 것과 같습니다.

staged 상태의 파일을 지우려면 -f 옵션을 사용합니다.

--cached 옵션은 working directory에는 남기고 stage나 git directory에서 지우고 싶을 때 (.gitignore에 등록을 까먹고 add 했을 때 등) 사용합니다.

 

깃에서 이름을 변경하거나 파일을 이동하는 건 delete 후 add와 같습니다. 깃은 파일을 snapshot 형태로 저장하기 때문에 delete 후 add 된 파일은 깃에서 rename으로 간주합니다.

 

git log 명령어

git log : 커밋 로그를 보여줍니다. 다양한 옵션들이 있습니다.

 -p : 변한 내용을 보여줌(diff) ( -2 : 2개만)
 --stat : 간략하게 보여줌(instertion, deletion 등 수만)
 --pretty=format: ~~~ : 포맷을 정해서 볼 수 있음
 --graph : 머지나 브랜치 등을 조금 그래피컬 하게 보여줌
 --since, until : 제한 가능
 -S function_name : function_name의 등장횟수가 바뀐 커밋만 보여줌
 -- 파일경로 : 해당 파일의 변화만 보여줌
 --no-merges : 머지 커밋 빼고 보여줌

 

working tree 되돌리기

git reset HEAD <file> / git restore --staged <file>: 파일을 unstage 시킵니다.
git checkout --  / git restore <file> : working directory의 파일을 이전 커밋 상태로 돌립니다. (위험! 수정사항이 저장되지 않음)

 

remote 관련 명령어들

remote repository란 인터넷(다른 시스템)에 있는 git 저장소로, remote handle로 관리합니다.

 

git remote : remote handle들을 모두 표시
git remote -v : 핸들이 갖고있는 주소를 표시
git remote add <name> <url> : remote repository를 추가
git fetch <name> : 해당 remote repository를 로컬에 가져옴 (해당 repository 의 브랜치들을 로컬에 추가)
git clone <url> : 해당 주소의 repository를 가져와 origin 이라는 이름의 remote 추가, local master브랜치를 remote의 default 브랜치로 설정

git pull <name> <local branch>: 로컬 브랜치를 해당 리모트에 업로드. 만약 다른 사람이 먼저 push 했다면 먼저 fetch해 합친 후 push 해야함

 

깃 2.27 버전부터 git config --global pull.rebase "true"or"false" 로 pull.rebase 변수를 설정하지 않으면 워닝이 뜬다고 합니다. 제대로 이해한 진 모르겠지만 기존 pull 처럼 사용하려면 false로, pull 시 덮어쓰기를 하고 싶다면 true로 설정하는 것 같습니다.

 

git remote show <name> : 해당 리모트에 관련된 정보를 모두 보여줌
git remote rename <from> <to> : 리모트 이름을  바꿈
git remote remove <name> : 리모트 제거, 관련 브랜치 등 전부 사라짐

 

 

 

 

 

 

 

 

반응형

'배움엔 끝이없다 > Git 배워보기' 카테고리의 다른 글

상황별 git 유용한 명령 모음  (0) 2022.03.27
2편 - 브랜치  (0) 2021.09.21