용어설명

워킹트리(working tree)

워크트리, 워킹 디렉토리, 작업 디렉토리, 작업 폴더 모두 같은 뜻으로 사용됩니다. 일반적으로 사용자가 파일과 하위 폴더를 만들고 작업 결과물을 저장하는 곳을 Git에서는 워킹트리라고 부릅니다.

 

로컬저장소(local repository)

git init 명령으로 생성되는 [.git] 폴더가 로컬저장소입니다. 커밋, 커밋을 구성하는 객체, 스테이지가 모두 이 폴더에 저장됩니다.

 

원격저장소(remote repository)

로컬저장소를 업로드하는 곳을 원격저장소라고 부릅니다. GitHub, GitLab, Bitbucket  등

 

Git 저장소

Git 명령으로 관리할 수 있는 폴더 전체를 일반적으로 Git 프로젝트 혹은 Git 저장소라고 부릅니다. 공식문서에서는 Git 저장소와 로컬저장소를 같은 뜻으로 사용하고 있습니다.

 


기호 설명

[옵션인자] 처럼 대괄호로 둘러싸인 부분은 생략 가능

<필수인자> 처럼 부등호로 둘러싸인 부분은 필수 입력

$ 기호는 입력하지 않습니다.


시작하기

$ git init

현재 폴더에서 Git 저장소를 생성합니다. 현재 폴더에는 [.git]이라는 숨김 폴더가 생성되는데 사실 이 폴더가 로컬저장소입니다.

 

$ git status

Git 워킹트리의 상태를 보는 명령, 워킹트리가 아닌 폴더에서 실행하면 오류가 발생.

 

$ git status -s

git status 명령보다 짧게 요약해서 상태를 보여주는 명령, 변경된 파일이 많을 때 유용하다.

 

$ git diff

워킹 디렉토리에 있는 것과 스테이지 영역에 있는 변경사항을 비교합니다.

그래서 수정하고 아직 스테이징하지 않은 것을 보여줍니다.

 

$ git diff --staged

커밋하려고 스테이징 영역에 넣은 파일의 변경 부분을 보고 싶을 경우 사용합니다.

이 명령은 저장소에 커밋한 것과 스테이징 영역에 있는 것을 비교합니다.

 


옵션 설정

--local, --global, --system

지역, 전역, 시스템 옵션을 나타냅니다.

 

$ git config --global <옵션명>

 지정한 전역 옵션의 내용을 살펴봅니다.

 

$ git config --global <옵션명> <새로운 값>

 지정한 전역 옵션의 값을 새로 설정합니다.

 

$ git config --global --unset <옵션명>

 지정한 전역 옵션을 삭제합니다.

 

$ git config --list

현재 프로젝트의 모든 옵션을 살펴봅니다.

 


기본적인 명령어

$ git add

파일들을 스테이지에 추가합니다.

새로 생성한 파일을 스테이지에 추가하고 싶다면 반드시 add 명령을 사용합니다.

 

$ git reset [파일명]...

스테이지 영역에 있는 파일들을 스테이지에서 내립니다(언스테이징).

워킹트리의 내용은 변경되지 않습니다. 옵션(soft, mixed, hard)을 생략할 경우 스테이지의 모든 변경사항을 초기화합니다.

 

$ git restore [파일명]...

언스테이지 영역에 있는 파일의 모든 수정사항을 되돌립니다. 

추적하지 않는 파일에는 영향이 없습니다.

 

$ git commit

스테이지에 있는 파일들을 커밋합니다.

 

$ git commit -a

add 명령을 생략하고 바로 커밋하고 싶을 때 사용합니다. 변경된 파일과 삭제된 파일은 자동으로 스테이징되고 커밋됩니다. 주의할 점은 untracked파일은 커밋되지 않는다는 것입니다.

 

$ git commit -amend

완료한 커밋을 수정할 때 사용합니다. 다시 커밋하고 싶으면 파일 수정 작업을 하고 Staging Area에 추가한 다음 --amend 옵션을 사용하여 커밋을 재작성 할 수 있습니다.

만약 마지막으로 커밋하고 나서 수정한 것이 없다면(커밋하자마자 바로 이 명령을 실행하는 경우) 커밋 메시지만 수정합니다.

 

$ git commit -amend -m <커밋 메시지>

완료한 커밋의 메시지를 수정할 때 사용합니다.

 

$ git rm <파일명>

Git에서 파일을 삭제할 때 사용합니다. 

삭제한 파일은 Staged 상태가 되며 커밋하면 파일은 삭제되고 Git은 이 파일을 더는 추적하지 않는다.

