커밋 : 코드의 변화를 기록하는 것
깃은 부모커밋을 기반으로 변화된 부분만 추출하여 새로운 커밋을 생성합니다.
파일 이름을 변경하지 않고도 동일한 이름으로 관리 가능하며
시간에 따라 변화되는 내용만 관리합니다.
status명령어로 깃의 상태를 확인할 수 있습니다.
$ git status
On branch master
No commits yet
Untracked files :
(use "git add <file>..." to include in what will be committed)
index.html ##새롭게 등록된 파일
nothing added to commit but untracked files present (use "git add" to track)
깃에서 등록이란 워킹디렉토리에 있는 파일을 스테이지영역에 복사하는것을 의미합니다.
실제로 파일을 복사하지는 않고 깃 내부에서 논리적인 기록을 변경하는 과정입니다.
add명령어를 통해 워킹디렉토리에 있는 파일을 스테이지에 등록할 수 있고,
파일은 untracked에서 tracked로 상태가 변경됩니다.
add명령어로 추적한 후 status명령어를 통해 추적 상태를 확인할 수 있습니다.
$ git status
On branch master
No commits yet
Changes to be committed :
(use "git rm --cached <file>..." to unstage)
new file : index.html
tracked 상태의 파일을 untracked상태로 변경합니다.
$ git rm --cached index.html
# 혹은
$ git restore --stage index.html
# 한번이라도 커밋을 했다면 reset 명령어를 사용해야한다.
$ git reset HEAD index.html
restore
1. HEAD가 가리키고있는 커밋으로 파일을 되돌리기
git restore index.html
2. tracked된 파일을 untracked상태로 돌리기
git restore --staged index.html
mv명령어로 파일이름 변경 && 깃에도 변경할 수 있습니다.
$ git mv 파일이름 새파일이름
이를 풀어서 쓰면
$ mv index.html home.html
$ git rm index.html
$ git add home.html
HEAD
커밋을 가리키는 묵시적 참조 포인터
최종 커밋 작업 위치를 가리키며,
커밋될때마다 한단계씩 이동합니다
깃은 변경된 파일 전체를 저장하지 않고
파일에서 변경된 부분을 찾아 수정된 내용만 저장합니다.
HEAD가 가리키는 커밋을 기반으로 사진을 찍고
스테이지 영역과 비교하여 새로운 커밋으로 기록합니다.
빠르게 버전과의 차이점을 기록하고 용량을 적게 사용합니다.
파일이 수정되면 파일은 modified상태가 되고
add명령어를 통해 스테이지에 등록한 후 커밋을 진행합니다.
commit명령어를 통해 커밋을 할 수 있습니다.
깃은 HEAD와 스테이지 영역간 차이를 비교하여 새로운 객체를 생성한 후 그 객체를 깃 저장소에 기록합니다.
git commit명령어를 입력하면 vi와 같은 에디터를 통해 해당 커밋에 대한 메세지를 작성할 수 있습니다.
git commit -a를 사용하여 add와 commit을 함께 이용할 수 있습니다.
다만 -a명령어는 이미 tracked된 파일에 대해서만 추가되고
untracked상태인 파일은 별도로 git add명령어를 통해서 등록해야합니다.
커밋을 한 경우 워킹트리가 정리되고
git status명령어 입력시 working tree clean라는 문구를 확인할 수 있습니다.
git log를 이용해 커밋의 기록을 확인할 수 있습니다.
최신 커밋부터 내림차순으로 나열됩니다.
$ git checkout -- 수정된파일이름
혹은
$ git restore 수정된파일이름
$ git commit -am "커밋메세지"
am옵션을 사용하면 add후 한줄 메세지를 바로 작성할 수 있습니다.
단, untracked파일은 add되지 않으므로 주의해야합니다.
--allow-empty-message 옵션을 사용하면 메시지 없는 커밋을 작성할 수 있습니다.
$ git commit --allow-empty-message -m ""
amend옵션을 사용하면 직전 커밋의 메세지를 수정할 수 있습니다
$ git commit --amend
혹은
$ git commit --amend -m "메세지"
커밋 아이디는 40자리 hexa로 커밋을 구분합니다.
40자리 hexa키를 단축하여 앞쪽 7자만으로도 충분히 중복을 방지할 수 있습니다.
pretty=short옵션을 통해 커밋의 제목만 보이게끔 로그를 확인할 수 있습니다.
git log --pretty=short
show명령어를 통해 특정 커밋의 상세정보를 확인할 수 있습니다.
$ git show 커밋ID
전체 커밋이 아닌 특정 파일의 로그를 볼 수 있습니다.
$ git log index.html
그 외 옵션들
-p : diff를 포함하여 출력
--stat : 히스토리 출력
--pretty=oneline : 커밋을 한줄로 표기
커밋간의 차이를 확인할 수 있습니다.
워킹 디렉토리와 스테이지영역간을 비교
(파일 수정 후 아직 git add .를 하지 않았을 때)
$ git diff
git add 실행 후 다시 git diff를 하면 아무것도 출력되지 않습니다.(스테이지와 워킹디렉토리를 비교하기때문)
최신 커밋과 스테이지영역간을 비교
(수정 후 add는 하였으나 아직 커밋하지 않은 경우)
$ git diff head
HEAD는 가장 마지막 커밋의 위치를 가리키는 값으로, 해당 커밋과 스테이지영역을 비교합니다.