개요

  • 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

 

Git - Reference

Reference

git-scm.com

준비물

준비물

  • CLI ( command line interface )
    • git bash 추천 ( window 환경에서 linux 터미널들의 명령어 컨셉 사용 )
  • GUI ( graphic user interface )
    • sourceTree
    • fork
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.
        • name
        • email
  • stash : 변경이력을 stash에 임시저장하고  변경사항취소 ( 현재commit으로 hard reset )
    • pop : stash에 저장된 내역을 가져옴
      • [name] : name의 스태쉬 가져오기
    • list : stash에 저장된 리스트 및 이름
    • -p : 헝크별 저장
    • drop
      • [name] : name의 스태쉬 버리기
    • clear : 모든 stash 버리기
  • reflog
    • git action 로그에 접근
  • 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할때, 경로를 나누지 않고 하나로 합쳐줌

fast-forward / no fast-forward / 3way-merge

 

Cherry pick

  • 다른 branch의 특정 commit 수정내역만 가져옴

 

일반적인 관리방법에 대한 컨벤션

commit msg convention

footer : break point가 있거나, 기존 이슈의 해결작업일 때

 

사용되는 브랜치들

브랜치용도
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 폴더 내부 구조

file storage - key_value storage (데이터) - plumbing (low_level interface) - porcelain (high_level interface) blob : 데이터(파일) ( binary large object ) / tree : 폴더-경로 구조 ( + meta data ) / commit : 각 시점의 스냅샷

 

  • 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값으로 사용가능 ( 동일하게 판정 )

'기타 툴' 카테고리의 다른 글

주요 툴 및 플러그인 정리  (0) 2024.05.22
Desmos  (0) 2024.05.22
[Adobe] After Effect  (0) 2024.05.21

+ Recent posts