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 --cached
는 git 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 diff
는 Unstaged
상태인 것들만 보여준다.
수정한 파일을 모두 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
명령을 실행해야 한다.
댓글남기기