Git/Github 기초
무작정 깃에 대해 학습한 것이 아니라, 6시간에 걸쳐서 깃이 나오게 된 배경부터 깃을 잘 사용하기 위한 도구들을 재밌게 소개해주고, 깃 기본에 대한 강의를 들었다.
오늘 들었던 강의는 그래도 여러 번 학습한 경험이 있던 부분이었기에 복습 차원에서 공부했지만, 다음 시간에는 내가 모르는 부분도 대거 등장할 것 같다.
다음 강의까지 오늘 들은 내용을 더 온전하게 이해해서 깃을 잘 활용할 수 있도록 해야겠다.
깃이 출현하게 된 배경
- 유닉스가 유행하던 시절, 리차드 스톨먼이 오픈 소프트웨어 자유성 확보를 위한 GNU 프로젝트 돌입
- 그러나 GNU 프로젝트에는 커널이 없었고, 대학생이던 리누스 토발즈가 MINIX를 개조한 Linux를발표
- 커널: 하드웨어와 응용프로그램을 이어주는 운영체제의 핵심 시스템소프트웨어
- Shell: 운영체제의 커널과 사용자를 이어주는 소프트웨어
- 리눅스 커널을 만들기 위해 리누스 토발즈가 Subversion을 쓰다가 화가 나서 2주만에 git이라는 버전관리 시스템을 만들었다.
깃 관련 도구
Shell Command
- ls (list segment): 현재 디렉토리의 파일 목록
- ls -l = 한 줄 씩 보겠다.
- ls -a = 숨긴 파일까지 보겠다. (.확장자명)
- ls -al = 두 플래그를 동시에 사용 가능
- cd 경로 (change directory): 디렉토리 이동
- mkdir 디렉토리명 (make directory): 디렉토리 생성
- touch 파일명(확장자포함): 파일 생성
- mv 파일명 이동시킬위치 (move): 해당 파일을 이동
- mv 파일명 새파일명: 파일 이름 변경
- cp 파일명 복사할위치 (copy): 파일 복사
- rm 파일명 (remove): 파일 삭제
- 와일드카드 *를 사용해서 여러개 파일 삭제 가능
- rm -rf 디렉토리명: 디렉토리 삭제
- cat 파일명: 글 내용 취합해서 보여줌
Vim
cli에서 가장 많이 쓰이는 에디터 중 하나
Vim command
h j k l - left, down, up, right
i - 삽입모드
esc - 노말모드로 이동
dd (delete) - 커서가 위치한 줄 삭제
d + j - 아랫줄 삭제
d + k - 윗줄 삭제
d + 숫자 + j - 아랫줄 숫자만큼 삭제
Y (yank) - 줄 복사
p (paste) - 붙여넣기
u (undo) - 되돌리기
A - 줄 맨뒤로 이동하여 삽입모드
0 - 줄 맨 앞으로 이동
H - 맨 위로 이동
L - 맨 아래로 이동
:w - 저장
:q - 나가기
:wq - 저장 후 나가기
:q! - 저장 안하고 나가기
:{number} - 해당 라인으로 이동
깃
VCS (Version Control System)
- 소스 코드 관리와 같은 뜻이며, 형상관리에 포함되는 요소들중 하나
깃의 특성
- 빠른속도, 단순한 구조
- 분산형 저장소 지원
- 비선형적 개발(수천개의 브랜치) 가능
- 수정 내용은 commit 단위로 관리하기 때문에, 인터넷이 연결되지 않아도 개발할 수 있다.
- 새로운 기능 추가는 브랜치로 개발하여 편안한 실험 가능. 성공적으로 개발 시 merge하여 반영
git objects
- Blob: 파일 하나의 내용에 대한 정보
- Tree: Blob이나 subtree의 메타데이터(디렉토리 위치, 속성, 이름 등)
- Commit: 커밋 순간의 스냅샷
git Process Flow
- 개인 working directory에서 작업을 하고
git add
명령어로 staging area에 올린다.
- 커밋 메시지를 작성해서 local repo로 커밋을 한다.
git push
명령어를 이용해 remote repo에 저장한다.
git 환경설정
git config --global user.name "유저네임"
git config --global user.email "메일주소"
git config --global core.editor "vim"
git config --global core.pager "cat"
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
- 전역적으로 사용할 깃의 유저이름과 메일을 등록하고, 기본 에디터를 vim으로 그리고 페이지를 보여주는 것은 cat 명령어를 이용하도록 설정한다.
git config --list
로 설정을 확인할 수 있다.
- 마지막 줄은 깃 로그 정보를 이쁘게 볼 수 있도록 도와주는 옵션이다.
깃 시작하기
프로젝트를 시작하는 방법은 크게 두가지가 존재
git init
git clone
git init
작업 공간에서 시작해서 github로 소스코드를 순차적으로 내보낸다.
- 프로젝트 폴더를 만든다
mkdir practice-git
cd practice-git
git init
명령으로 local repo로서 역할을 시작한다.
- github에서 새로 비어있는 remote repository를 생성하고, 복사한 주소를 local repo에 등록
- remote repo와 local repo의 이름을 맞춘다.
git remote add origin 복사한주소
- origin은 복사한 주소를 부르기 위한 별명같은 존재로, 다른 것으로 사용해도 되나 주로 origin을 사용한다.
- 현재 브랜치 이름을 main으로 변경
- 기존에 주로 사용하던 master 표현 대신 main으로 바뀌는 추세이다.
git branch -M main
- 새 파일을 만들고 작업을 수행
- 작업이 끝났다면
git status
명령으로 현재 프로젝트의 상태를 확인
- untracked files가 보인다면 다음 작업을 할 준비 완료
- workspace에 추가된 새로운 파일을 staging area로 보낸다.
- 추가된 파일에 커밋 메시지를 작성해 local repo로 커밋한다.
git status
로 commit 할 내역이 존재하는지 확인한 후, 커밋이 끝났다면 remote report push한다.
git push -u origin main
- origin remote repo의 main 브랜치로 push한다는 뜻
- 첫 커밋이라면, -u(--set -upstream) flag를 붙여 push하여 현재 작업중인 branch가 업로드할 branch의 변동사항을 추적하도록 설정
- 이후에는 -u 옵션 없이 바로 push한다. (origin main)을 안붙여도 동작한다.
git clone
github에서 remote repository를 먼저 생성한 뒤, 작업공간으로 끌어와 작업을 시작한다.
- github에서 remote repo를 생성하되, LICENSE, README.md, .gitignore 등의 파일과 함께 생성
- 터미널에서 주소를 복사하여 작업공간에 local repo를 생성하며 복제한다.
- 커밋까지는 git init 방식과 동일
- commit이 끝났다면 remote repo로 push
- remote repo에서 먼저 끌어와 사용하는 구조이기 때문에 remote repo의 main과 local repo의 main 브랜치는 추적하도록 세팅되어 있다.
- 따라서, 위의 -u flag를 붙이지 않아도 된다.
git push origin master
Conventional Commit
- 오픈 소스 개발의 경우, 소스 코드뿐 아니라 커밋 메세지도 공개되기 때문에 모든 사용자가 읽을 수 있는 영어를 선택
- 커밋은 동작 가능한 최소단위로 자주 할 것
- 해당 작업단위에 수행된 모든 파일 변화가 해당 커밋에 포함되어야 함
- 모두가 이해할 수 있는 log를 작성할 것
- 커밋 제목은 구나 절(50자 이내)로 완성
- 내용은 optional body에 엔터로 구분하여 작성하며, 문장형으로 작성
- 커밋 메세지의 제목에 prefix 꼭 달기
- feat: 기능 개발 관련
- fix: 오류 개선 혹은 버그 패치
- docs: 문서화 작업
- test: test 관련
- conf: 환경설정 관련
- build: 빌드 관련
- ci: Continuous Integration 관련