Skip to main content

재미난 Git(1)

그간 Git을 사용하며 유용했던 명령어를 하나씩 정리하려고 한다.


TL;DR

원격 저장소에 파일 업로드 하기

# empty git repository 생성
$ git init

# 원격 저장소를 origin 이라는 이름으로 추가
$ git remote add origin <REMOTE_REPOSITORY_URL>

# staging area에 파일 추가
$ git add file.txt

# repository에 변경사항 기록
$ git commit -m "Commit message" -m "Commit description"

# local의 ref(main)와 일치하는 origin의 main 브랜치에 업로드
$ git push origin main

git init은 어떤 동작을 할까?

git init을 통해 empty repository(주로 .git/)를 생성하고, 아무 commit이 없는 초기의 branch가 생성된다. '주로' 라고 말한 이유는 $GIT_DIR가 설정 돼 있으면 ./.git 대신 해당 값으로 생성된다. 만약 해당 환경변수 값이 없다면, .git/을 찾을때까지 상위 directory로 이동한다.

이때 empty repository는 다음과 같이 구성 돼 있다.

├── .git/
│ ├── HEAD
│ ├── config
│ ├── description
│ ├── hooks
│ │ ├──applypatch-msg.sample
│ │ ├──commit-msg.sample
│ │ ├──fsmonitor-watchman.sample
│ │ ├──post-update.sample
│ │ ├──pre-applypatch.sample
│ │ ├──pre-commit.sample
│ │ ├──pre-merge-commit.sample
│ │ ├──pre-push.sample
│ │ ├──pre-rebase.sample
│ │ ├──pre-receive.sample
│ │ ├──prepare-commit-msg.sample
│ │ ├──push-to-checkout.sample
│ ├── info
│ │ └──exclude
│ ├── objects
│ │ ├── info/
│ │ └── pack/
│ └── refs
│ ├── heads/
│ └── tags/

이때, $GIT_OBJECT_DIRECTORY 환경변수 값이 등록 돼 있으면 sha1 directories가 해당 path 아래에 추가된다. 만약 없다면, 기본적으로 $GIT_DIR/objects에 추가된다.

만약, 기존에 .git/ directory가 있는 경우는 어떨까? 다행히도 이미 있는 파일인 경우, overwrite하진 않기 때문에 안전하다.

참고로 .git/hooks/에 위와 같이 유용한 script files가 있으니 이를 활용해도 재미있을 것 같다.


git remote add origin <REMOTE_REPOSITORY_URL>은 어떤 동작을 할까?

<REMOTE_REPOSITORY_URL>에 해당하는 원격 저장소의 이름을 origin(일반적으로 사용됨)이라 명명하고, tracking 하려는 remote repository로 추가한다.


git add는 어떤 동작을 할까?

그 전에, git add 를 하게 될 경우, index에 파일을 추가한다고 했는데, 이때 index란 무엇일까?


git-add

index란, .git/index에 존재하는 파일로, Working DirectoryRepository 사이에 존재하는 Staging Area라는 공간에서, Working Directory에서의 변경사항을 추적하는 파일이다.

따라서 git add를 통해 Staging Area에 변경사항을 추가하게 되면, index에 하나씩 추가한다("by using git-add to incrementally "add" changes to the index").


git commit은 어떤 동작을 할까?

git add를 통해 Staging Area에 파일을 추가했다면, 파일의 변경사항을 추적할 수 있게 된다. 그럼 commit을 생성해 가장 최신의 상태를 기록해야 한다. 이 때 사용하는 것이 git commit 명령어이다.

git-commit

git commit 명령어는 현재 index(.git/index)에 존재하는 파일과 message, 그리고 description을 포함해 새로운 commit을 생성한다. 해당 commit은 HEAD의 child에 추가되며, 주로 현재 브랜치의 꼭대기를 가리킨다.


git push origin main은 어떤 동작을 할까?

origin의 branch 중 HEAD의 ref(ex. ref: refs/heads/main)와 일치하는 ref를 찾아 업데이트 한다.

만약 remote repository가 명시되지 않으면, 기본적으로 origin에 push 한다.

Related Links