커밋

Violet_Evgadn·2023년 9월 2일
0

Git

목록 보기
4/33

커밋

커밋이란?

아마 Git을 대충 배우고 사용했던 사람이라면 커밋을 "명령어" 정도로만 알고 있을 것이다.

하지만 Git에서 커밋은 사실 "파일의 형태" 중 하나이다.

이전 Section에서 .git 폴더를 설명하며 3가지 파일 형태를 설명했고, 그 중 "Commit 파일"이 있음을 기억할 것이다.

Git에서의 Commit은 "파일의 변경이나 추가 시 생성되는 버전"을 의미한다.
그리고 우리가 흔히 "커밋을 한다"라고 표현하는 행동은 이러한 "버전 정보 파일을 생성한다"와 동일한 의미이다.

"Hello"를 "Hello World"로 변경한 뒤 커밋했다면 이는 "Hello World"라는 내용을 저장한 파일에 대하여 새롭게 버전 정보를 생성하는 과정이라고 보면 된다.

커밋을 수행하면 현재 버전의 작업물이 저장된 커밋 객체가 생성되고 이 커밋 객체에는 부모 커밋(Parent Commit; 이전 버전)에 대한 참조 정보가 객체에 저장된다.
정리하자면 커밋이 수행될 경우 커밋을 구성하는 파일 객체와 부모 커밋에 대한 정보를 저장하고 있는 커밋이 생성되고 커밋이 부모 커밋을 가리키며 마치 LinkedList 형식으로 버전 관리가 수행되는 것이다.

스테이징

커밋을 하기 위해선 먼저 git add 명령어를 통해 Index(Staging Area)에 작업 파일을 등록할 필요가 있다.

커밋은 파일의 변경이나 추가가 수행될 때 새로운 버전 정보를 의미한다.
그렇다면, 커밋 시 어떻게 이 파일이 없었다가 추가되었는지 혹은 이전 파일과 비교했을 때 변경점이 있는지 알 수 있을까?

Git에서는 "Staging Area"라는 곳에 파일들의 이전 상태를 저장해 두고 있다.
그리고 이 Staging Area의 파일과 현재 파일을 비교한다면 파일의 수정 / 추가 / 삭제를 파악할 수 있는 것이다.

만약 Staging Area에는 없는데 현재 작업 폴더(Working Directory)에 존재하는 파일이라면 "추가돼야할 파일"이 될 것이다.
반대로 Staging Area에는 있는 Working Directory에 없다면 "삭제된 파일"이다.
마지막으로 Staging Area와 Working Directory에 동시에 존재하지만, 두 파일이 동일하지 않다면 어딘가 변경점이 있다는 것이고, 이는 "변경된 파일"임을 알 수 있다.

즉, Git은 "Staging Area에 저장된 파일"과 "현재 파일"을 비교함으로써 버전 관리를 수행하는 툴이라고 할 수 있다.

이 Git의 Staging Area에 작업 파일을 등록하는 것을 git add 명령어를 통해 수행할 수 있으며, 이 과정은 깃 스테이지에 파일을 올린다는 의미로 "스테이징"이라고도 한다.

그리고 이 Staging Area에 등록된 변경된 파일들을 HEAD 에 적용하면 내가 변경시켰던 내용이 로컬 저장소에 저장될 것이고, 이를 우리는 "커밋"이라고 하는 것이다.
즉, Staging Area 측면에서 봤을 때 커밋이란 "Staging Area에 저장된 변경된 파일 내용을 HEAD에 적용해 새로운 버전 정보를 만들어 내는 과정"이라고 볼 수 있는 것이다.

이제 왜 Commit을 수행하기 전 git add를 해야 하는지 알 수 있을 것이다.
Commit은 Staging Area 파일을 HEAD에 적용하는 과정이므로 만약 git add로 Staging Area에 변경 사항을 등록해 놓지 않았다면 Staging Area에 등록된 파일들은 HEAD가 가리키고 있는 버전의 파일과 동일할 것이므로 변경 사항이 저장되지 않을 것이다.

