파일의 상태를 확인하려면 보통 git status 명령을 사용한다.
$ git status On branch master Your branch is up-to-date with 'origin/master'. nothing to commit, working directory clean
위의 내용은 파일을 하나도 수정하지 않았다는 것을 의미한다.
프로젝트에 README 파일을 만들어보자. 해당 파일은 새로 만든 파일이기 때문에 git status 명령어를 실행하면 'Untracked files'에 들어가 있다.
$ echo 'My Project' > README $ git status On branch master Your branch is up-to-date with 'origin/master'. Untracked files: (use "git add <file>..." to include in what will be committed) README nothing added to commit but untracked files present (use "git add" to track)
해당 파일은 Untracked 상태로, 파일이 Tracked 상태가 되기 전까지는 커밋되지 않는다.
git add 명령으로 파일을 새로 추적할 수 있다.
$ git add README
후에, git status 명령을 사용하면, README 파일이 Tracked 상태이면서, 커밋에 추가될 Staged 상태라는 것을 확인할 수 있다.
$ git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: README
'Changes to be committed'에 들어 있는 파일은 Staged 상태라는 것을 의미한다.
커밋하면, 'git add'를 실행한 시점의 파일이 커밋되어 저장소 히스토리에 남는다.
추가로, git add (files) 명령은 파일 또는 디렉토리의 경로를 아규먼트로 받는다. 디렉토리면 아래에 있는 모든 파일들까지 재귀적으로 추가한다.
CONTRIBUTING.md라는 파일을 수정하고 나서 git status 명령을 다시 실행하면 아래와 같다.
$ git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: README Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: CONTRIBUTING.md
'Changes not staged for commit'는 수정한 파일이 Tracked 상태이지만, 아직 Staged 상태는 아니라는 것을 의미한다.
따라서, git add 명령어를 통해, Staged 상태로 만들어줘야 한다.
add의 의미는 프로젝트에 파일을 추가한다기 보다는 다음 커밋에 추가한다고 받아들이는게 좋다.
git status 명령으로 확인하는 내용이 조금 길면, 간단하게 변경 내용을 보여주는 옵션이 있다. git status -s 또는 git status --short 옵션을 주면 된다.
$ git status -s M README MM Rakefile A lib/git.rb M lib/simplegit.rb ?? LICENSE.txt
아직 추적하지 않은 새 파일 앞에는 ??표시가 붙는다.
왼쪽은 Staging Area, 오른쪽은 Working Tree 상태를 표시한다.
어떤 파일은 Git이 관리할 필요가 없다. 보통 로그 파일이나 빌드 시스템이 자동으로 생성한 파일이 그렇다. 그런 파일을 무시하려면, .gitignore 파일을 만들고 그 안에 무시할 파일 패턴을 적는다.
$ cat .gitignore *.[oa] *.~
첫번째 라인은 .o 나, .a인 파일을 Git이 무시하라는 것이고,
두번째 라인은 ~로 끝나는 모든 파일을 무시하라는 것이다.
o나 a는 각각 빌드 시스템이 만들어내는 오브젝트와 아카이브 파일이고,
~로 끝나는 파일은 Emacs나 VI같은 텍스트 편집기가 임시로 만들어내는 파일이다. .gitignore 파일은 보통 처음에 만들어 두는 것이 편리하다.
그래야 실수로 불필요한 파일을 실수로 커밋하는 일을 방지할 수 있다.
어떤 내용이 변경됐는지 살펴보려면 git diff 명령을 사용해야 한다.
$ git diff diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8ebb991..643e24f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -65,7 +65,8 @@ branch directly, things can get messy. Please include a nice description of your changes when you submit your PR; if we have to read the whole diff to figure out why you're contributing in the first place, you're less likely to get feedback and have your change -merged in. +merged in. Also, split your changes into comprehensive chunks if your patch is +longer than a dozen lines. If you are starting to work on a particular area, feel free to submit a PR that highlights your work in progress (and note in the PR title that it's
해당 명령은 워킹 디렉토리에 있는 것과 Staging Area에 있는 것을 비교한다. 만약 커밋하려고 Staging Area에 넣은 파일의 변경 부분을 보고 싶으면, git diff --staged 옵션을 사용한다.
해당 명령은 저장소에 커밋한 것과 Staging Area에 있는 것을 비교한다.
주의해야할 점
git diff 명령은 마지막으로 커밋한 후에 수정한 것들 전부를 보여주지는 않는다. git diff는 Unstaged 상태인 것들만 보여준다. 수정한 파일을 모두 Staging Area에 넣었다면 git diff 명령은 아무것도 출력하지 않는다.
Unstaged 상태의 파일은 커밋되지 않는다는 것을 기억해야 한다.
$ git commit
메세지를 인라인으로 첨부할 수도 있다.
$ git commit -m "hi, my name is noah"
git commit 명령을 실행할 때, -a 옵션을 추가하면, Git은 Tracked 상태의 파일을 자동으로 Staging Area에 넣는다. 그래서 git add 명령을 실행하는 수고를 덜 수 있다.
$ git commit -a -m "added new brackmarks"
Git에서 파일을 제거하려면 git rm 명령으로 Tracked 상태의 파일을 삭제한 후에(정확하게는 Staging Area에서 삭제하는 것) 커밋해야 한다. 해당 명령은 워킹 디렉토리에 있는 파일도 삭제하기 때문에 실제로 파일도 지워진다. Git 명령을 사용하지 않고 단순히 워킹 디렉토리에서 파일을 삭제하고 git status 명령으로 상태를 확인하면, Git은 현재 'Changes not staged for commit'(즉, Unstaged 상태)라고 표시해준다.
$ git rm test1.txt
Git은 다른 VCS 시스템과는 달리 파일 이름의 변경이나 파일의 이동을 명시적으로 관리하지 않는다. 다시 말해서 파일 이름이 변경됐다는 별도의 정보를 저장하지 않는다. Git은 똑똑해서 굳이 파일 이름이 변경되었다는 것을 추적하지 않아도 아는 방법이 있다.
$ git mv file_from file_to
git mv 명령은 아래 명령어를 수행한 것과 완전 동일하다.
$ mv README.md README $ git rm README.md $ git add README