Git 기초 - 2

태그: ,

카테고리: ,

이 글은 아래의 출처에서 내용을 참고하여 작성하였습니다.
출처 : https://git-scm.com/


수정 및 저장


워킹 디렉토리 내의 모든 파일은 관리대상 여부로 나뉜다

Tracked(Unmodified, Modified, Staged) / Untracked


파일의 상태 확인

git status를 통해 확인한다

변경사항이 없는 경우

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

git add로 파일을 추적(Tracked)하게 하면

$ git status
  ...중략...
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    파일 목록

파일을 추적중이며 다음 커밋에 등록(Staged)된 상태로 나온다

추적중인 파일을 수정하게 되면

$ git status
  ...중략...
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)

    파일 목록

추적중이지만 아직 다음 커밋에 등록(Staged)은 안됐다

git add는 파일을 Staged하거나
합병(Merge)시에 충돌난 파일들을 Resolve할 때도 사용한다.

파일을 Staged하고 다시 수정을 하면
파일은 마지막으로 Staged됐던 상태와
현재 수정된 상태 두 가지로 인식된다


간략하게 확인

git status -s 또는 git status --short로 상태를
?(Untracked) A(Tracked) M(Modified) 정도로
간략하게 알수있다

$ git status -s

 M README
MM Rakefile
A  lib/git.rb
M  lib/simplegit.rb
?? LICENSE.txt

좌측은 Staging Area에서의 상태이고,
우측은 Working Tree에서의 상태이다

Rakefile의 경우 첫번째 수정 후 Staged된 이후
추가 수정을 통해 첫번째 수정된 내용이 Staged이면서
Staged 이후 두 번째 수정된 내용은 Unstaged이다


파일 무시하기

무시하려면 .gitignore 파일을 만들고 그 안에 패턴을 적는다
cat은 파일 내용 출력 명령어

$ cat .gitignore

*.[oa]
*~

.gitignore 파일에 입력하는 패턴은 아래 규칙을 따른다.

  • 표준 Glob 패턴을 사용한다.
  • /로 시작하면 하위 디렉토리에 적용되지(Recursivity) 않는다.
  • 디렉토리는 /를 끝에 사용하는 것으로 표현한다.
  • !로 시작하는 패턴의 파일은 무시하지 않는다.

*.a
확장자가 .a인 파일 무시


!lib.a
윗 라인에서 .a인 파일은 무시하게 했지만
lib.a는 무시하지 않음


/TODO
현재 디렉토리에 있는 TODO파일은 무시하고
subdir/TODO처럼 하위폴더의 파일은 무시하지 않음


build/
build/ 디렉토리에 있는 모든 파일은 무시


doc/*.txt
doc/notes.txt은 무시하고
doc/server/arch.txt은 무시하지 않음


doc/**/*.pdf
doc 디렉토리 아래의 모든 .pdf 파일을 무시


파일 비교

git diff는 수정했지만 아직 staged가 아닌 파일을 비교 해준다.

$ 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

이 명령은 워킹 디렉토리(Working Tree)에 있는 것과
Staging Area에 있는 것을 비교한다.
그래서 수정하고 아직 Stage되지 않은 것을 보여준다.


만약 커밋하려고 Staging Area에 넣은 파일의 변경 부분을 보고 싶으면
git diff --staged 옵션을 사용한다.
이 명령은 저장소에 커밋한 것과 Staging Area에 있는 것을 비교한다.
git diff --cachedgit diff --staged와 같은 명령이다.

$ git diff --staged

diff --git a/README b/README
new file mode 100644
index 0000000..03902a1
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+My Project

git diff 명령은 마지막 커밋 후 수정한 것들 전부를 보여주지 않는다.
git diffUnstaged 상태인 것들만 보여준다.
수정한 파일을 모두 Staging Area에 넣었다면
git diff는 아무것도 출력하지 않는다.


변경사항 커밋하기

git commit으로 커밋한다

Unstaged 상태의 파일은 커밋되지 않는다

정확히 뭘 수정했는지도 보여줄 수 있는데,
git commit-v 옵션을 추가하면 편집기에 diff 메시지도 추가된다.
내용을 저장하고 편집기를 종료하면,
Git은 입력된 내용으로 새 커밋을 하나 만든다.

commit -m 옵션으로 메시지를 인라인으로 첨부할 수도 있다.

$ git commit -m "Story 182: Fix benchmarks for speed"
[master 463dc4f] Story 182: Fix benchmarks for speed
 2 files changed, 2 insertions(+)
 create mode 100644 README

commit은 몇 가지 정보를 출력하는데 위 예제는
master 브랜치에 커밋했고 체크섬은 463dc4f이고.
수정한 파일이 몇 갠지 삭제됐거나 추가된 라인이 몇 라인인지 알려준다.

Git은 Staging Area에 속한 스냅샷을 커밋한다는 것을 기억해야 한다.
수정은 했지만, 아직 Staging Area에 넣지 않은 것은 다음에 커밋할 수 있다.
커밋할 때마다 프로젝트의 스냅샷을 기록하기 때문에
나중에 스냅샷끼리 비교하거나 예전 스냅샷으로 되돌릴 수도 있다.


빠른 커밋

git commit -a 옵션으로 Tracked파일들을 자동으로
Staging Area에 넣고 커밋한다.
그래서 git add를 실행하는 수고를 덜 수 있다.


파일 삭제하기

git rm 명령으로 Tracked 상태의 파일을
Staging Area에서 삭제하고 커밋해야 한다.
이 명령은 실제 파일도 지워진다.


Git 명령을 사용하지 않고 단순히 워킹 디렉터리에서
파일을 삭제하고 상태를 확인하면 Git

“Changes not staged for commit”

즉, Unstaged 상태라고 표시된다.
그러므로 git rm로 파일의 삭제를 Staged해야한다.

커밋하면 파일은 삭제되고 Git은 그 파일을 더이상 추적하지 않는다.


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

이 점은 실수로 데이터를 삭제하지 못하도록 하는 안전장치다.

커밋하지 않고 수정한 데이터는 Git에 저장된 적이 없기 때문에
복구할 수도 없기 때문이다.


--cached 옵션은 파일을 그대로 두고 Git만 추적하지 않게 한다.
이것은 .gitignore에 추가하는 것을 빼먹었거나
대용량 로그 파일이나 컴파일된 파일인 .a 파일 같은 것을
실수로 추가했을 때 쓴다.

$ git rm --cached README

git rm 명령에 file-glob 패턴을 사용해
여러 개의 파일이나 디렉토리를 한꺼번에 삭제할 수도 있다.

$ git rm log/\*.log

* 앞에 \ 을 보자.
이 명령은 log/ 디렉토리에 있는 .log 파일을 모두 삭제한다.


$ git rm \*~

이 명령은 ~ 로 끝나는 모든 파일을 삭제한다.


파일 이름 변경하기

git mv (변경 이전의 파일이름) (변경 이후의 파일 이름)

$ git mv file_from file_to

사실 git mv 명령은 아래 명령어를 수행한 것과 완전 똑같다.

$ mv README.md README   # 이름 변경
$ git rm README.md      # 추적 중단
$ git add README        # 추적 등록

git mv 명령은 일종의 단축 명령어이다.
어떤 도구로 이름을 바꿔도 상관없지만
바꾸고나서 꼭 rm/add 명령을 실행해야 한다.


댓글남기기