이번 시간에는 Git에서 파일들을 관리하기 위해 사용하는 개념인 작업 트리와 지역 저장소에 커밋을 남기고 원격 저장소에 등록하는 과정에 대해서 알아보겠습니다.
깃은 작업 트리(working tree)라는 개념을 사용해 파일을 관리한다. 작업 트리란 깃이 추적(관리)하는 파일과 추적하지 않는 파일을 구분하고, 추적하는 파일들의 상태를 구분짓는 영역을 말한다.
작업 트리에는 3가지 영역이 존재한다.
작업 디렉터리에서 작업 중인 파일을 git add 명령어로 스테이징 영역에 올려 깃이 추적하는 파일로 등록하고, 스테이징 영역에서 식별된 파일들을 git commit 명령어를 이용하여 지역 저장소에 등록한다.
깃에서 관리하는 파일은 Untracked와 Tracked 상태로 나뉜다. 현재 작업 중인 작업 디렉터리에서 새로 생성된 파일은 Untracked 상태가 된다.
git status 명령어로 프로젝트의 현재 파일 상태를 확인할 수 있다.
git status
지난 시간에 작성했던 .gitignore 파일이 Untracked 상태인 것을 확인할 수 있다.
해당 파일을 커밋에 포함할 파일로 등록하고 싶다면 git add 명령어를 사용하면 된다.
git add "파일명" # 커밋할 파일을 등록
git add . # 모든 변경사항을 반영
git add 명령어를 실행한 후, git status 명령어로 상태를 확인해본 결과이다. "Changes to be committed"는 해당 파일이 Tracked 상태이며 스테이징 영역에서 커밋으로 기록될 준비가 되었다는 뜻이다.
한 번 스테이징 영역에 추가된 파일은 수정 여부에 따라 Unmodified 상태와 Modified 상태로 나뉜다.
예를 들어,
1. 현재 프로젝트에서 새 파일을 생성하고 내용을 작성 -> 작업 디렉터리의 Untracked 상태
2. git add 명령어로 해당 파일을 등록 -> 스테이징 영역의 Tracked 및 Unmodified 상태
3. 해당 파일을 수정 -> 스테이징 영역에 존재, Tracked 및 Modified 상태
4. 코드 수정 완료 후 git add 명령어로 해당 파일 재등록 -> Tracked 및 Unmodified 상태
깃에서 커밋은 의미있는 변화(기능 추가/수정 등의 변경 이력)에 대해 기록하는 것을 말한다. 커밋한 내용들은 깃이 추적하며 버전 관리를 할 수 있도록 도와준다.
스테이징 영역에 등록된 내용에 대해 커밋을 생성하려면 git commit 명령어를 사용해야 한다.
git commit # 에디터에서 커밋 메시지를 더 자세하게 작성하는 경우
git commit -m "작성할 내용" # -m 뒤에 간단하게 작성하는 경우
git log 명령어를 사용하면 현재 작업하는 브랜치의 커밋 로그를 확인할 수 있다.
git log
첫번째 줄에는 커밋을 식별하는 고유한 데이터 단위인 커밋 체크섬이 있다.
그 밑으로는 작성자, 커밋 작성 시간, 커밋 메시지를 확인할 수 있다.
체크섬 옆에 (HEAD -> main) 이것이 의미하는 것은?
깃에는 HEAD라는 특별한 포인터가 존재한다. HEAD 포인터는 현재 작업하는 브랜치의 최종 커밋을 가리킨다. (HEAD -> main)은 HEAD 포인터가 main 브랜치를 가리키고 있다는 의미.
git log 에는 다양한 옵션들이 있다.
작업을 하다 커밋을 잘못 생성한 경우, git commit --amend 명령어를 통해 커밋을 수정한다. 커밋 메시지를 수정하고 다시 저장하면 마지막 커밋 메시지가 수정된다.
git commit --amend # 에디터 화면에서 수정
git commit --amend -m "수정할 메세지" # -m 뒤에 간단하게 작성하는 경우
git commit --amend --no-edit # 커밋 메세지는 수정하지 않고 추가 변경 내용만 기존 커밋에 반영
git commit --amend --author "username <email>" # 커밋 작성자 수정
커밋을 푸쉬한다는 것은 지역 저장소에 있는 커밋들을 원격 저장소에 등록한다는 의미이다.
지난 시간에 git remote add 명령어로 등록한 원격 저장소로 커밋들을 푸쉬해보자.
git push {저장소} {브랜치}
git push origin main
origin은 특정 원격 저장소를 식별하는 이름, main은 특정 브랜치 이름이다. 즉, 해당 명령어는 origin 이라는 특정 원격 저장소에 지역 저장소의 main 브랜치 커밋을 등록한다는 의미이다.
(브랜치에 대해선 다음 시간에 살펴보도록 하자)
이렇게 지역 저장소의 커밋들을 원격 저장소에 등록했다. 변경 내역은 원격 저장소에 반영되며 깃허브에서 확인할 수 있다.
Reference
https://www.yes24.com/Product/Goods/103525595
https://velog.io/@khakhid/%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EA%B9%83%EA%B9%83%ED%97%88%EB%B8%8C
https://inpa.tistory.com/entry/GIT-%E2%9A%A1%EF%B8%8F-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0-init-add-commit
https://inpa.tistory.com/entry/GIT-%E2%9A%A1%EF%B8%8F-%EA%B9%83%ED%97%99-%EC%9B%90%EA%B2%A9-%EC%A0%80%EC%9E%A5%EC%86%8C-%EA%B4%80%EB%A6%AC-git-remote#git_push