커밋(Commit)

코드의 변화

깃의 버전관리 : 개발 중인 코드의 이력을 남길 수 있다. 특정 시점으로 돌아갈 수 있다.

파일 관리 방법

깃의 커밋은 새로 변경된 부분만 추출하여 저장. 시간에 따라 변하는 내용만 관리하고 코드가 변화된 시간 순서에 따라서 영구적으로 저장.

새 파일 생성 및 감지

새 파일 생성

dk@Chiptune git-study % mkdir gitstudy04
dk@Chiptune git-study % cd gitstudy04 
dk@Chiptune gitstudy04 % git init
힌트: Using 'master' as the name for the initial branch. This default branch name
힌트: is subject to change. To configure the initial branch name to use in all
힌트: of your new repositories, which will suppress this warning, call:
힌트: 
힌트: 	git config --global init.defaultBranch <name>
힌트: 
힌트: Names commonly chosen instead of 'master' are 'main', 'trunk' and
힌트: 'development'. The just-created branch can be renamed via this command:
힌트: 
힌트: 	git branch -m <name>
/Users/dk/Documents/git-study/gitstudy04/.git/ 안의 빈 깃 저장소를 다시 초기화했습니다

해당 폴더 내에 index.htm 샘플 파일을 생성

깃에서 새 파일 생성 확인

dk@Chiptune gitstudy04 % git status
현재 브랜치 master

아직 커밋이 없습니다

추적하지 않는 파일:
  (커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)
	index.htm

