기본적인 git 작업 process
실제 예제를 통해서 어떻게 작업이 되는지, 그 때 어떤 커맨드가 사용되는지 설명하도록 하겠다.
git init
git을 사용하려면 저장소(repository)를 먼저 설정해야 한다. 이는 작업 디렉토리에서 다음 명령어를 실행하면 된다.
git init다음은 실 사용 예제이다.
~/git_test> mkdir myproject ✔ │ 11:05:45
~/git_test> cd myproject ✔ │ 11:05:57
~/git_test/myproject> git init ✔ │ 11:06:00
/home/batmask/git_test/myproject/.git/ 안의 빈 깃 저장소를 다시 초기화했습니다
~/g/myproject │ main> ls -la ✔ │ 11:06:09
합계 12
drwxrwxr-x 3 batmask batmask 4096 4월 26 11:06 .
drwxrwxr-x 3 batmask batmask 4096 4월 26 11:05 ..
drwxrwxr-x 6 batmask batmask 4096 4월 26 11:06 .git
~/g/myproject │ main> cd .git ✔ │ 11:06:11
~/g/myproject/.git │ main> ls -la ✔ │ 11:06:14
합계 36
drwxrwxr-x 6 batmask batmask 4096 4월 26 11:06 .
drwxrwxr-x 3 batmask batmask 4096 4월 26 11:06 ..
-rw-rw-r-- 1 batmask batmask 21 4월 26 11:06 HEAD
-rw-rw-r-- 1 batmask batmask 92 4월 26 11:06 config
-rw-rw-r-- 1 batmask batmask 73 4월 26 11:06 description
drwxrwxr-x 2 batmask batmask 4096 4월 26 11:06 hooks
drwxrwxr-x 2 batmask batmask 4096 4월 26 11:06 info
drwxrwxr-x 4 batmask batmask 4096 4월 26 11:06 objects
drwxrwxr-x 4 batmask batmask 4096 4월 26 11:06 refs
~/g/myproject/.git │ main> 먼저 myproject라는 작업 디렉토리를 만들고, 그 안에서 git init 를 실행했다. 폴더안에는 .git 숨김 폴더가 생성되고 그안을 살펴보면, 위와같이 디렉토리들과 파일이 생성된 것을 알 수 있다.
git은 모두 .git 안에 저장되므로, 저 폴더만 제거하면 모든게 날아간다.
git status/add/commit
모든 것에 앞서 한가지만 생각하고 진행하자. git을 포함해 모든 버전관리 시스템(VCS)들은 변경사항 히스토리를 남기는 과정이다. 그 히스토리를 남김으로서 마치 평소에 Ctrl+Z를 사용하듯 언제든지 undo를 한 것처럼 이전 버전으로 되돌렸다가 Ctrl+Shift+Z(또는 Ctrl+Y)처럼 redo를 통해 작업 히스토리간 이동이 가능해진다. 다만, 프로그램 사용시에는 모든 변경사항이 자동으로 히스토리에 남지만, git과같은 VCS 사용시에는 사용자가 직접 특정 시점에 명령어를 통해 기록을 남겨야 한다. 이게 바로 commit 이다.
앞에서 git은 스냅샷으로 작동하기 때문에 commit하기전 중간단계인 staging area가 존재해서 여기에 파일을 추가(add)해놓고 한번에 저장소(repository)에 반영(commit)하게된다고 했다. 즉, git add -> git commit 의 두 단계를 통해 작업한 파일이 repository에 저장된다.

