그간 GitHub를 많이 사용하지만 정확한 개념을 제대로 잡고 가지 못하였다. 그동안 그저 백업과 협업을 위한 코드를 합치는 용으로만 사용하였다. GitHub에 대해 좀더 깊게 알아보고 잘 활용하는 방법에 대해 고민하고 공부하는 시간을 가져 보자.
1. Git과 GitHub란 ?
Steve-Lee 님의 블로그를 참고하여 정리하였습니다. (https://deepinsight.tistory.com/78?category=834296)
- Git
- 컴퓨터 파일의 변경사항을 추적하고 여러 명의 사용자들 간에 해당 파일들의 작업을 조율하기 위한 분산 버전 관리 시스템이다. (위키백과 :https://ko.wikipedia.org/wiki/깃_(소프트웨어))
- git 은 local repository의 버전 관리 도구이다.
- GitHub
- 분산 버전 관리 툴인 깃(Git)을 사용하는 프로젝트를 지원하는 웹호스팅 서비스이다. (위키백과: https://ko.wikipedia.org/wiki/깃허브)
- github은 협업을 위한 원격 저장소 이다.
- 저장소
- working directory
개인 PC안의 작업공간들 중 git을 사용하는 작업공간
- Local Repository
임시 버전들이 올라가는 공간
개인 전용 저장소
- Remote Repository
최종 확정본이 올라가는 공간
서버에서 관리되는 여러 사람이 공유하기 위한 저장소
2. Git의 저장
나는 이 부분에 대한 개념이 많이 부족하여 이 글을 쓴다고 하여도 과언이 아닐 정도로 기계적으로 코드를 작성하고 add 하고 commit 하고 push하였다. 그래서 add, commit, push가 정확히 무엇인지 짚고 넘어가 보자.
참고 : https://git-scm.com/book/ko/v2/
- 파일의 생명 주기 (LifeCycle)
https://git-scm.com/book/ko/v2/Git%EC%9D%98-%EA%B8%B0%EC%B4%88-%EC%88%98%EC%A0%95%ED%95%98%EA%B3%A0-%EC%A0%80%EC%9E%A5%EC%86%8C%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0 - Working Directory
-
Untracked(관리대상이 아님)
새로 만든 파일을 의미한다. 아직 스냅샷(커밋) 에 넣어지지 않은 파일
- Tracked(관리 대상임)
이미 스냅샵(커밋)에 포함되어 있던 파일
그림의 Untracked를 제외하면 모두 Tracked 파일에 해당한다.
- Staged
커밋으로 저장소에 기록할 상태
- Unmodified
스냅샷에 있는 Tracked 파일이 수정되지 않은 상태
- Modifiedc
스냅샷에 있는 Tracked 파일이 수정되어 스냅샷에 적용되지 않은 상태
-
- Add
현재 파일들을 staged 파일로 상태를 변경한다. Staged 상태의 파일들만 Commit시에 적용된다.
12345678910gim-yuwan ~디렉토리/ git statusOn branch masterYour branch is up to date with 'origin/master'.Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified: ExampleModified.javaUntracked files:(use "git add <file>..." to include in what will be committed)ExampleUntracked.javacs status 명령어로 현재 상태를 찾아보면 Modified ,Untracked파일이 있다.
123456789gim-yuwan ~디렉토리/ git add .gim-yuwan ~디렉토리/ git statusOn branch masterYour branch is up to date with 'origin/master'.Changes to be committed:(use "git restore --staged <file>..." to unstage)modified: ExampleModified.javanew file: ExampleUntracked.javacs Untracked 파일과 Modified 파일을 Staged 상태에 추가한다.
위의 . 은 Untracked 파일과 Modified 파일 전부를 의미한다.
파일을 선택적으로 추가하고 싶다면 . 자리에 파일 이름을 입력하면 된다.
- Commit
1git commit
cs 현재 Straging Area에 파일들을 커밋한다.
commit시에 메세지를 필수적으로 입력해야 하기 때문에 vi 편집기 화면이 나오게 된다.
여기서 m 옵션을 통해 메세지를 입력할 수 있다.
12345678910gim-yuwangim-yuwan ~디렉토리/ git commit -m "fix git commit example"[master 46014d0] fix git commit example2 files changed, 4 insertions(+), 1 deletion(-)create mode 100644 ExampleUntracked.javagim-yuwan gim-yuwan ~디렉토리/ git statusOn branch masterYour branch is ahead of 'origin/master' by 1 commit.(use "git push" to publish your local commits)nothing to commit, working tree cleancs Commit을 실행하게 되면 Local Repository에 나의 Staged 파일들이 올라가 적용이 된다.
Staged 파일들은 모두 Unmodified 상태로 변경된다.
- Push
현재 Local Repository의 내용들을 Remote Repository에 적용시킨다.
내 PC의 소스코드를 서버의 관리공간에 저장한다.
12345678910gim-yuwangim-yuwan ~디렉토리/ git push origin masterEnumerating objects: 20, done.Counting objects: 100% (20/20), done.Delta compression using up to 16 threadsCompressing objects: 100% (8/8), done.Writing objects: 100% (11/11), 915 bytes | 915.00 KiB/s, done.Total 11 (delta 3), reused 0 (delta 0)remote: Resolving deltas: 100% (3/3), completed with 3 local objects.To https://github.com/mygitrepository9410f63..46014d0 master -> mastercs
push 명령은 Remote Repository에 쓰기 권한이있고, 이 저장소에 다른사람이 push를 한적이 없을때만 가능하다. 누군가 먼저 push 한적이 있다면 먼저 다른사람의 작업을 가져와 Merge한 이후에 push 가 가능하다.
이 명령에서 origin master는 브랜치를 의미한다.
“origin” 의 의미
브랜치 이름으로 많이 사용하는 “master” 라는 이름이 괜히 특별한 의미를 가지는 게 아닌 것처럼 “origin” 도 특별한 의미가 있는 것은 아니다. git init 명령이 자동으로 만들기 때문에 사용하는 이름인 “master” 와 마찬가지로 “origin” 도 git clone 명령이 자동으로 만들어주는 리모트 이름이다. git clone -o booyah 라고 옵션을 주고 명령을 실행하면 booyah/master 라고 사용자가 정한 대로 리모트 이름을 생성해준다.
- pull
12345678910gim-yuwangim-yuwan ~디렉토리/ git push origin masterEnumerating objects: 20, done.Counting objects: 100% (20/20), done.Delta compression using up to 16 threadsCompressing objects: 100% (8/8), done.Writing objects: 100% (11/11), 915 bytes | 915.00 KiB/s, done.Total 11 (delta 3), reused 0 (delta 0)remote: Resolving deltas: 100% (3/3), completed with 3 local objects.To https://github.com/mygitrepository9410f63..46014d0 master -> master
cs Remote Repository의 소스코드를 Local Repository에 적용하는 명령이다. 다른사람이 push 한 내용들을 적용시키는 과정이다. push가 안될때 pull을 이용하여 이전 push 내용을 받아 merge하는 과정을 거쳐야 한다. (물론 내 Local Repository의 내용과 Remote Repository의 내용중 같은 파일에서 다른 내용이 있다면 pul l하는 과정에서도 오류가 날것이다.)
- git 작동 과정
- working directory
이렇게 가장 git에 대한 가장 기본적인 것들을 정리하여 보았다. 사실 Git flow에 대해 공부를 하는 과정에서 글을 쓰려고 했으나 이번 기회에 가장 기초적인 것들 부터 정리하고 공부해 보는 시간이었다. 기초적인 것들은 이외에도 commit 되돌리기나 clone 같은 것들이 있지만 일단은 건너 뛰도록 하겠다. 다음엔 branch와 workflow에 대해 공부해서 정리하는 시간을 갖겠다.
'Git' 카테고리의 다른 글
Gitlab과 GitlabFlow (0) | 2020.08.16 |
---|---|
Git- GitFlow와 GitHubFlow (0) | 2020.07.26 |