개요
- Local : 내 컴퓨터에 저장됨
- Remote : 깃 서버에 저장됨 ( 클라우드 )
- Unstaged : 수정된 파일들 리스트
- Staged : 내가 선택한 수정할 파일들 리스트
- Commited : 수정이력 ( 제목, 설명 )을 포함한 수정할 파일 그룹
- 각 브랜치/로컬상의 파일별 "최종커밋시점"을 git에서 보유
얄코 강좌
얄코doc : https://www.yalco.kr/@git-github/0-1/
git_gui_flow : https://ndpsoftware.com/git-cheatsheet.html#loc=index;
git_doc : https://git-scm.com/docs
준비물
준비물
- CLI ( command line interface )
- git bash 추천 ( window 환경에서 linux 터미널들의 명령어 컨셉 사용 )
- GUI ( graphic user interface )
git bash ( terminal ) 기본명령어
git bash ( terminal ) 기본명령어
- J : 아래로 스크롤
- K : 위로 스크롤
- i : 입력 시작 ( insert )
- esc 입력 종료
- :q 저장없이 나가기
- :wq 저장하고 나가기
- :q! 저장없이 강제종료
기본 명령어
기본 명령어
git
- status : 현재 수정된 사항들
- log : 커밋 로그
- diff : 파일 내 변경 세부내용
- add [파일명] : stage
- commit 파일명 ( . 입력시 전부 )
- p : 헝크hunk단위로 add 선택 ( 헝크단위 : git에서 임의로 구분한 작업 단위 ( 파일보다 세부값 ) )
- commit [커밋 설명]
- -m "내용" : 내용(string) 달아서 커밋
- -am "내용" : [새로 추가된untracked 파일이 없을 때 한정] add(stage)와 commit 동시에 진행
- --ammend : 마지막 커밋 수정
- -v : 커밋시 커밋 될 내용들 리스팅 ( stage 공간에 있는 이력들 )
- reset
- –hard [커밋 hash] : 해당 커밋으로 reset
- --hash : 최신버전으로 reset
- --soft : repo → stage 로 이동
- --mixed (default) : repo → unstage 로 이동
- revert (option) [커밋 hash]
- option
- --no–commit : 커밋없이 stage만 진행
- commit -am과 동일 ( commit 문구는 자동생성 )
- :wq로 저장종료 해야함
- branch : branch list 확인
- [name] : name branch 추가
- -M [name] : 기본 브랜치명을 name으로 설정
- --all ( -a ) : remote를 포함한 모든 브랜치 리스트 확인
- switch
- add--[name] : name branch tracking
- -c [name] : name의 branch를 create하고 tracking
- -d [name]: name의 branch delete
- -m [nameA] [nameB] : nameA 브랜치의 이름을 nameB로 변경
- -t [nameA] : 로컬에 nameB 브랜치 생성 및 nameA 경로의 브랜치와 연결 ( git branch -a 했을때 나오는 remote 경로 다 적어야 함 )
- merge
- merge conflict 해결 등, 내용(-m)이 자동생성될 경우 공백. :wq로 저장만 해주면 됨
- [name] : name 브랜치를 현재 선택된 브랜치로 머지 ( name branch의 변경사항을 현재 branch로 가져오는 것 )
- [name] 브랜치에서 추가로 커밋할 경우, merge 직전 commit에서 이어짐
- 현재 브랜치에서 추가로 커밋할 경우, merge commit 이후에 이어짐
- --abort : 컨플릭트 상태일 때, 머지 취소
- --no-ff : 노 fasat forward ( default가 fast forward )
- --squash : 다른 커밋들을 묶어 가져오기 ( merge보다는 여러개를 cherrypick 하는 개념에 가까운듯 _ 서로의 Head가 종속되지 않을 때 )
- rebase
- [name] : 현재 브랜치를 name 브랜치로 리베이스 ( merge와 반대, 현재브랜치의 commit들을 name branch에 병합 )
- 보통 [합칠 브랜치]에서 [master]로 rebase ( 그래야 합칠브랜치의 commit들이 master의 현재 버전 다음에 추가됨 )
- 그다음 [master]로 가서 [합친 브랜치]를 merge ( fast-forward )
- --abort : 동일
- --continue : conflict 해결 → add → 컨티뉴 입력 ( 한번의 rebase에서 여러 commit에 대해 해결해야 할 경우, 다음 커밋내용은 continue로 넘어감 )
- --onto : 분기를 공유하지 않는 먼 branch의 고유commit들만 가져오기..?
- -i [name] : name의 hash를 가진 커밋까지 사이에 있는 커밋들을 수정
-
명령어설명
p, pick |
커밋 그대로 두기 |
r, reword |
커밋 메시지 변경 |
e, edit |
수정을 위해 정지 |
d, drop |
커밋 삭제 |
s, squash |
이전 커밋에 합치기 |
- remote
- 연결된 remote address list ( name들 ) 출력
- -v 연결된 remote들의 세부내용
- add [name] [remote address] : current dir와 remote address를 연결 ( name은 remote address의 이름으로 사용할 string. 보통 origin )
- checkout : 일시적으로 특정 commit으로 이동 ( 과거 commit도 가능 )
- --
- [nameA] : nameA의 파일 변경사항을 초기화 ( 현재 commit 버전으로 )
- HEAD~~ : 현재 (temp)head에서 2단계 이전 커밋으로 이동 ( ~ 혹은 ^ 갯수만큼 )
- Head-- : 현재 (temp)head에서 2단계 다음 커밋으로 이동
- push
- -u [nameA] [nameB] : nameA remote에서 push의 기본연결대상을 nameB 브랜치로 설정
- [nameA] --delete [nameB] : nameA remote의 nameB branch 제거
- --delete : 태그 등 제거
- -f : Head보다 이전 commit으로의 reset을 포함하고있을 때, remote에서도 reset보다 뒤의 commit들을 제거하도록 [강제(force) 푸쉬] 하는 기능
- clone [address] : address의 clone을 current dir에 생성 ( github - project - code - HTTPS )
- fatch : remote의 modified history를 download 및 적용
- pull : fetch 및 최신 commit으로 head 변경 ( fetch단계를 포함 )
- --no-rebase : remote와 local에서 달라진 분기가 있을 경우, merge 형태로 병합
- --rebase : remote와 local에서 달라진 분기가 있을 경우, rebase 형태로 병합
- restore
- [파일명] : unstage → discard
- --staged [파일명] : unstage
- --source=[hash] [파일명] : 이전 commit의 파일명 불러오기(unstage로)
- config
- --global : 모든 프로젝트에 자동적용 ( pc or terminal 종속? )
- --local(default)
- 공통
- --list : config값 출력
- -e : config 값을 edit 창 ( config --global core.editor "code --wait" 사전설정 시, ide에서 설정값 수정 가능 )(code는 편집프로그램명.exe, --wait는 프로그램 종료 시 CLI 다시 동작)
- core.autocrlf true ( 윈도우기준, 줄바꿈 호환문제 해결 윈도우-맥 )
- push.default current : remote 연결 시, 현재 local branch와 대응되는 remote branch에 연결하도록 하는 설정
- user.
- stash : 변경이력을 stash에 임시저장하고 변경사항취소 ( 현재commit으로 hard reset )
- pop : stash에 저장된 내역을 가져옴
- list : stash에 저장된 리스트 및 이름
- -p : 헝크별 저장
- drop
- clear : 모든 stash 버리기
- reflog
- cherry-pick [hash]
git setting
git setting
.gitignore : git에서 무시할 폴더
- file.c ( 경로 무관 모든 file.c 이름을 가진 파일 및 폴더 )
- /file.c
- *.c ( 와일드 카드 )
- !not_ignore_this.c ( .c 확장자지만 무시하지 않을 파일 )
- logs
- logs/ ( 폴더 내 하위항목 전체 )
- logs/debug.log
- logs/*.c
- logs/**/debug.log
문자열 규칙
문자열 규칙
- . : 와일드카드*
- -[name] : name을 실행하며, name은 현재 명령의 모듈 (attached option)
- --[name] : name을 실행하며, name은 현재 명령의 계층을 점유 (selected option)
- -- help : 해당 명령어의 도움말페이지(웹)으로 이동
- -h : 해당명령어의 하위 명령어 리스트 출력
- 접미
- [[name] or HEAD] 뒤
- ~ : 특정 commit보다 이전 ( ~ 갯수만큼 이전 )
- ~[숫자] : 숫자만큼 이전
- - : 특정 commit보다 이후 ( ~ 갯수만큼 이후 )
- -[숫자] : 숫자만큼 이후
개념
Snapshot
- git은 snapshot 방식 활용
- 델타방식 : 각 commit에서 "수정된 파일 혹은 내용"을 누적하여 최종결과물을 도출
- 스냅샷방식 : 최종버전만 도출 ( 각 시점에서 instance한 스냅샷 상태를 가짐 )
분산 버전 관리
- git은 분산 버전 관리
- 중앙집중버전관리 : version은 remote에서 관리하고, local은 instance state만 가지고잇음
- 분산버전관리 : version과 edit값 등 전부 clone 시 local에서 가져가 공유함 ( .git folder )
단계 분류
Head
- 각 branch의 최신 commit
- checkout을 통해 특정 branch의 과거 commit에 head를 배치할 경우, 일시적인 temp branch에 속해있는걸로 판정
- 그래서 git switch로 현재브랜치 선택하면 최신 commit으로 head가 이동됨
- 즉, 과거로 checkout해 가면, 현재 commit을 HEAD로 가지는 temporary branch를 생성하고, 그 branch로 switch 한다는 뜻
- 그래서 create branch시, 현재 HEAD가 위치한 commit을 기점으로 신규 브랜치가 생성됨
Merge 방법
- Fastforward : branchA를, branchA 이후의 commit을 가진 branchB에 merge할때, 경로를 나누지 않고 하나로 합쳐줌
Cherry pick
- 다른 branch의 특정 commit 수정내역만 가져옴
일반적인 관리방법에 대한 컨벤션
commit msg convention
사용되는 브랜치들
브랜치용도
main |
제품 출시/배포 |
develop |
다음 출시/배포를 위한 개발 진행 |
release |
출시/배포 전 테스트 진행(QA) |
feature |
기능 개발 |
hotfix |
긴급한 버그 수정 |
ref : https://nvie.com/posts/a-successful-git-branching-model/
SubModule
- 다른 repo의 데이터를 가져와서 연동 ( 읽기만 가능 )
- .gitmodules 폴더에서 관리
GitHub Action
- github - repo 페이지에서 action탭에서 확인 가능
- CI/CD
- .gitflow 폴더내에서 관리
.git 폴더 내부 구조
- hooks : 자동화를 위한 전/후처리 절차?
- info : 인포
- lfs ( large file storage ) : 단위의 용량이 큰 데이터의 경우, 별도의 cloud server에 올려서, git은 포인터만 가지고 있고, checkout 시 다운로드 하는 형태, 그러한 포인터형태의 objects를 관리하기 위한 폴더
- modules : 포함하고 있는 모듈(link된 다른 repo)의 .git을 대체
- logs : git action log
- Index : staged 된 ( commit 전 ) 파일들의 tree index
- refs : 리모트와 로컬의 각 브랜치의 Head 등에 대한 commit reference data
objects
- git cat-file -p SHA(폴더명 포함)
- tree : 040000 (디렉토리)
- blob : 100644 (읽기파일), 100755(실행파일)
- commit : x
- zlib으로 압축된 데이터
- 폴더명까지 포함하여 40자 SHA
- 폴더명까지 포함하여 중복 없을 지 앞 7자도 key값으로 사용가능 ( 동일하게 판정 )