재미난 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란 무엇일까?
index란, .git/index
에 존재하는 파일로, Working Directory와 Repository 사이에 존재하는 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
명령어는 현재 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 한다.