커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다 (추적하려면 "git
add"를 사용하십시오)

워킹 디렉토리에 추적하지 않는 파일(untracked files)에 표시됨. 이는 새로운 파일이 등록 됨을 알려주고 있음.

소스트리에서 새 파일 감지

Untitled

소스트리에서 대기 중인 파일 항목에서 새로 추가된 파일을 확인할 수 있다.

GUI로 표현되고 있지만 실상은 프로그램에서 git status 명령을 실행하여 보여주는 것.

깃에 새 파일 등록

커밋을 하려면 파일의 상태가 추적 가능해야 함.

새로 추가된 untracked 상태의 파일을 추적 가능하게 하는 것이 등록.

워킹 디렉터리는 작업을 위한 일종의 샌드박스와 같다.

스테이지에 등록

등록이란 워킹 디렉터리에 있는 파일을 스테이지 영역으로 복사하는 것. 실제로는 파일을 복사하는 것이 아니라 논리적으로 기록을 변경하는 것임.

unstage 파일들은 커밋할 수 없음.

  • 명령어로 등록 : add 명령어
# index.htm 을 tracked 상태로 변경
git add index.htm

# . 을 사용하면 전체 파일과 폴더를 등록 가능
git add .
  • 소스트리에서 등록

    Untitled

  • 스테이지에 올리기 버튼을 통해 추적 가능하도록 변경

    Untitled

  • 추적 가능하도록 스테이지에 올린 상태

파일의 추적상태 확인

dk@Chiptune gitstudy04 % git status
현재 브랜치 master

아직 커밋이 없습니다

커밋할 변경 사항:
  (스테이지 해제하려면 "git rm --cached <파일>..."을 사용하십시오)
	새 파일:       index.htm

dk@Chiptune gitstudy04 %

커밋할 변경 사항에 새 파일로 올라와 있음을 확인 가능.

파일 등록 취소

스테이지 영역에서만 등록된 파일 삭제

# 스테이지의 캐시 목록에서 해당 파일 삭제
dk@Chiptune gitstudy04 % git rm --cached index.htm
rm 'index.htm'
dk@Chiptune gitstudy04 % git status
현재 브랜치 master

아직 커밋이 없습니다

추적하지 않는 파일:
  (커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)
	index.htm

커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다 (추적하려면 "git
add"를 사용하십시오)
dk@Chiptune gitstudy04 %

만약 커밋을 했는데, 스테이지에서 해당 파일을 삭제하는 경우

dk@Chiptune gitstudy04 % git status
현재 브랜치 master
커밋할 변경 사항:
  (use "git restore --staged <file>..." to unstage)
	삭제함:        index.htm

추적하지 않는 파일:
  (커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)
	index.htm

dk@Chiptune gitstudy04 %

이 때는 리셋(reset)으로 삭제한 후, 정리를 해주어야 한다.

dk@Chiptune gitstudy04 % git reset HEAD index.htm
dk@Chiptune gitstudy04 % git status
현재 브랜치 master
커밋할 사항 없음, 작업 폴더 깨끗함
dk@Chiptune gitstudy04 %

등록된 파일 이름이 변경 되었을 때

깃에서 파일 이름을 변경할 때 mv 명령어를 사용

$ git mv 파일이름 새파일이름

등록된 파일의 이름을 바꾸어 본다.

dk@Chiptune gitstudy04 % git mv index.htm home.htm
dk@Chiptune gitstudy04 % git status
현재 브랜치 master
커밋할 변경 사항:
  (use "git restore --staged <file>..." to unstage)
	이름 바꿈:     index.htm -> home.htm

dk@Chiptune gitstudy04 %

내부적으로는 해당 명령을 풀면 mv 후, 기존 파일을 rm 하고, 새 파일을 add 하는 것과 같다.

첫번째 커밋

깃에는 HEAD라는 포인터 개념이 있다. 헤드는 커밋을 가리키는 묵시적 참조 포인터이다.

새로운 커밋은 이전 부모 커밋을 기반으로 새로운 커밋을 만든다. HEAD는 최종적인 커밋 작업 위치를 가리킨다.

스냅샷

커밋은 파일 변화를 깃 저장소에 영구적으로 기록. 파일에서 변경된 부분을 찾아 수정된 내용을 저장하는 방식을 스냅샷이라고 함.

스냅샷은 HEAD가 가리키는 커밋을 기반으로 함. 빠르게 버전의 차이점을 처리하고 용량을 적게 사용.

파일 상태와 커밋

파일을 커밋하려면 반드시 tracked 상태로 변경해주어야 함.

워킹 디렉토리가 깨끗하게 정리되어 있지 않으면 커밋 명령을 수행할 수 없음.

  • 명령어로 커밋 : commit

깃의 커밋은 HEAD와 스테이지 영역 간의 차이를 비교하여 새로운 객체를 생성한다.

생성된 객체를 깃 저장소에 기록한다.

  • 커밋 메세지

커밋을 할 때 구별할 수 있는 메세지를 같이 작성해야 함.

커밋은 파일 이름을 여러 개 사용하지 않고 하나만 가진다.

모든 커밋은 반드시 커밋 메세지를 작성해야 한다. (아니면 구분 못함)

  • 파일 등록과 커밋을 동시에 하는 방법
# 커밋을 하기 전에 자동으로 모든 파일을 등록하는 과정을 수행.
git commit -a 

커밋 확인

스테이지 초기화

커밋을 하면 working tree clean 메세지 → 스테이지 영역이 초기화 됨을 의미

로그 기록 확인

최신 커밋 기록부터 내림차순으로 나열

dk@Chiptune gitstudy04 % git log
commit 25e213f01db70b974910b3c15177c926b73dd306 (HEAD -> master)
Author: Chiptune93 <eoen012@gmail.com>
Date:   Sun Jun 11 03:18:42 2023 +0900

    commit
dk@Chiptune gitstudy04 %

두번째 커밋

파일 수정

파일 변경사항 확인

dk@Chiptune gitstudy04 % git status
현재 브랜치 master
커밋할 변경 사항:
  (use "git restore --staged <file>..." to unstage)
	수정함:        index.htm

수정된 파일 되돌리기

바로 이전 커밋으로 되돌리는 명령, 이전 커밋 이후 수정했던 내용은 전부 삭제된다.

git checkout -- 수정파일이름

스테이지에 등록

기존 파일은 수정되면 modified 상태로 변경됨

파일이 수정되면 반드시 add 명령어로 스테이지 영역에 재등록 해야 함

두번째 커밋

git commit -m “커밋 메세지”

-am 옵션을 통해 파일 등록과 한 줄 짜리 커밋 메세지 등록을 빠르게 처리함.

dk@Chiptune gitstudy04 % git commit -am "first"
[master ba79b88] first
 1 file changed, 1 insertion(+), 1 deletion(-)

두번째 커밋 확인

깃허브에서 확인

메세지가 없는 빈 커밋

빈 커밋을 작성하는 방법

git commit --allow-empty-message -m ""

방금 전에 작성한 커밋 메세지를 수정하는 방법

git commit --amend

위 명령을 입력하면, 직전 커밋 메세지를 에디터로 띄워 수정할 수 있게끔 함.

커밋 아이디

SHA1

커밋 아이디는 SHA1 이라는 해시 알고리즘을 사용.

중복되지 않는 고유 키를 생성할 수 있다.

단축키

해시의 앞쪽 7자 만으로 중복을 방지하면서 전체 키 값을 사용할 수 있다.

커밋 로그

간략 로그

# 첫번째 줄의 커밋 메세지만 출력
git log --pretty=short

# 특정 커밋의 상세정보를 확인
git show 커밋ID

특정 파일의 로그

git log index.htm

# diff 기능을 같이 포함하여 출력
git log -p

# 히스토리를 출력
git log --stat

# 각 커밋을 한줄로 출력
git log --pretty=oneline

diff 명령어

커밋 간 차이를 확인.

파일 간 차이

워킹 디렉터리 vs 스테이지 영역

add 명령어로 파일을 추가하지 않은 경우 워킹 디렉터리와 스테이지 영역 간 변경 사항을 비교할 수 있음.

dk@Chiptune gitstudy04 % git diff
diff --git a/index.htm b/index.htm
index cd886dc..40dd216 100644
--- a/index.htm
+++ b/index.htm
@@ -7,6 +7,5 @@
     <title>Document</title>
 </head>
 <body>
-    <h1>Hello Git World!</h1>
 </body>
 </html>
\ No newline at end of file
dk@Chiptune gitstudy04 %

커밋 간 차이

스테이지 영역에 있는 수정 파일을 커밋하지 않은 경우, 최신 커밋과 변경 내용을 비교할 수 있음

dk@Chiptune gitstudy04 % git diff HEAD
diff --git a/index.htm b/index.htm
index 40dd216..cd886dc 100644
--- a/index.htm
+++ b/index.htm
@@ -7,5 +7,6 @@
     <title>Document</title>
 </head>
 <body>
+    <h1>Hello Git World!</h1>
 </body>
 </html>
\ No newline at end of file

diff 내용을 추가하여 커밋

커밋 메세지를 작성할 때 -v 옵션을 사용하여 에디터에서 diff 내용을 추가할 수 있음.


© 2024. Chiptune93 All rights reserved.