육감적 코딩

[Git 교과서]4장. 커밋 본문

정리/Git

[Git 교과서]4장. 커밋

감감감감감감 2021. 11. 21. 18:45

4.1 코드의 변화

깃은 개발 중인 코드의 이력을 만들 수 있습니다. 깃이 코드 변화를 기록하는 것을 커밋(commit)이라고 합니다.

4.1.1 파일 관리 방법

보통 우리는 의미 있는 변경을 할 때 파일을 복사합니다.

그리고 복사한 새 파일에는 추가하거나 변경하고 싶은 내용을 적용합니다.

이 방식에는 부작용이 있습니다. 모든 내용이 중복되기 때문에 용량도 많이 차지합니다.

4-1

반면, 깃의 커밋은 새로 변경된 부분만 추출하여 저장합니다.

4-2

개발자 입장에서는 여러개의 파일보다는 파일 하나로 모든 이력을 처리하기 때문에 유용합니다.

4.2 새 파일 생성 및 감지

4.2.1 새 파일 생성

$ mkdir gitstudy04 ----- 새 폴더 만들기
$ cd gitstudy04  ----- 만든 폴더로 이동
$ git init ---- 저장소를 깃으로 초기화

Initialized empty Git repository in C:/Users/Jeong/gitstudy04/.git/

$ code index.html ---- 파일 작성

index.htm

<!DOCTYPE>
<html>
<head>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Page Title</title>
</head>
<body>

</body>
</html>

이렇게 파일을 생성하면 워킹 디렉터리에 index.htm 이름으로 저장됩니다. 모든 작업은 워킹 디렉터리 안에서 진행됩니다.

4.2.2 깃에서 새 파일 생성 확인

워킹 디렉터리에 새 파일이 추가되면 깃은 변화된 상태를 자동으로 감지합니다. 깃 상태를 확인할 수 있는 명령어는 status 입니다.

$ git status

4-3

깃 배시 터미널로 실행하면 추적되지 않은 파일은 빨간색으로 표시합니다. "Untracked files" 메시지는 워킹 디렉터리에 새로운 파일이 등록되었다고 알려 주는 것입니다.

4.3 깃에 새 파일 등록

깃의 워킹 디렉터리에 새 파일이 생성되었습니다. 워킹 디렉터리에 있는 파일은 자동으로 추적 관리하지 않습니다. 커밋을 하려면 파일의 상태가 추적 가능해야 합니다.

워킹 디렉터리에 untracked 상태의 파일을 추적 가능 상태로 변경하는 것을 등록 이라고 합니다.

파일을 등록하면 워킹 디렉터리의 파일이 스테이지 영역에 추가됩니다.

스테이지 영역의 관리 목록에 추가된 파일만 깃에서 이력을 추적할 수 있습니다.

4.3.1 스테이지에 등록

등록이란 워킹 디렉터리에 있는 파일을 스테이지 영역으로 복사하는 것을 의미합니다.

여기서 '복사'는 실제 파일을 복사 하는것이 아닌, 깃 내부에서 논리적인 기록을 변경하는 과정일 뿐입니다.

명령어로 등록: add 명령어

깃의 add 명령어는 워킹 디렉터리의 파일을 스테이지 영역으로 등록합니다.

깃은 안정적인 커밋을 할 수 있도록 add 명령어를 기준으로 이전과 이후 단계를 구별합니다.

$ git add index.htm  ------ $ git add 파일이름 
                                        -------- 스테이지에 등록

4-4

스테이지 영역에 파일이 등록되면 파일은 tracked 상태로 변경됩니다.

단 , 빈 폴더는 스테이지 영역에 등록할 수 없습니다.
폴더 안에 파일이 하나 이상 있어야 등록이 가능합니다.

4.3.2 파일의 추적 상태 확인

콘솔창에 status 명령어를 사용하여 등록 상태를 확인해 보겠습니다.

$ git status 

4-5

new file 메시지는 스테이지 영역에 정상적으로 등록했다는 의미입니다.

4.3.3 파일 등록 취소

tracked 상태의 파일을 untracked 상태로 변경해 보겠습니다.

unstage 상태로 변경하려면 삭제(rm)나 리셋(reset) 명령어를 사용합니다.

