Git
Chapters ▾ 2nd Edition

A3.3 Appendix C: Git 명령어 - 스냅샷 다루기

스냅샷 다루기

Stage 하고 커밋하는 정도의 아주 기본적인 워크플로는 명령어 몇 개만 알면 된다.

git add

git add 명령은 워킹 디렉토리에서 Staging Area(“index”)로 컨텐트를 추가하는 명령어다. git commit 명령은 오로지 Staging Area만 바라보기 때문에 git add 명령으로 커밋할 스냅샷을 잘 다듬어야 한다.

이 명령은 매우 중요한 명령어라서 이 책에서 수십 번도 더 언급한다. 여기서 어떻게 사용하는지 잘 설명한 곳을 찾아보자.

`git add`는 파일을 새로 추적하기에서 자세히 설명한다.

이 명령는 충돌 시에도 필요하다. 충돌의 기초에서 어떻게 사용하는지 설명한다.

대화형 명령에서 수정한 파일 일부분을 대화형으로 Stage 하는 방법을 보여준다.

마지막으로 이 명령이 내부적으로 어떻게 동작하는지 이해할 수 있도록 Tree 개체에서 저수준 명령어로 따라 하는 예를 보여준다.

git status

git status 명령은 워킹 디렉토리와 Staging Aread의 상태를 보여준다. Modified 상태이거나 Unstaged 상태인 파일이 무엇인지 Staged 상태이지만 아직 커밋하지 않은 파일은 무엇인지 보여준다. Staging Area에 파일을 넣고 꺼내는 방법에 대한 힌트도 보여준다.

git status 명령은 파일의 상태 확인하기에서 간결하게 설명한다. 이 명령은 이 책에서 아주 많이 사용했지만 여기 설명을 벗어나지 않는다.

git diff

git diff 명령은 두 트리 개체의 차이를 보고 싶을 때 사용한다. 워킹 디렉토리와 Staging Area를 비교할 수 있고(git diff) Staing Area와 마지막 커밋을 비교할 수 있다(git diff --staged). 그리고 두 커밋을 비교할 수 있다(git diff master branchB).

`git diff`는 Staged와 Unstaged 상태의 변경 내용을 보기에서 처음 설명한다. Staged 상태인 내용이 무엇이고 반대 상태인 내용은 무엇인지 비교하는 법을 설명한다.

커밋 가이드라인에서 --check 옵션으로 공백문자가 잘못 입력되지 않았는지 확인하는 방법을 소개한다.

무슨 내용인지 확인하기에서 두 브랜치를 효율적으로 비교할 수 있는 git diff A...B 문법을 설명한다.

고급 Merge을 보면 -b 옵션으로 공백문자는 무시하고 비교하는 것과 --theirs, --ours, --base 옵션으로 충돌 난 파일의 상태를 비교하는 방법이 나와 있다.

마지막으로 서브모듈 시작하기에서 서브모듈의 변경 내용을 비교하는 --submodule 옵션도 설명한다.

git difftool

git difftool 명령은 단순히 외부 diff 도구를 실행해준다. `git diff`는 Git에 들어 있는 기능을 사용하는 것이고 외부 diff 도구로 두 트리를 비교하고 싶을 때 사용한다.

이 명령은 Staged와 Unstaged 상태의 변경 내용을 보기에서 설명한다.

git commit

git commit 명령은 `git add`로 Staging Area에 넣은 모든 파일을 커밋한다. 데이터베이스에는 하나의 스냅샷으로 기록된다. 그리고 현 브랜치가 새 커밋을 가리키게 한다.

커밋에 대한 기본적인 내용은 변경사항 커밋하기에서 다룬다. -a 플래그를 주고 `git add`를 건너뛰고 바로 커밋하는 것과 `-m`으로 커밋 메시지를 파라미터로 넘기는 방법도 보여준다.

가장 최근 커밋을 수정하는 --amend 옵션은 되돌리기에서 설명한다.

브랜치란 무엇인가을 보면 `git commit`이 무엇을 하는지 왜 그렇게 하는지 설명한다.

-S 플래그로 커밋에 서명하는 방법은 커밋에 서명하기에서 설명한다.

마지막으로 커밋 개체에서 git commit 명령이 내부적으로 하는 일이 무엇이고 실제로 어떻게 구현돼 있는지 설명한다.

git reset

git reset 명령은 되돌리는(Undo) 명령이다. 단어가 의미하는 그대로라고 생각하면 된다. HEAD 포인터를 옮기는 것과 관련돼 있고 Staging Area(index)를 되돌릴 수 있고 --hard 옵션을 주면 워킹 디렉토리도 되돌린다. --hard 옵션을 잘못 사용하면 작업물을 잃어버릴 수도 있기 때문에 이 명령을 잘 이해하고 있어야 한다.

`git reset`은 무엇보다도 `git add`로 추가한 파일을 Unstage 하는데 사용한다. 파일 상태를 Unstage로 변경하기에서 설명한다.

Reset 명확히 알고 가기에서 이 명령을 전체적으로 자세히 설명한다.

git reset --hard 명령으로 충돌 시 Merge를 취소할 수 있다. git merge --abort 로도 같은 일을 할 수 있는데 이 명령은 git reset 명령어의 Wrapper다. 이 내용은 Merge 취소하기에서 설명한다.

git rm

git rm 명령은 Staging Area나 워킹 디렉토리에 있는 파일을 삭제하는 데 사용한다. git add 명령과 비슷하게 파일의 삭제를 Stage 하는 기능이다.

파일 삭제하기에서 git rm 명령을 자세히 설명한다. Staging Area와 워킹 디렉토리 모두에서 파일을 삭제하는 방법과 --cached 옵션을 주고 Staging Area에 있는 파일만 지우고 워킹 디렉토리의 파일은 남겨두는 방법도 설명한다.

대부분은 개체 삭제에서 설명한 대로 쓰지만, 이 책에서는 다르게 사용한 예도 있다. git filter-branch 명령을 실행할 때 git rm 명령에 --ignore-unmatch 옵션을 주고 사용한다. 이 옵션은 삭제하려는 파일이 없을 때 에러가 나지 않게 해준다. 스크립트를 작성할 때는 유용하다.

git mv

git mv 명령은 파일을 옮기고(이름을 변경하고) 나서 새 파일에 git add 명령을 실행하고 이전 파일에는 `git rm`을 실행시켜주는 명령이다.

이 명령은 파일 이름 변경하기에서 다룬다.

git clean

git clean 명령은 워킹 디렉토리에서 필요없는 파일을 삭제하는 명령이다. 이 명령으로 충돌로 생긴 파일이나 빌드 아티팩트 파일을 삭제할 때 편리하다.

이 명령을 사용하는 상황과 필요한 옵션은 워킹 디렉토리 청소하기에서 다룬다.