git
이란 Source Code관리를 위한 분산 버전 관리 시스템이다.
최초로 리눅스 토발즈가 리눅스 커널 개발에 이용하려고 개발하였다.
코드 버전을 관리함으로써, 배포후 major bug 발생시 빠르게 rollback 하거나 수정된 코드만을 파악하여 bug를 빠르게 찾거나, 한 프로젝트의 코드를 여러 사람이 함께 작업 할 수 있도록 도와주는 등 사용하면 많은 이점을 가지고 있다.
git의 저장소는 3가지 단계로 나누어 진다.
Commit한 Source가 보관되는 Repository
현재 프로젝트 파일들이 있는 Working Tree
Repository
와 Working Tree
의 버퍼영역으로 Commit될 대상이 저장되는 Staging Area
git
은 빈 디렉토리는 추적하지 않는다.
형상관리를 하지 않을 파일은 .gitignore
파일에 추가한다.
HEAD
는 현재 브랜치의 가장 최신 Commit을 의미한다.
기본 원격 저장소를 origin
이라고 부른다.
git config --global --list
현재 설정정보 조회할 수 있다.
--global
옵션은 전역설정에 대한 옵션이며 현재 프로젝트에만 적용할때는 주지 않는다.
git config --global user.name "사용자명"
사용자명을 등록한다. (필수)
git config --global user.email "이메일주소"
이메일 주소를 등록한다. (필수)
git config --global color.ui “auto”
터미널에 표시되는 메시지에 컬러를 표시해준다.
git --version
현재 git의 버전을 확인한다.
git init
현재 디렉토리에 git 저장소를 생성한다.
git add 파일명
git add
는 2가지 기능을 수행 하는데 untracked files의 파일들을 git가 추적하도록 하거나 파일은 수정했지만 아직 스테이징 영역에 올라가지 않은(Changed but not updated) 파일들을 스테이징 영역에 올린다.
-i
옵션을 주면 대화형모드가 시작되며 파일의 일부분만 선택해서 스테이징하는 것이 가능하다.
-p
옵션을 사용하면 -i
대화형모드없이 바로 패치모드를 사용할 수 있다.
git commit -m "커밋메시지"
스테이징 영역에 올라가 있는 파일들을 커밋한다.
-m
은 커밋메시지를 주는 옵션으로 여러 줄의 커밋메시지를 쓸 경우 -m
을 여러개 사용할 수 있다.
-a
옵션을 사용하면 스테이징에 올리는 작업과 커밋을 동시에 할 수 있습니다.
이때 추적되지 않는 파일은 추가하지 않는다.
-m
을 사용하지 않을때 -v
옵션을 사용하면 편집기에 커밋하려는 변경사항의 다른점을 보여준다.
특정파일만 커밋하려면 마지막에 파일명을 추가해주면 된다.
git commit -C HEAD -a --amend
지정한 커밋의 로그메시지를 다시 사용하여 기존커밋을 수정한다.
-c
를 사용하면 기존메시지를 수정할 수 있는 편집기를 실행한다.
git status
커밋되지 않은 변경사항을 조회한다.
git diff
스테이징영역과 현재 작업트리의 차이점을 보여준다.
--cached
옵션을 추가하면 스테이징영역과 저장소의 차이점을 볼 수 있다.
git diff HEAD
를 입력하면 저장소, 스테이징영역, 작업트리의 차이점을 모두 볼 수 있다.
파라미터로 log와 동일하게 범위를 지정할 수 있으며 --stat
를 추가하면 변경사항에 대한 통계를 볼 수 있다.
git mv 파일명 새파일명
기존에 존재하는 파일을 새파일로 이동한다.
변경이력은 그대로 유지한다.
git checkout -- 파일명
아직 스테이징이나 커밋을 하지 않은 파일의 변경내용을 취소하고 이전 커밋상태로 돌린다.
svn
에서 revert
와 동일하다.
git branch
현재 존재하는 브랜치를 조회한다.
-r
옵션을 사용하면 원격저장소의 브랜치를 확인할 수 있다.
git branch 브랜치명B 브랜치명A
브랜치명A에서 새로운 브랜치 브랜치명B를 만든다.
git에서 기본 브랜치는 master라는 이름을 사용
git branch 브랜치명
브랜치명의 새로운 브랜치를 만든다.
체크아웃은 하지 않는다.
git branch -d 브랜치명
브랜치를 삭제한다.
git branch -m 존재하는브랜치명 새로운브랜치명
존재하는 브랜치를 새로운브랜치로 변경한다.
이미 존재하는 브랜치명이 있을 경우에는 에러가 나는데 -M
옵션을 사용하면 이미 있는 브랜치의 경우에도 덮어씌운다.
git tag 태그명 브랜치명
브랜치명의 현재시점에 태그명으로 된 태그를 붙힌다.
git tag
만 입력하면 현재 존재하는 태그 목록을 볼 수 있다.
git checkout 브랜치명/태그명
해당 브랜치나 태그로 작업트리를 변경한다.
git checkout -b 브랜치명B 브랜치명A
브랜치명A에서 브랜치명B라는 새로운 브랜치를 만들면서 체크아웃을 한다.
git rebase 브랜치명
브랜치명의 변경사항을 현재 브랜치에 적용한다.
git merge 브랜치명
브랜치명의 브랜치를 현재 브랜치로 합친다.
--squash
옵션을 주면 브랜치명의 모든 커밋을 하나의 커밋으로 만든다.
git cherry-pick 커밋명
커밋명의 특정 커밋만을 선택해서 현재 브랜치에 커밋으로 만든다.
-n
옵션을 주면 작업트리에 합치지만 커밋은 하지 않기 때문에 여러개의 커밋을 합쳐서 커밋할 수 있다.
git log
커밋 로그들을 볼 수 있으며 -1나 -2같은 옵션을 주어 출력할 커밋로그의 갯수를 지정할 수 있다.
--pretty=oneline
옵션을 주면 한줄로 간단히 보여주고,
--pretty=format:"%h %s"
처럼 형식을 정해줄 수 도 있다.
-p
옵션을 사용하면 변경된 내용을 같이 보여준다.
--since="5 hours"
이나 --before="5 hours"
같은 옵션도 사용가능하다.
--graph
옵션을 주면 브랜치 트리를 볼 수 있다.
git log 커밋명
해당 커밋명의 로그를 볼 수 있다.
커밋명A..커밋명B ..
와 같이 입력하면 커밋명A이후부터 커밋명B까지의 로그를 볼 수 있다.
^
은 -1과 동일해서 HEAD^
라고 하면 최신바로 이전 커밋이고 HEAD^^^
와 같이 쓸 수 있으며 HEAD~3
을 하면 HEAD
의 3개 이전의 커밋을 의미 한다.
git blame 파일명
갈 줄 앞에 커밋명과 커밋한 사람등의 정보를 볼 수 있다.
git blame -L 10,15 파일명
-L
옵션을 사용하면 10줄부터 15줄로 범위를 지정해서 볼 수 있고, 15대신 +5와 같이 사용할 수 있다.
숫자의 범위 대신 정규식도 사용이 가능하다.
git blame -M 파일명
-M
옵션을 사용하면 반복되는 패턴을 찾아서 복사하거나 이동된 내용을 찾아준다.
-C -C
옵션을 사용하면 파일간의 복사한 경우를 찾아준다.
-C -C
는 git log에서도 사용가능하며 내용의 복사를 찾을때는 git log에서 -p
옵션을 사용합니다.
git revert 커밋명
기존의 커밋에서 변경한 내용을 취소해서 새로운 커밋을 만든다.
-n
옵션을 사용하면 바로 커밋하지 않기 때문에 revert를 여러번한 다음에 커밋할 수 있다.
단, 항상 최신의 커밋부터 revert 해야한다.
git reset 커밋명
이전 커밋을 수정하기 위해서 사용한다.
--soft
옵션을 사용하면 이전 커밋을 스테이징하고 커밋은 하지 않으며,
--hard
옵션은 저장소와 작업트리에서 커밋을 제거한다.
git reset HEAD^
와 같이 입력하면 최근 1개의 커밋을 취소할 수 있다.
git rebase -i 커밋범위
-i
옵션으로 대화형모드로 커밋 순서를 변경하거나 합치는 등의 작업을 할 수 있다.
git clone 저장소주소 폴더명
원격저장소를 복제하여 저장소를 생성한다.
폴더명은 생략가능하다.
git fetch
원격저장소의 변경사항 가져와서 원격브랜치를 갱신한다.
git pull
git fetch
에서 하는 원격저장소의 변경사항을 가져와서 Local Branch에 합치는 작업을 한꺼번에 수행 한다.
파라미터로 풀링할 원격저장소와 반영할 지역브랜치를 줄 수 있다.
git push
파라미터를 주지 않으면 origin 저장소에 푸싱하며 현재 지역브랜치와 같은 이름의 브랜치에 푸싱한다.
--dry-run
옵션을 사용하면 푸싱된 변경사항을 확인할 수 있다.
로컬에서 tag를 달았을 경우에 기본적으로 푸싱하지 않기 때문에 git push origin 태그명
이나 모든 태그를 올리기 위해서 git push origin --tags
를 사용해야 한다.
git remote add 이름 저장소주소
새로운 원격 저장소를 추가한다.
git remote
추가한 원격저장소의 목록을 확인할 수 있다.
git remote show 이름
해당 원격저장소의 정보를 볼 수 있다.
git remote rm 이름
원격저장소를 제거한다.
git submodule
연관된 하위모듈을 확인할 수 있다.
git submodule add 저장소주소 서브모듈경로
새로운 하위모듈을 해당경로에 추가한다.
추가만 하고 초기화 하지는 않으면 커밋 해쉬 앞에 마이나스(-) 표시가 나타난다.
git submodule init 서브모듈경로
서브모듈을 초기화한다.
git submodule update 서브모듈경로
서브모듈의 변경사항을 적용한다.
저장소의 최신커밋을 추적하지 않는다.
git archive --format=tar --prefix=폴더명/ 브랜치혹은태그 | gzip > 파일명.tar.gz
git archive --format=zip --prefix=폴더명/ 브랜치혹은태그 > 파일명.zip
해당 브랜치나 태그를 압축파일로 만든다.
--prefix
를 주면 압축하일이 해당 폴더 안에 생성되도록 할 수 있다.
git mergetool
설정에 merge.tool
의 값에 있는 머지툴을 찾아서 실행한다.
git gc
저장소의 로그를 최적화 한다.
로그가 변경되지는 않고 저장하는 방식만 최적화한다.
--aggressive
옵션을 주면 더 자세하게 최적화한다.
git rev-parse --show-toplevel
git 저장소내에서 입력하면 루트 디렉토리를 알려준다.
git init : git 생성하기
git clone git_path : 코드가져오기
git checkout branch_name : 브랜치 선택하기
git checkout -t remote_path/branch_name : 원격 브랜치 선택하기
git branch branch_name : 브랜치 생성하기
git branch -r : 원격 브랜치 목록보기
git branch -a : 로컬 브랜치 목록보기
git branch -m branch_name change_branch_name : 브랜치 이름 바꾸기
git branch -d branch_name : 브랜치 삭제하기
git push remote_name — delete branch_name : 원격 브랜치 삭제하기 ( git push origin — delete gh-pages )
git add file_path : 수정한 코드 선택하기 ( git add * )
git commit -m “commit_description” : 선택한 코드 설명 적기 ( git commit -m “내용”)
git push romote_name branch_name : add하고 commit한 코드 git server에 보내기 (git push origin master)
git pull : git서버에서 최신 코드 받아와 merge 하기
git fetch : git서버에서 최신 코드 받아오기
git reset — hard HEAD^ : commit한 이전 코드 취소하기
git reset — soft HEAD^ : 코드는 살리고 commit만 취소하기
git reset — merge : merge 취소하기
git reset — hard HEAD && git pull : git 코드 강제로 모두 받아오기
git config — global user.name “user_name ” : git 계정Name 변경하기
git config — global user.email “user_email” : git 계정Mail변경하기
git stash / git stash save “description” : 작업코드 임시저장하고 브랜치 바꾸기
git stash pop : 마지막으로 임시저장한 작업코드 가져오기
git branch — set-upstream-to=remote_path/branch_name : git pull no tracking info 에러해결
Git 명령어 정리[Outsider's Dev Story]
자주 사용하는 기초 Git 명령어 정리하기[Andrew park]