4-6

rm 명령어로 삭제해 보겠습니다. 스테이지 영역에서만 등록된 파일을 삭제하려고 —cached 옵션을 함께 사용합니다.

$ git rm --cached index.htm
rm 'index.htm'

다시 status 명령어를 실행하여 확인합시다.

$ git status 

4-7

등록하기 이전의 untracked 상태로 변경되었습니다.

한 번이라도 커밋을 했다면 reset 명령어를 사용해야 합니다.

예를 들어 커밋한 index.htm 파일을 rm 명령어로 삭제했다고 합시다.

삭제한 후 status 명령어를 실행하면 이전과 다른 결과가 나옵니다.

$ git add index.htm
$ git commit -m 'inddex.htm commit'
$ git rm --cached index.htm

4-8

파일이 untracked 상태가 되고, 스테이지 영역에서 파일이 삭제 처리됩니다.

커밋 후 삭제는 파일이 삭제 또는 변화된 것으로 간주합니다. 따라서 커밋된 파일은 리셋으로 삭제한 후 정리해 주어야 합니다.

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

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

깃의 git mv 명령어를 여러 단계의 명령으로 풀면 다음과 같습니다.

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

4.4 첫 번째 커밋

지금까지 한 작업은 커밋의 준비 작업들 입니다.

4.4.1 HEAD

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

4-9

새로운 커밋은 부모 커밋을 기반으로 새로운 커밋을 만듭니다.

HEAD는 커밋이 변화한 최종 시점을 의미합니다.

4.4.2 스냅샷

깃은 파일에서 변경된 부분을 찾아 수정된 내용만 저장합니다.

마치 변화된 부분만 찾아 사진을 찍는 것과 같다고 하여 스냅샷 방식이라고 합니다.

깃의 스냅샷은 HEAD가 가리키는 커밋을 기반으로 스테이지 영역과 비교하여 새로운 커밋으로 기록합니다.

4.4.3 파일 상태와 커밋

커밋하기 전에 status 명령어로 항상 상태를 확인하는 습관이 필요합니다. 워킹 디렉터리가 깨끗하게 정리되어 있지 않으면 커밋명령어를 실행할 수 없습니다.

커밋은 수정된 내용을 한 번만 등록합니다.
스테이지 영역의 파일이 변경되지 않았다면 커밋을 두 번 실행할 수 없습니다. 깃은 스테이지 영역의 변경된 내용을 기준으로 스냅샷을 만들어 커밋하기 때문입니다.

정리
새파일 생성 → untracked 상태
tracked 상태의 파일 변경 → modified상태이자 untracked 상태
변경이후 재 등록 → tracked 상태

  • 기본적으로 tracked 상태여야 커밋 가능.

명령어로 커밋: commit 명령어

$ git commit

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

커밋 메시지

깃은 변화된 객체를 구별하고자 메시지 시스템을 도입했습니다.

모든 커밋은 반드시 커밋 메시지를 작성해야 합니다

커밋 할때 단독으로 명령어를 입력하면 커밋 메시지 작성을 요구하며, 메시지를 작성할 수있는 화면이 나옵니다.

파일 등록과 커밋을 동시에 하는 방법

$ git commit -a

-a 옵션은 커밋을 하기 전에 자동으로 모든 파일을 등록하는 과정을 미리 수행합니다.

4.5 커밋 확인

4.5.1 스테이지 초기화

커밋을 하면 스테이지 영역은 초기화됩니다.

4.5.2 로그 기록 확인

$ git log

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

4.6 두 번째 커밋

이번에는 내용을 수정하고 수정된 내용을 두 번 커밋하는 실습을 하겠습니다.

4.6.1 파일 수정

index.htm 파일을 수정합니다.

<!DOCTYPE>
<html>
<head>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Page Title</title>
</head>
<body>
        <h1>hollo GIT world!</h1>
</body>
</html>

4.6.2 파일 변경 사항 확인

$ git status

4-10

처음 파일을 생성했을 떄는 new file: index.htm 메시지를 보았습니다.

수정 후에는 modified: index.htm 메시지를 확인 할 수있습니다.

4.6.3 수정된 파일 되돌리기

