Using git
git 자주 사용하는 명령어 모음 |
깃 초기화 | git init 경로명 |
깃 상태 확인 | git status |
깃 저장소 복제 | git clone 원격저장소URL 새폴더이름 |
파일 등록과 커밋 | git add 파일이름 → git commit → 에디터에서 커밋 메시지 작성 |
git commit -a → 에디터에서 커밋 메시지 작성 |
git commit -am “커밋 메시지” |
로그 확인 | git log |
커밋 비교 | git diff |
원격 저장소 별칭 확인 | git remote |
원격 저장소 별칭과 URL 확인 | git remote -v |
원격 저장소와 연결 | git remote add 원격저장소별칭 원격저장소URL |
원격 서버 삭제 | git remote rm 원격저장소별칭 |
커밋 가져오기 | git pull 또는 git fetch |
커밋 전송하기 | git push 원격저장소별칭 브랜치이름 |
현재 브랜치 확인 | git branch |
브랜치 생성 | git branch 브랜치이름 |
브랜치 이동 | git checkout 브랜치이름 |
스태시 저장 | git stash |
스태시 읽기 | git stash pop |
브랜치 병합 | git merge 브랜치이름 |
리베이스 병합 | git rebase 브랜치이름 |
리셋 | git reset 옵션 커밋ID |
리버트 취소 커밋 | git revert 커밋위치 |
태그 관리 | git tag |
태그 전송 | git push 원격저장소별칭 태그이름 |
서브모듈로 연결 | git submodule add 원격저장소URL 폴더이름 |
why git?
pros. and cons.
pros.
강력한 브랜치 기능; 브랜치를 쉽게 만들고 병합 가능, 일시적인 작업에 대한 이력 관리 쉬움
속도와 성능; 처리 속도가 빠르고 기능이 많음
분산작업; 장소에 구애 받지 않고 협업이 가능(메인 서버에 연결없이 작업 가능), 저장소의 완전한 복사본으로 작업
데이터 보장성; 모든 파일을 암호화하여 저장
무료; 비용 안 듬.
cons.
setting up a git
설치 osx, windows, linux
global settings
git 시작하기
생성 init, clone
git이 파일(디렉토리)를 관리하는 방법
working directory → stage area → git repository
working directory; 사용자가 작업하는 디렉토리
stage area; git repository에 저장될 파일 목록
git repository; git이 파일을 저장하는 저장소
git repository의 파일 관리 add, remove, commit
상태 보기 status
뒤로 되돌아 가기 reset
버전 되돌아보기 log
태그 붙이기 tag
이건 저장하지 않을 거야 .gitignore
repository에 넣으면 좋은 것들; 스펙문서, 설계서, 매뉴얼, 도움말, 소스코드, 이미지, 외부라이브러리, 빌드스크립트
넣지 말아야 할 것들; 바이너리, 설치본, 영업자료, 마케팅자료, 판매자료 등.
stash
HEAD; 최종 커밋 작업의 위치 포인터, HEAD와 스테이지 영역의 내용을 합쳐 다음 커밋을 생성
^,~; HEAD^^, HEAD~~, HEAD^3, HEAD~3
AHEAD; 서버로 전송되지 않은 로컬 커밋
BHEAD; 로컬로 내려 받지 않은 커밋
pull → 작업 → commit → pull → push
대부분의 git 명령어는 working tree clean 상태에서 작업
reset; 저장소를 외부에 공개했거나 공유하고 있다면 주의해서 리셋 사용
revert; 기존 커밋을 남겨 두고 취소에 대한 새로운 커밋 생성.
reset vs. revert; 커밋 정보의 삭제 여부. 리셋: 커밋 삭제, 리버트: 취소 커밋 생성
versioning; major.minor.patch, SemVer(Semantic Versioning)
RC(Release Candidate),
GA(General Availability), M(Milestone)
tag; 특정 커밋에 태그 부착
Annotated; 태그 이름 + 정보 포함
Lightweight; 태그 이름만 포함
./git/ref/tags 폴더
$ git config --global core.editor "에디터경로"
$ git config --global credential.helper cache
$ git init
$ git clone 원격저장소URL 새폴더이름
$ git add 파일이름
$ git rm --cached 파일이름
$ git reset HEAD 파일이름
$ git status
$ git mv 파일이름 새파일이름
$ git commit
$ git commit -a
$ git log
$ git log --pretty=short
$ git show 커밋ID
$ git diff
$ git diff HEAD
$ git checkout -- 수정파일이름
$ git add 수정파일이름
$ git commit -m "커밋메시지"
$ git commit -am "커밋메시지"
$ git commit --allow-empty-message -m ""
$ git commit --amend
$ git commit -v
$ git stash
$ git stash save
$ git stash save "WIP: message"
# 작업 중인 내용을 강제 커밋(비추천)
$ git commit -am "temp"
$ ...
$ git reset -soft HEAD^
###
$ git stash list
$ git stash show
$ git stash show -p stash{0}
$ git stash pop
$ git stash apply --index
$ git stash branch 브랜치이름
$ git stash apply
$ git stash apply stash@{0}
$ git stash drop
$ git clean
$ git log --oneline
$ git reset --hard HEAD^^^
$ git rest 옵션 커밋ID
$ git reset --soft HEAD~
$ git commit --amend
$ git reset --mixed 커밋ID
$ git reset 커밋ID
$ git reset --mixed HEAD~
$ git reset --hard HEAD~
# 스테이지 리셋
$ git add 파일이름
$ git reset 파일이름
$ git reset --mixed HEAD 파일이름
$ git reset 커밋ID 파일이름
# 작업취소
$ git reset --hard HEAD
# 병합 취소
$ git reset --merge HEAD~
$ git revert HEAD
$ git revert 커밋ID
$ git revert 커밋ID .. 커밋ID
$ git revert --mainline 숫자 병함커밋ID
$ git tag
$ git tag -l
$ git tag -a 버전
$ git log --decorate
$ git tag -a 버전 -m "메시지"
$ git tag -d 태그이름
$ git show 태그이름
$ git tag 태그이름
$ git tag -a 태그버전 커밋ID
$ git checkout 태그버전
$ git checkout -b 브랜치이름 태그이름
$ git push 태그이름
$ git push 원격저장소이름 --tags
$ git push --delete 원격저장소이름 태그이름
$ git push 원격저장소이름 로컬태그이름:원격저장소태그이름
git branch
기준이 되는 메인 프로젝트와 개발 프로젝트 혹은 디버그 프로젝트, 핫픽스 프로젝트 master, branch
지금 작업하고 있는 위치 head
메인+브랜치⇒새로운 메인, 브랜치1+브랜치2⇒새 버전의 브랜치1 merge
병합(merge)하기 전에 diff
rebase
Fast-Forward 병합; 순차적 커밋에 맞추어 병합 처리
3-Way 병합; 공통 조상 커밋 + 공통조상커밋을 포함하는 브랜치 + 새로운 브랜치 ⇒ 하나로 병합, 병합을 성공적으로 완료 후 새로운 커밋을 추가로 생성 (=병합 커밋)
Rebase; 두 브랜치를 서로 비교하지 않고 순차적으로 커밋 병합. 병합 커밋 없음, 브랜치의 마지막을 가리키는 커밋 위치 다름. 원격 저장소에 푸시하면 리베이스 사용하지 않는 것이 원칙.
$ git branch
$ git branch 브랜치이름 커밋ID
$ git rev-parse 브랜치이름
$ git branch -v
$ git checkout 브랜치이름
$ git checkout -- 파일이름
$ git checkout -
$ git checkout -b 브랜치이름
$ git checkout 커밋해시키
$ git checkout HEAD~1
$ git checkout -
$ git log --graph --all
$ git show-branch --more=10
$ git merge 브랜치이름
$ git merge 브랜치이름 --edit
$ git reset --hard HEAD^
$ git branch -d 브랜치이름
$ git merge --abort
$ git ls-files -u
$ git commit -m "resolve complicit"
$ git branch --merged
$ git branch --no-merged
$ git rebase 원본브랜치
$ git checkout 원본브랜치
$ git merge 대상브랜치
$ git rebase --continue
$ git rebase --abort
$ git rebase -i HEAD~3
원격 repository
$ git remote add 원격저장소별칭 폴더경로
$ git remote add 원격저장소별칭 원격저장소URL
$ git remote
$ git remote -v
$ git remote rename 변경전이름 변경후이름
$ git remote show 원격저장소이름
$ git remote rm 원격저장소이름
$ git push 원격저장소별칭 브랜치이름
$ git push -u 원격저장소별칭 브랜치이름
$ git push 원격저장소별칭 로컬브랜치이름:새로운원격브랜치
$ git pull
$ git fetch
$ git merge 원격저장소별칭/브랜치이름
$ git branch -r
$ git branch -a
$ git branch -vv
$ git checkout --track 원격저장소별칭/원격브랜치
$ git checkout -b 새이름 원격저장소별칭/브랜치이름
$ git branch -u 원격저장소별칭/브랜치이름
$ git push --set-upstream 원격저장소별칭 원격브랜치
$ git merge 원격저장소별칭/브랜치이름
$ git checkout -b 임시브랜치이름 원격저장소별칭/원격브랜치
$ git branch -d 브랜치이름
$ git branch -D 브랜치이름
$ git push 원격저장소별칭 --delete 리모트브랜치이름
git flow stories
도구의 사용법 보다 사용 방법이 더 중요하다.
메인 프로젝트는 놔두고 개발 프로젝트로 작업하기
한참 개발 중인데 급한 버그 수정 요청이 들어왔다
하나의 프로젝트 여러 명의 개발자
git-flow, github-flow, gitlab-flow 가 조금씩 다르다.
submodule
저장소를 모듈화, 저장소 분리
저장소 하나가 다른 깃 저장소를 포함하는 형태
메인 저장소 ↔ 부 저장소
2개 이상인 저장소를 부모/자식 관계로 연결
서버 저장소를 서브폴더 형태로 취급
.gitmodules
메인에서 서브저장소 추가 → .gitmodules 추가 → 커밋
저장소마다 별도로 커밋 수행
메인 저장소는 서브모듈의 변경 내용을 모니터링, 서브모듈이 변경되면 메인 커밋
$ git submodule -help
$ git submodule add 원격저장소URL 폴더이름
$ git add .gitmodules
$ git commit -m "add submodule"
$ git submodule init
$ git submodule update
# submodule 사용시, 아래 두 줄은 세트라고 생각하면 됨.
$ git pull origin master
$ git submodule update
fork, pull request
PR(Pull Request) @github, MR(Merge Request) @gitlab
fork → clone forked repository → make branch and move to branch on forked repository → coding jobs on branch → push → pull request
Etc
refs, reflog
file annotation; blame,
replace; 기존 커밋을 다른 커밋인 것처럼 변경
garbage collect; 연결고리가 없는 고립된 객체들, 주로 리셋/리베이스 등을 자주할 때 발생
prune
rerere(reuse recorded resolution); 어떤 문제로 충돌이 발생할 때 이를 기록
$ git rev-parse 브랜치이름
$ git show 해시값
$ ls .git/refs -all
$ git reflog
$ git blame 파일이름
$ git blame -L 시작줄,마지막줄 파일이름. -e: 사용자 이름 대신 이메일 출력, -w: 공백 문자 무시, -M: 같은 파일 내에서 복사나 이동 감지, -C: 다른 파일에서 이동이나 복사된 것을 감지
$ git replace 커밋ID1 커밋ID2
$ git gc --auto
$ git prune --dry-run --verbose
$ git reflog expire --expire=now --expire-unreachable-now --all
$ git prune --expire now -v
$ git remote prune
$ git fetch --prune
$ git config rerere.enabled true
$ git rerere status
references of git
Git 사용법 정리
*basic concept
workspace -> staging area(index) -> local repository -> remote repository
stash
*file status lifecycle
1. untracked; git에 의해 추적되지 않는 파일. add the file 후 tracked로 변경됨
2. tracked; git에 의해 추적되는 파일. remove the file 하면 untracked로 변경됨
2.1 unmodified; 수정되지 않은 파일. edit the file 후 modified로 변경됨
2.2 modified; 수정된 파일. stage the file
2.3 staged; staging area에 있는 파일. commit 후에는 unmodified로 변경됨
*기본 동작
만들기
(저장소 받아오기)
파일 저장: 생성, 삭제, 수정
로컬 저장소 저장: 생성, 삭제, 수정
원격 저장소 저장: 생성, 삭제, 수정
브랜치: 생성, 삭제, 수정, 이동, 병합
*install git
-Unix/Linux
-Mac
-Windows
*config git
.gitignore
Glob pattern
*starting w/ git
git init; create local repository
git remote add <repository>; connect local repository with remote repository
git pull; get data from remote repository
git clone <repository>
ex) git clone /local/repository/path
ex) git clone user@hostname:/remote/repository/path
*basic commands
git add; workspace -> staging area(index)
git commit -a; workspace -> local repository
git push; local repository -> remote repository
git fetch; remote repository -> local repository
git merge; merge
git pull; fetch & merge
git status; modified, staged or unstaged
git diff; show differences between staged and unstaged
git diff --staged or git diff --cached; show differences between staged and committed
*snapshot
*branch
-create branch
git branch <name>
git checkout <name>
git branch -b <name>; branch & checkout
-delete branch
git branch -d <name>
-merge branch
git checkout master
git merge branch
-list branch
git branch
git branch --no-merged
git branch -merged
*rebase
*tag
-create tag
git tag <name>
git tag -a <name>
-delete tag
git tag -d <name>
-list tag
git tag
*rollback
git checkout --; rollback unstaged file
git reset HEAD; unstage staged file
git fetch origin; rollback commited file
git rest --hard oring/master
*stashing
* gitignore 재 적용
git rm -r --cached .
git add .
git commit -m "git ignore applied and fixed untracked files"
git push
git pull
git add .
git commit -m "git ignore applied"
git push
references