Structure - Internal Structure - Internal Git은 단순히 key-value 데이터 저장소 -> Content-addressible 파일 시스템 Tree 유닉스의 디렉토리 항목을 여러 개 가질 수 있음 Blob Inode에 대응 Blob 개체나 하위 Tree를 가리키는 SHA-1 포인터, 파일 모드, 파일 이름, 개체 타입을 가짐 git cat-file -p master^{tree} master 브랜치가 가리키는 Tree 개체 Commit 개체 Tree를 가진 Snapshot을 불러내기 위한 SHA-1 값이 저장됨 누가, 언제, 왜 등의 정보를 가짐 refs 마지막 커밋의 SHA-1값 포인터를 쉬운 이름으로 사용 즉 refs/heads/master는 master의 가장 마지막 커밋을 가리킴 cat .git/H.. Structure - Directory Structure - Directory .git 디렉토리 구성요소 HEAD 현재 Checkout한 브랜치를 가리킴 branches 예전 버전에서만 사용 config description gitWeb 프로그램에서만 사용 hooks Client나 Server 훅/ index Staging Area 정보를 저장 info .gitignore 파일과 같이 무시할 패턴 등을 작성 Git으로 관리되지 않음 objects 모든 컨텐트를 저장하는 데이터베이스 refs Commit 개체의 포인터를 저장 HEAD, index, objects와 refs 가 핵심 Configure Configure Git은 /etc/gitconfig 파일을 우선 적용하고 ~/.gitconfig 파일을 찾아서 적용 git config --system /etc/gitconfig git config --global ~/.gitconfig git config --global core.editor emacs Emacs로 편집기 실행 Commit message 설정 .gitmessage.txt 파일 생성 (원하는 commit message) git config --global commit.template .gitmessage.txt git commit git config --global user.signingkey git tag -s GPG 키를 설정해두어 Tag 만들 때 키를 하지 않아도 서명됨 git c.. blame blame 파일 어노테이션 git blame -C -L 12,22 test.java 12부터 12줄까지 누가 마지막으로 고쳤는지 나옴 -C 는 파일이 리팩토링되어 변경되었어도 찾아줌 filter-branch filter-branch 모든 Commit에서 특정 파일 삭제나 이메일 정보를 변경 시 유용 git filter-branch --tree-filter 'rm -f passwords.txt' HEAD passwords.txt 파일이 있으면 삭제 --tree-filter 프로젝트를 Checkout한 후에 각 Commit에 명시한 명령어를 실행하고 다시 Commit 함 git filter-branch --commit-filter ' if [ "$GIT_AUTHOR_EMAIL" = byounghong@localhost ]; then GIT_AUTHOR_NAME="hong"; GIT_AUTHOR_EMAIL=hong@example.com; git commit-tree "$@"; else git commit-tree.. Stash Stash git stash stash 저장 git stash list stash list 보기 git stash apply --index (stash 이름) git stash drop stash 제거 git stash branch newBranch Stash를 가진 새로운 브랜치를 만듬 Interactive Interative git add -i 원하는 파일만 update, revert 할 수 있음 Server Server Protocol Local, SSH, Git, HTTP(선택) 사용 가능. Local 단순히 다른 디렉토리에 원격 저장소가 있어서 파일시스템을 팀원이 공유하고 있을 때 사용 git clone /opt/git/progect. git 또는 git clone file:///opt/git/project.git git remote add local_git /opt/git/progect.git SSH HTTP와 Git Protocol은 단순히 읽기만 가능하지만 SSH는 쓰기도 가능 git clone ssh://user@server:project.git 또는 git clone user@server:progject.git Install Bare 저장소(Working Directory가 없는 저장소) 만들기.. Tip Tip 자동 완성 cp git 소스 코드/contrib/completion/git-completion.bash /~ vi .bashrc source ~/.git-completion.bash 모든 사용자 사용법 cp git-completion.bash /etc/bash_completion.d/ Alias git config를 사용 git config --global alias.ck checkout git ck로 checkout 가능 git config --global alias.unstage 'reset HEAD --' git config --global alias.last 'log -1 HEAD' 최근 Commit 외부 명령 시 ! 사용 git config --global alias.gui '!gitk' Tag Tag Release 시 사용 git tag git tag -l 'v1.4.*' 1.4 버전의 Tag만 검색 Tag 생성 git tag -a v1.4 -m 'my version' git show Tag 정보와 커밋 정보 확인 가능 Tag 서명 git tag -s v1.5 -m 'my version' Tag 검증 git tag -v TAG이름 Tag 공유 하나만 git push origin TAG이름 여러개 git push origin --tags Tag 가져오기 repo forall -c git reset --hard TAG이름 repo forall -c git clean -xdf Remote Remote git remote -v 현재 프로젝트에 등록된 원격 저장소 정보 orgin에만 push 가능 Ex. git remote add 저장소이름 저장소Url git fetch 저장소이름 git push 저장소이름(origin) 브랜치이름(master) git pull 원격 저장소 브랜치 데이터를 모두 가져오고 자동으로 Merge git remote rename a b a에서 b로 저장소 이름 변경 git remote rm b b 저장소 삭제 Amend Amend git commit --amend 완료한 Commit을 수정할 때 (파일 누락 이나 추가 수정) git commit -m 'init' git add a.java git commit --amend git reset HEAD 파일명 해당 파일을 Unstage 상태로 변경 Commit에 들어 있는 파일을 뺌 git checkout -- 파일명 해당 파일이 수정되어 있다면, 수정되기 전으로 변경 즉, Reset 이전 1 2 다음