파일을 수정 전 상태로 되돌리려면, 바로 전 커밋으로 되돌리면 됩니다.

$ git checkout -- 수정파일이름

수정 파일을 되돌리면 이전 커밋 이후에 작업한 수정 내역은 모두 삭제합니다.

4.6.4 스테이지에 등록

4-11

  1. 기존 파일을 수정하면 modified 상태로 됩니다.
  2. 파일이 수정되면 add 명령어로 스테이지 영역에 재등록 해야합니다.
  3. 스테이지 영역에 등록된 내용을 커밋합니다.
$ git add index.html
$ git status

4.6.5 두 번째 커밋

-m 옵션을 사용하여, 커밋과 동시에 간단하게 한 줄짜리 커밋 메시지도 작성할수 있습니다.

$ git commit -m "커밋메시지"

-m 옵션, -a 옵션

커밋옵션 -a와 -m 을 같이 사용할 수도 있습니다.

$ git commit -am "커밋메시지"

4.7 메시지가 없는 빈 커밋

4.7.1 세 번째 커밋

index.htm 을 수정해 줍니다.

<!DOCTYPE>
<html>
<head>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>JEONGGIT</title>
</head>
<body>
        <h1>hollo GIT world!</h1>
</body>
</html>

수정 후 스테이지 영역에 재등록 합니다.

—allow-empty-message 옵션

메시지가 없는 빈 커밋을 작성하려면 —allow-empty-message 옵션을 사용합니다.

$ git commit --allow-empty-mesaage -m ""

4.8 커밋 아이디

각 커밋에는 이상한 영문과 숫자가 있습니다. 이를 커밋 아이디 라고합니다. 커밋 아이디는 특정 커밋을 가리키는 절대적 이름이고, 명시적 참조 값입니다. (git log 로 확인 가능)

4.8.1 SHA1

커밋 아이디가 이런 이유는 SHA1 이라는 해시 알고리즘을 사용하기 때문입니다. SHA1 해시는 중복되지않은 고유의 키를 생성할 수 있는 장점이 있습니다.

4.9 커밋 로그

4.9.1 간략 로그

—pretty=short 를 사용하여 로그를 출력할 때 첫 번째 줄의 커밋 메시지만 출력합니다.

$ git log --pretty=short

특정 커밋의 상세 정보를 확인하고 싶다면 show 명령어를 사용합니다.

$ git show 커밋ID

4.9.2 특정 파일의 로그

특정 파일 로그 기록만 보고싶으면 log 명령어 뒤에 파일 이름을 적어주면 됩니다.

$ git log 파일이름

log 명령어의 여러 옵션
-p : diff기능을 포함하여 출력
—stat : 히스토리를 출력
—pretty=oneline : 각 커밋을 한 줄로 출력

4-12

4.10 diff 명령어

4.10.1 파일 간 차이

커밋을 기준으로 파일들의 수정 이력을 비교해 볼 수 있는 diff 기능이 있습니다.

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

워킹 디렉터리와 스테이지 영역 간 변경 사항을 비교할 수 있습니다.

index.htm 파일을 수정합니다.

<!DOCTYPE>
<html>
<head>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>JEONGGIT</title>
</head>
<body>
        <h1>hollo GIT world!</h1>
        <h2>깃을 이용하면 소스의 버전 관리를 쉽게 할 수 있습니다.</h2>
</body>
</html>
$ git diff

4-13

워킹 디렉터리와 스테이지 내용의 차이점을 출력합니다.

4.10.3 커밋 간 차이

최신 커밋과 변경 내용을 비교하여 볼 수 있습니다.

$ git diff head

HEAD는 가장 마지막 커밋의 위치를 가리키는 값입니다. HEAD를 이용하면 최신 커밋과 이전 커밋을 비교하여 출력할 수 있습니다.

'정리 > Git' 카테고리의 다른 글

[Git 교과서]7장. 임시 처리  (0) 2021.11.30
[Git 교과서]6장. 브랜치  (0) 2021.11.23
[Git 교과서]5장. 서버  (0) 2021.11.21
[Git 교과서]3장. 깃 개념 잡기  (0) 2021.11.12
[Git 교과서]1장. 깃과 버전 관리  (0) 2021.11.12
Comments