이와함께 항상 함께 사용될 명령어가 있는데, 이것이 바로 git status이다. status는 commit 해야할 변경사항이 있는지, staging area에 뭐가 추가되어 있는지등 정보를 보여준다.
위에서 만든 작업폴더 myproject 안에서 git add/commit 과정에 매번 git status를 실행해보면 어떻게 돌아가는지 알 수 있다. 일단, 간단한 텍스트 파일을 하나 만들고, 이걸 repository에 저장해보자. git init 만 한 상태에서 git status를 실행하면 다음과 같이 표시된다.
~/g/myproject │ main> git status ✔ │ 11:11:15
현재 브랜치 main
아직 커밋이 없습니다
커밋할 사항 없음 (파일을 만들거나 복사하고 "git add"를 사용하면 추적합니다)
~/g/myproject │ main> ✔ │ 11:11:16 vim등 에디터를 이용해 파일을 몇 개 만들어보자. 다음은 예제로 파이썬 파일 하나와 단순 텍스트 파일 하나를 만들었다.
def main():
hello("world")
goodbye("world")
def hello(name):
print(f"hello, {name}")
def goodbye(name):
print(f"goodbye, {name}")
if __name__ == "__main__":
main()Pythonthis is the first file.
file name is 01.txt
I'm studying git.다시 git stuatus를 입력해보자.
~/g/myproject │ main ?2 > git status ✔ │ 11:37:53
...
추적하지 않는 파일:
(커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)
readme.txt
sayings.py
...새로운 내용이 보인다. “추적하지 않는 파일”이라는 말이 나오고 git add에 대한 안내가 나온다. repository에 commit된 파일들은 변경사항들을 계속 추적하게 된다. 즉, 여기서 추적하지 않는 파일이란건, 아직 repository에 추가되지 않은 파일들이란 말이다.
안내대로 git add 를 사용해보자.
~/g/myproject │ main ?2 > git add readme.txt INT ✘ │ 11:41:12
~/g/myproject │ main +1 ?1 > git status ✔ │ 11:43:23
현재 브랜치 main
아직 커밋이 없습니다
커밋할 변경 사항:
(스테이지 해제하려면 "git rm --cached <파일>..."을 사용하십시오)
새 파일: readme.txt
추적하지 않는 파일:
(커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)
sayings.py
git add readme.txt 로 파일 하나만 staging area에 추가했다. “커밋할 변경사항”이 새로 보이며 여기에 우리가 추가한 readme.txt 파일이 표시된다. 이렇게 선택적으로 staging area에 모아놓고 나중에 한번에 repository에 commit하게 된다.
스테이지를 해제하려면 “git rm –cached <파일> … “을 사용하라고 나온다. 실수로 잘못 올라갔거나, 지금 반영하면 안되는 내용일 때, 다시 되돌리는 방법이다. 조심해야 할 것은 git rm은 원래, repository에 있는 파일을 삭제하는 명령이다. 이경우, 아직 파일이 한 번도 commit이 안되어 있어서 git rm –cached를 사용하라고 안내하고 있다. 보통은 다음 명령어를 사용하여 staging area에 올라간 것을 취소한다.
git restore --staged readme.txt추가한 readme.txt에 사용해보자.
~/g/myproject │ main +1 ?1 > git rm --cached readme.txt ✔ │ 11:43:28
rm 'readme.txt'
~/g/myproject │ main ?2 > git status ✔ │ 11:49:30
현재 브랜치 main
아직 커밋이 없습니다
추적하지 않는 파일:
(커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)
readme.txt
sayings.py
다시 원래대로 돌아간 것을 git status로 확인할 수 있다.
git add <filename1> <filename2> … 와 같이 파일명을 일일이 적어주는건 파일이 많을 땐 어려운 일이다. git add는 그냥 폴더를 지정해서도 가능하다. 이 때, 새로운 파일이나 변경사항이 있는 파일만 자동으로 추가된다. 현재 폴더를 추가하려면 다음과 같이 쓴다.
git add .
이렇게 적용하는 경우, 추가하면 안되는 파일들이 같이 추가될 수가 있다. 이를 방지하기 위해 작업디렉토리에 .gitignore 파일을 작성해둔다. 다음은 예제 파일이다.
# ignore all .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in any directory named build
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory and any of its subdirectories
doc/**/*.pdf파일을 직접 지정하기도 하고 파일 확장자로 거르거나, 디렉토리등을 나열하기도한다. 이렇게 가능하다는 것만 알고 보다 자세한건 직접 찾아보자. github에는 미리 작성된 프로젝트별 .gitignore파일들이 모아져 있기도 하다. https://github.com/github/gitignore
마지막으로 저장소에 commit 해보자.
~/g/myproject │ main +2 > git commit ✔ │ 11:52:34자동으로 텍스트 에디터(여기서는 vim)이 뜬다. 여기에선 commit 내용에 대한 message 를 적는 부분이다.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# 현재 브랜치 main
#
# 최초 커밋
#
# 커밋할 변경 사항:
# 새 파일: readme.txt
# 새 파일: sayings.py
#
the first commit.
자동 생성된 텍스트에 설명하듯이 # 으로 주석 표시된 라인들은 실제 반영되지 않는다. 저장하고 나가면 commit 결과가 표시된다.
main (최상위-커밋) 0d52a66] the first commit.
2 files changed, 16 insertions(+)
create mode 100644 readme.txt
create mode 100644 sayings.py
main이라는 브랜치 이름이 표시되며, 내가 입력한 메세지가 같이 표시된다.
위와같이 메세지가 한 줄로 간단한 경우, commit 명령어에 함께 써줄 수도 있다.
git commit -m "short message!"commit 후 status명령어를 써보면 다음과 같다.
~/g/myproject │ main > git status ✔ │ 1m 19s │ 11:53:58
현재 브랜치 main
커밋할 사항 없음, 작업 폴더 깨끗함
나같은 경우, 처음 git을 사용할 때 조금 혼란스러웠던 부분인데, commit된 내용은 status가 신경을 안쓴다는 점이다. commit을 위한 파일이 staging area에 파일이 올라가 있거나, 변경사항이 존재하거나, 추적되지 않는 새로운 파일들이 있을 경우에만 표시가 된다. 즉, ‘commit이 필요하냐’ 여부를 알려주는 것이라 생각할 수 있다.
그렇다면, commit 한 내용은 어떻게 확인할까?
git log
commit 내용들을 보려면 git log 명령어를 사용한다.
~/g/myproject │ main > git log INT ✘ │ 11:58:44
commit 0d52a668c0e1148dfc3c44d060e64691be5a0ebb (HEAD -> main)
Author: batmask <batmask@zzzz.zzz>
Date: Sun Apr 26 11:52:39 2026 +0900
the first commit.
40자로 구성된 commit 오브젝트의 id값이 표시되고, HEAD가 main 브랜치를 가리키고 있음이 표시된다. 작성자와 commit시간이 표시되고, commit시 입력했던 message가 같이 보인다.
보다 간단하게 보기위해선 –oneline 옵션을 사용한다.
~/g/myproject │ main > git log --oneline ✔ │ 12:12:27
0d52a66 (HEAD -> main) the first commit.
파일을 수정하여 추가로 commit을 해보자.
def main():
hello("world")
goodbye("world")
def hello(name):
print(f"hello, {name}")
def goodbye(name):
print(f"goodbye, {name}")
def sleep(name):
print(f"good night, {name}")
if __name__ == "__main__":
main()
위와같이 수정해서 git status를 확인해보면,
~/g/myproject │ main !1 > git status ✔ │ 1m 52s │ 12:22:40
현재 브랜치 main
커밋하도록 정하지 않은 변경 사항:
(무엇을 커밋할지 바꾸려면 "git add <파일>..."을 사용하십시오)
(작업 디렉토리의 변경을 무시하려면 "git restore <file>..."을 사용하시오)
수정함: sayings.py
수정한 파일이 표시되는 것을 확인할 수 있다. add와 commit을 해보자. 파일이 하나일 땐, 이 과정을 한번에 처리하는 명령어로 다음과같이 -a 옵션을 쓸 수 있다.
~/g/myproject │ main !1 > git commit -a -m "add sleep function" ✔ │ 12:22:43
[main 046e349] add sleep function
1 file changed, 4 insertions(+), 1 deletion(-)
-a 옵션으로 add 명령어 없이 commit이 되었고, -m 옵션으로 메세지를 간단하게 직접 입력했다. -a 옵션은 트래킹 파일에만 적용된다. 새로 추가된 파일은 자동으로 add되지 않는다. 이제 log를 살펴보자.
~/g/myproject │ main > git log --graph ✔ │ 12:27:35
* commit 046e349249acf77cf66bb05d533bba196c3fe689 (HEAD -> main)
| Author: batmask <batmask@zzzz.zzz>
| Date: Sun Apr 26 12:26:01 2026 +0900
|
| add sleep function
|
* commit 0d52a668c0e1148dfc3c44d060e64691be5a0ebb
Author: batmask <batmask@zzzz.zzz>
Date: Sun Apr 26 11:52:39 2026 +0900
the first commit.
위와같이 –graph 옵션을 사용하면, commit 히스토리가 연결되는 브랜치가 같이 표시된다. 왼쪽에 빨간 라인을 확인할 수 있다. 연습겸, 간단하게 chatGPT의 도움을 받아 좀 더 비주얼하게 그려봤다.

git log의 보다 다양한 옵션은 문서를 참조하자. https://git-scm.com/docs/git-log 어마어마한 옵션들이 존재한다 ㅋ pro git 책 내용도 도움이 된다. https://git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-History