이미 파일을 수정했거나 스테이지 영역에 추가했다면 -f 옵션을 주어 강제로 삭제해야 한다.

 

$ git rm --cached <파일명>

스테이지 영역 에서만 제거하고 워킹 디렉토리에 있는 파일은 지우지 않고 남겨둘 때 사용합니다.

하드디스크에 있는 파일은 그대로 두고 Git만 추적하지 않게 합니다.

.gitignore 파일에 추가하는 것을 빼먹었거나 대용량 로그 파일이나 컴파일된 파일인 .a 파일 같은 것을 실수로 추가했을 때 사용합니다.

 

$ git merge 브랜치이름

지정한 브랜치의 커밋들을 현재 브랜치 및 워킹트리에 반영합니다.

 


로그 살펴보기

$ git log

현재 브랜치의 커밋 이력을 보여줍니다.

 

$ git log -n<숫자>

전체 커밋 중에서 최신 n개의 커밋만 살펴봅니다. 

 

$ git log -p -<숫자>

-p, -patch 옵션은 각 커밋의 diff 결과를 보여줍니다.

-<숫자> 옵션을 사용하면 최근 <숫자> 만큼 커밋된 결과만 보여줍니다.

 

$ git log -S <텍스트>

-S 옵션은 코드에서 추가되거나 제거된 내용 중에 <텍스트> 가 포함되어 있는지 검색합니다.

 

$ git log --oneline --graph --all --decorate

자주 사용하는 옵션으로 간결하고 멋지게 보여줍니다.

--oneline: 커밋 메시지를 한 줄로 요약해서 보여줍니다. 

--graph: 커밋 옆에 브랜치의 흐름을 그래프로 보여줍니다.

--all: 옵션이 없을 경우 HEAD와 관계없는 옵션은 보여주지 않습니다.

--decorate: 원래는 --decorate=short 옵션을 의미한다. 브랜치와 태그 등의 참조를 간결히 표시합니다.

 


도움말 기능 사용하기

$ git help <명령어>

해당 명령어의 도움말을 표시합니다.

 


원격저장소 관련 명령어

$ git remote add <원격저장소 이름> <원격저장소 주소>

원격저장소를 등록합니다.

원격저장소는 여러 개 등록할 수 있지만 같은 별명의 원격저장소는 하나만 가질 수 있습니다. 통상 첫 번째 원격저장소를 origin으로 지정합니다.

 

$ git remote -v

원격저장소 목록을 살펴봅니다.

 

$ git push [-u] [원격저장소 별명] [브랜치 이름]

현재 브랜치에서 새로 생성한 커밋들을 원격저장소에 업로드합니다. -u 옵션으로 브랜치의 업스트림을 등록할 수 있습니다. 한 번 등록한 후에는 git push만 입력해도 됩니다.

 

$ git push [원격저장소 별명] -d [원격 브랜치 이름]

원격 저장소의 브랜치를 삭제합니다.

 

$ git pull

원격저장소의 변경사항을 워킹트리에 반영합니다. git fetch + git merge 명령입니다.

 

$ git fetch [원격저장소 별명] [브랜치 이름]

원격저장소의 브랜치와 커밋들을 로컬저장소와 동기화합니다. 옵션을 생략하면 모든 원격저장소에서 모든 브랜치를 가져옵니다.

 

$ git clone <저장소 주소> [새로운 폴더명]

저장소 주소에서 프로젝트를 복재해 옵니다. 이때 새로 생길 폴더명은 생략 가능하며 폴더명을 생략하면 프로젝트 이름과 같은 이름의 폴더가 새로 생성됩니다. 저장소 주소는 꼭 원격일 필요가 없으며 로컬저장소도 git clone 명령으로 복제할 수 있습니다.

 

$ git revert HEAD

원격저장소 브랜치의 커밋을 될돌리고 싶을때 사용합니다. 

커밋을 되돌리는 새로운 커밋을 추가해줍니다.

주의) git reset 명령어는 git 히스토리에서 커밋을 완전히 없었던 일처럼 지워버리기 때문에 원격저장소의 공동 작업브랜치에 있는 커밋을 지우면 해당 커밋을 기준으로 작업하던 동료의 히스토리가 꼬일 수 있다.


브랜치 관련 명령어

 

$ git branch [-v]

로컬 저장소의 브랜치 목록을 보는 명령으로 -v 옵션을 사용하면 마지막 커밋도 함께 표시됩니다. 표시된 브랜치 중에서 이름 왼쪽에 *가 붙어 있으면 HEAD 브랜치입니다.

 

