본문 바로가기

JOB Tips

Git 명령어 정리

출처 : http://luhamizz.tistory.com/9

저장소 (Repository) : User가 변경한 모든 내용을 추적하는 공간
작업 트리 (Working tree) : 저장소를 어느 한시점을 바라보는 User의 현재 시점이다. 예를 들자면 2010년 2월 3일 처음 저장소를 만들었다고 하자. 만약 User가 2월 4일의 저장소 내용을 보고 있다면 작업 트리는 2월 4일에 저장소가 된다. SVN에서는 이를 working copy 라고 한다. 
※ SVN 같은 버전 관리 시스템에서 저장소가 다른 서버에 존재하지만, Git 에서는 저장소가 프로젝트 Directory에 있는 ./git directory를 의미한다. 
체크 아웃(check out) : User의 작업트리를 저장소의 특정 시점과 일치하도록 변경하는 작업.
스테이징 영역 : 저장소에 커밋하기 전에 커밋을 준비하는 위치. 변경사항을 적용하기 전에 한번더 변경사항을 정리하고 다듬을 수 있는 기회를 제공한다. 변경사항을 추가하기 위해서는 git add를 사용한다. 커밋 예정인 변경사항이 있다고 보면 된다. 

1. 설정 및 초기화 작업
# 버전 확인
prompt> git --version

# 커밋하면 표시되는 이름 저장
prompt> git config --global user.name "paul ahn"

# 변경 사항에 대해 문의를 할 때 사용하는 이메일 주소
prompt> git config --global user.email "paul717@gmail.com"

# Git을 실행했을때 결과에 색깔이 적용되어 보이는 명령어.
prompt> git config --global color.ui "auto"

# 설정값을 확인
prompt> git config --global --list


2. 기본 사용 법
# 커밋 로그를 확인
prompt > git log
rompt > git log -num(보고 싶은 커밋의 갯수로 설정, 1,2,3….)

# 저장소의 현재 시점인 작업 트리의 상태를 보여줌.
prompt > git status


3. 변경사항을 커밋하는 방법
# git add 를 호출하는 방법
- git add
- git add -p : 변경한 일부분만을 추가
- git add -i : 대화형 모드로 add

prompt> git add some-file
prompt> git commit -m "changes to some-file"

# git commit에 -a 매개변수를 지정하는 방법
- 작업 트리의 가장 최근 버전으로 저장소에 커밋.
- '-a' 새로운 파일이나 추적하지 않는 파일을 추가하지 않는 파일을 추가하지 않으며, 기존에 추적한 파일만 추적한다.

 prompt> git commit -m "changes to some-file" -a

# 커밋하려는 하나 이상의 파일을 지정.
 Git에 저달하기를 원하는 모든 옵션을 지정한 후에 커밋하려는 각 파일을 추가한다. -a 매개변수와 마찬가지로 이 방법도 작업 트리의 가장 최신 버전을 커밋하지만 단지 지정한 파일만 커밋하는 차이가 있다. 

prompt> git commit -m "changes to some-file" some-file


4. 변경사항을 비교하기
작업 트리, 스테이징된 변경사항, 저장소의 차이점을 비교할 수 있다. 각각의 비교 방법은 다음과 같다. 여기서 작업 트리라고 하는 것은 아직 스테이징도 되지 않고 커밋도 되지 않은 작업트리의 변경사항을 말하는 것이다. 
#작업트리와 스테이징 영역을 비교.
prompt> git diff

#스테이징 영역과 저장소를 비교
prompt> git diff --cached

#작업 트리, 스테이징 영역, 저장소 모두를 비교
prompt> git diff HEAD

5. 파일 관리
#파일 이름을 변경하고 이동하기
prompt> git mv old-name_file new-name-file
prompt> git commit -m "rename file"

#git은 파일명이 아니라 파일의 내용을 보기 때문에 복사하기 기능을 지원하지 않는다. 

# 버전관리를 하는 대상에서 특정파일을 무시하기 위해서는 .gitignore 파일에 특정 파일을 추가한다. 



브렌치(branch) : 브랜치 라는 것을 하나의 개발 라인을 의미한다. (we will use the word  "branch" to mean a line of development.) 한개의 프로젝트에서도 여러개의 개발 라인이 존재할 수 있다. 가장 기본이 되는 master branch에서 버그 수정이나 특정 기능을 추가하기 위해서 개발라인을 따루 두어 작업할 수도 있다. 이러한 브랜치에는 HEAD(branch head) 라는 것이 있는데 이는 한개의 브랜치 내에서 가장 최근에 된 커밋을 가리키는 reference이다. 예를 들면 "branch apple" 에 3개의 commit이 있는데 이중 가장 최근에 추가된 커밋이 HEAD가 된다. 