Staging Area를 만든 이유

내가 2가지 업무를 동시 수행하고 있다고 가정하자.
1개는 장기 프로젝트로 기능 T를 새로 개발하는 것이고, 하나는 단기 프로젝트로 고객의 요구사항 C를 개발하는 것이다.

만약 Staging Area 없이 바로 Working Directory에 대해 커밋을 수행한다면 git commit을 통해 T에 대한 작업 내용과 C에 대한 작업 내용이 모두 커밋 되어 버릴 것이다.

이 경우 협업하는 다른 팀원 입장에서는 이번에 최신화한 파일 중 어떤 코드가 T에 대한 코드이고, 어떤 코드가 C에 대한 코드인지 알 수 없다.
즉, 협업이 어려워지는 것이다.

이런 상황을 대비하여 Git은 일부 파일만 Commit할 방법을 찾아야만 했다.
그리고 이 방법이 바로 "Staging Area"인 것이다.

Git 사용자는 커밋을 원하는 일부 파일들만 git add 명령어를 통해 스테이징 할 수 있다.
Git은 Staging Area와 HEAD를 비교한 뒤 변경 사항을 적용하기 때문에 결과적으로 최신화를 원하는 일부 파일만 커밋 할 수 있게 되는 것이다.

즉, 최신화를 원하는 일부 파일만 공유하기 위하여 커밋 할 내용을 선별해야 했고 이 때문에 Staging Area라는 개념을 도입한 것이다.


커밋 만들기

1. Github 계정 정보 등록

버전 관리를 수행할 Github 계정에 대한 정보를 먼저 등록시켜줘야 한다.

방법은 아래와 같다.

git config --global user.email "[Github 계정 E-mail]"
git config --global user.name "[Github 계정 이름]"

2. Staging(스테이징)

Untracked File을 Staging Area에 등록시키는 과정으로 위에서 말했듯 git add 명령어를 통해 원하는 파일을 스테이징 할 수 있다.

우리는 이전에 로컬 디렉터리로 설정했던 폴더 내에 존재하는 "README" 파일을 스테이징 해볼 것이다.

git add [Staging을 원하는 파일]
# git add [파일1] [파일2]... 처럼 입력하여 
# 여러 파일을 한번에 Staging 할수도 있음

추가로 git add . 명령어를 통해 Working Tree에서 변경 및 추가된 파일들을 모두 Staging 시킬 수도 있으며 자신의 모든 작업물을 커밋 시키고 싶은 경우 굳이 파일명을 하나하나 입력하여 add 시키지 말고 이 방법을 사용하는 것이 좋다.

3. 스테이징이 제대로 되었는지 확인

git status

사진에서 "README.txt" 파일이 Commit 될 수 있는 상태가 되었음을(즉, Staging 된 상태임을) 알 수 있다.

4. 커밋

git commit -m [커밋 메시지]

Option

  • -m [메시지] : 커밋 메시지와 같이 커밋함
    • 협업에서는 특정 커밋이 어떤 의미를 가졌는지 파악하는 것이 매우 중요하다. 따라서 항상 커밋을 수행할 때 해당 커밋이 어떤 이유로 수행된 것인지 꼭 메시지로 명시해 주자.
  • -a : git add 명령어 없이 Staging Area에서 추적할 수 있는 모든 파일들에 대한 변경 사항을 파악한 뒤 git addgit commit을 자동으로 진행
    • "Staging Area"에 존재하는 파일들에 대해서만 변경 사항을 파악할 수 있으므로 새로 추가된 Untracked 파일들에 대해서는 커밋 되지 않을 것이다.

5. 커밋 여부 확인

git log

지금까지 개발자가 만든 커밋들을 확인할 수 있는 명령어이다.
git log 명령어는 "최신 커밋"부터 보여준다는 것을 주의하자.

profile
혹시 틀린 내용이 있다면 언제든 말씀해주세요!

0개의 댓글