$ git branch [-f] <브랜치 이름> [커밋체크섬]

새로운 브랜치를 생성합니다. 커밋체크섬 값을 주지 않으면 HEAD로부터 브랜치를 생성합니다. 이미 있는 브랜치를 다른 커밋으로 옮기고 싶을 때는 -f 옵션을 줘야 합니다.

 

$ git branch -r[-v]

원격 저장소에 있는 브랜치를 보고 싶을 때 사용합니다. 마찬가지로 -v 옵션을 추가하여 커밋 요약도 볼 수 있습니다.

 

$ git checkout <브랜치 이름>

특정 브랜치로 체크아웃할 때 사용합니다. 브랜치 이름 대신 커밋 체크섬을 쓸 수 있습니다. 하지만 브랜치 이름을 쓰는 방법을 강력히 권장합니다.

 

$ git checkout -b <브랜치 이름> <커밋 체크섬>

특정 커밋에서 브랜치를 새로 생성하고 동시에 체크아웃까지 합니다. 두 명령을 하나로 합친 명령이기 때문에 간결해서 자주 사용합니다.

 

$ git merge <대상 브랜치>

현재 브랜치와 대상 브랜치를 병합할 때 사용합니다. 병합 커밋(merge commit)이 새로 생기는 경우가 많습니다.

 

$ git rebase <대상 브랜치>

내 브랜치의 커밋들을 대상 브랜치에 재배치시킵니다. 히스토리가 깔끔해져서 자주 사용하지만 조심해야 합니다.

 

$ git branch -d <브랜치 이름>

특정 브랜치를 삭제할 때 사용합니다. HEAD 브랜치나 병합이 되지 않은 브랜치는 삭제할 수 없습니다.

 

$ git branch -D <브랜치 이름>

브랜치를 강제로 삭제하는 명령입니다. -d 로 삭제할 수 없는 브랜치를 지우고 싶을 때 사용합니다. 역시 조심해야 합니다.

 

$ git reset --hard <이동할 커밋 체크섬>

현재 브랜치를 지정한 커밋으로 옮긴다. 작업 폴더의 내용도 함께 변경된다.

 

$ git tag -a -m <간단한 메시지> <태그 이름> [브랜치 또는 체크섬]

-a 로 주석 있는(annotated) 태그를 생성합니다. 메시지와 태그 이름은 필수이며 브랜치 이름을 생략하면 HEAD에 태그를 생성합니다.

 

$ git push <원격저장소 별명> <태그 이름>

원격 저장소에 태그를 업로드합니다.

 


HEAD~<숫자>

HEAD~은 헤드의 부모 커밋, HEAD~2는 헤드의 할어버지 커밋을 말한다. HEAD~n은 n번째 위쪽 조상이라는 뜻이다.

 

HEAD^<숫자>

HEAD^은 똑같이 부모 커밋이다. 변면 HEAD^2는 두 번째 부모를 가르킨다. 병합 커밋처럼 부모가 둘 이상인 커밋에서만 의미가 있다.

 

HEAD

1. HEAD는 현재 작업 중인 브랜치를 가리킵니다.

2. 브랜치는 커밋을 가리키므로 HEAD도 커밋을 가리킵니다.

3. 결국 HEAD는 현재 작업 중인 브랜치의 최근 커밋을 가리킵니다.

 

새로운 커밋을 생성하면

1. 새로 커밋을 생성하면 그 커밋의 부모는 언제나 이전 HEAD 커밋입니다.

2. 커밋이 생성되면 HEAD는 새로운 커밋으로 갱신됩니다.

3. HEAD가 가리키는 브랜치도 HEAD와 함께 새로운 커밋을 가리킵니다.

 


Git 내부 동작 원리

1. git add 명령을 수행하면 워킹트리의 내용을 스테이지에 추가한다.

2. git commit 명령을 수행하면 스태이지의 내용으로 새로운 커밋을 만든다.

3. 커밋 이후 git status 명령을 내리면 clean한 상태임을 표시해 주는데, 이 상태는 워킹트리, 스테이지, HEAD 커밋들이 모두 동일한 내용을 담고 있다는 뜻이다.

4. 커밋 객체는 트리 객체와 blob 객체들의 조합으로 이루어져 있다.

5. 커밋 객체는 부모 커밋에 대한 참조를 가지고 있다.

6. 브랜치를 생성하면 단순히 브랜치 파일 하나를 추가한다.

7. git add 명령을 수행하면 워킹트리의 내용을 스테이지에 추가한다.

+ Recent posts