1. 브랜치 기본 명령어

# 브랜치 리스트를 보여줌.
prompt> git branch

# <new-branch>라는 이름으로 새로운 브랜치를 생성한다. 생성되는 브랜치는 현재 working tree가 있는 위치(현재 브랜치의 같은 포인트로)를 참조한다. 
prompt> git branch new-branch 

# <starting-point>를 참조하여 <new-branch>라는 이름으로 새로운 브랜치를 생성한다. <starting-branch>는 특정 브랜치나 태그를 참조할 수 있다. 
prompt> git branch new-branch starting-point

# 브랜치를 삭제
prompt> git branch -d <deleted-branch>

# 현재 브랜치를 <selected-branch>로 만든다.
prompt> git checkout selected-branch

# <starting-point>를 참조하여 <new-branch>라는 이름으로 새로운 브랜치를 생성하고 checkout을 한다. 
prompt> git checkout -b new-branch starting-point


2. 브랜치 변견사항 합치기

#Straight Merge
하나의 브랜치와 다른 브랜치의 변경 전체를 합치는 방법
prompt> git checkout master
prompt> git merge alternate //master에서 alternate의 브랜치 변경 사항을 그대로 합치기.

#Squashed Commit
한 브랜치의 이력을 압축하여 다른 브랜치의 최신 커밋 하나로 만드는 방법
prompt> git checkout master
prompt> git merge --squash alternate //master에서 alternate의 브랜치 변경사항을 압축하여 하나의 커밋으로 합치기.
prompt> git commit -m "...."

#Cherry picking
다른 브랜치에서 하나의 커밋을 가져와서 현재 브랜치에 적용하는 방법
prompt> git commit -m "commit" -a
Created commit 2asdf23: add secondary email

prompt> git checkout master
prompt> git cherry-pick 2asdf23


#Cherry picking 을 여러번 할 경우
prompt> git commit -m "commit" -a
Created commit 2asdf23: add secondary email

prompt> git checkout master
prompt> git cherry-pick -n 2asdf23 //여러번을 할 수 있게 된다. 

prompt> git commit

#변경사항을 취소하기
prompt> git reset --hard HEAD^



자신의 작업을 공유하고 다른 개발자의 작업을 가져오려고 할 때 원격 저장소를 사용하여 다른 개발자와 협업을 할 수 있다. 


기본 용어 정리

- origin은 git이 가져온 저장소를 가리키는 것이라고 보면된다.  
ex > git remote add origin Public-repository
- master는 저장소를 복사해올 때 해당하는 저장소의 HEAD 카피본이다. 


# 원격 저장소 복제 하기 
prompt> git clone git://test.com/mysite-test.git

# 모든 원격 브랜치 목록 보기
prompt> git branch -r

#  변경 사항을 원격 저장소에 올리는 명령어
prompt> git push
prompt> git push --dry-run //
prompt> git push ssh://yourserver.com/~you/proj.git local-branch:public-branch
//<local-branch>에서 <public-branch>로 전달하기
prompt> git push ssh://yourserver.com/~you/proj.git local-branch
//<local-branch>에서 원격저장소의 동일한 이름의 브랜치로 전달하기 만약 없으면 새로운 로컬 브랜치를 원격 저장소에 푸싱한다.

#원격 태그에서 지역 브랜치 생성하기
prompt> git branch new-branch public-branch

#origin  저장소에서 합치지 않고 지역 브랜치로 변경사항 가져오기
prompt> git fetch

#원격 저장소에서 합치지 않고 지역 브랜치로 변경사항 가져오기
prompt> git fetch public-branch

#원격 저장소에서 변경사항을 가져와 현재 브랜치에 합치기
prompt> git pull local-current-branch

#origin 저장소에서 변경사항을 가져와 현재 브랜치에 합치기
prompt> git pull



Tip : repo 를 이용해서 안드로이드에서 소스를 받고 특정 버전으로 전체 소스를 checkout 하는 방법
prompt> repo sync
android/build 로 가서 작업
prompt> git branch  // project-name 이 나오지 않으면
prompt> repo start project-name all  // branch 붙어 있으면 pass
prompt> git tag l 
prompt> repo forall c git checkout tag-name //이렇게 하면 전체 소스가 특정버전으로 빌드가 된다.