본문 바로가기
프로그래밍 놀이터/Tips

[git] Git Tutorial ( 기초 강좌 ) - 기본 사용 마스터.

by 돼지왕 왕돼지 2012. 11. 10.
반응형




Git Tutorial ( 기초 강좌 ) - 기본 사용 마스터.

Git 시작

git 설정 파일들

- /etc/gitconfig : 시스템의 모든 사용자와 저장소에 적용되는 설정. 아래 명령어로 접근

$ git config --system


- ~/.gitconfig : 특정 사용자에게만 적용되는 설정. 아래 명령어로 접근

$ git config --global

 

- .git/config : git directory 에 있고, 특정 저장소( 현재 작업중인 프로젝트 )에만 적용된다. 아래 명령어로 접근한다. config 적용의 priority 는 local > global > system 이다.

$ git config --local

 

- 아래 명령어로 설정 내용을 확인할 수 있다. 여러개의 설정 파일들이 있기 때문에 중복된 값들이 나올 수 있다. 이 때 나중에 나오는 녀석들이 최종 적용된다.

$ git config --list

 

- specific 한 config 값을 보고 싶으면 아래와 같이 확인할 수 있다.

$ git config user.name


- 도움말을 볼 수 있다.

$ git help <verb>




git 설치 후 최초 해야 하는 일

$ git config --global user.name <userName>
$ git config --global user.email <emailAddress> 

- 프로젝트마다 다른 아이디를 사용하고 싶다면, 해당 프로젝트에서 --local 로 작업하면 된다.

- 한번 커밋되면 사용자 정보는 변경할 수 없다. git 은 추가만 가능하다.




Git 의 기초

git 저장소 만들기

- 방법은 2가지. 기존에 있는 프로젝트를 git 저장소로 만드는 것과 다른 서버에 있는 것을 clone 하는 방법.




기존 프로젝트 git 저장소 만들기

- 해당 프로젝트 폴더로 가서 아래 명령어로 .git 이라는 하위 디렉토리를 만든다.

$ git init


- git repository 에 저장할 파일들을 추가한다.

$ git add <fileName>


- 추가가 끝났으면 commit 한다.

$ git commit -m '<Message>'




다른 서버에 있는 것을 clone 하기

$ git clone <git 주소>

 
- 다른 subversion은 최근의 파일들만을 받아오지만, git 은 저장소의 모든 내용을 다 가지고 온다. (history 포함)

- 특정 폴더에 clone 시킬 수도 있다.

$ git clone <git 주소> <folderName>




수정하고 저장소에 저장하기

- tracked 는 이미 저장소에 관리대상으로 등록된 파일이고, untracked는 관리대상으로 등록되지 않은 파일들이다.

- tracked 파일들은 다시 modified와 unmodified, staged 상태를 갖는다.




파일 상태 확인하기

$ git status




파일 추적 및 stage 화

$ git add <fileName>

- untracked 파일을 tracked 로 만드는데도 사용되고, 변화된 내용을 추가할 때에도 사용된다.
- git add 를 통해 파일을 추가하면 이미 그 시점에서의 snapshot 이 만들어진다. git add를 통해 staged 상태로 만든 파일을 수정하면, 수정된 파일은 unstaged 상태가 된다. 수정한 내용을 다시 반영하고 싶다면 다시 git add 를 해주어야 한다.




파일 무시하기

- 영원히 untracked로 만들고 싶은 파일들이 있을 수 있다. 예를 들면 컴파일된 결과물등이 그렇다. git status를 통해 이런 내용들을 보고싶지 않을 때는 .gitignore 파일을 만들고, 무시할 파일 패턴을 만들어주면 된다.

- .gitignore는 표준 Glob 패턴을 사용하며, 디렉토리는 끝에 /를 붙여준다. !표로 시작하는 패턴은 해당 패턴을 무시하지 않는다는 의미이다.

- Glob 패턴은 [abc]는 안에 있는 문자 중 하나. * 는 전체 ?는 하나. [0-9] 는 범위 중 하나의 syntax 를 가진다.




변경 내용 보기

- 수정했지만, 아직 staged 상태가 아닌 파일들의 변화를 보여준다. unstaged 와 staged 파일을 비교해준다. 

$ git diff

 

- 이미 staged 된 파일의 변경 이력을 보여준다. ( unstaged vs. staged )

$ git diff --cached
$ git diff --staged 




변경 사항 커밋하기

$ git commit -m '<Message>'




Staging Area 생략하기

$ git commit -a -m "<Message>"

-  tracked 된 파일들이 모두 add 되면서 바로 commit 이 된다.




파일 삭제하기

$ git rm <fileName>

- 해당 파일을 저장소에서 삭제하고 더 이상 track하지 않는다. 이 명령은 working copy 도 함께 삭제한다.

$ git rm --cached <fileName>

- 해당 파일의 워킹 카피는 그대로 두고 untrack 상태로만 둔다.




파일 이름 변경하기

$ git mv <fileNameFrom> <fileNameTo>




커밋 히스토리 조회하기

$ git log

- 전체 log 를 보여준다. 가장 최근의 커밋이 최상단에 위치한다.

$ git log -p -2

- p는 diff 결과를 보여주고, -2 는 가장 최근 커밋 2개를 말한다.





되돌리기 ( Undo )

- 한번 Undo 한것은 되돌릴 수 없다.

커밋 수정하기

- 너무 일찍 커밋하거나, 파일을 빼먹었거나, 커밋 메세지를 잘못 적었을 경우 커밋을 수정할 수 있다.

$ git commit --amend

- 실행하면 편집기가 실행되며 이전 커밋메세지가 나오는데 이것을 변경하면 이전 커밋에 대한 커밋 메세지를 변경할 수 있다.




unstaged 상태로 되돌리기

- git add 를 통해 staged상태로 바꾼 파일은 다음 명령어로 unstaged 상태로 만들 수 있다.

$ git reset HEAD <fileName>




modified 된 파일 되돌리기

$ git checkout -- <fileName>

- 수정 이전의 파일로 되돌렸기 때문에 기존에 수정한 내용은 되돌릴 수 없다.





리모트 저장소

리모트 저장소 확인하기

$ git remote
$ git remote -v

- ssh 인 remote url 에만 push 할 수 있다.




리모트 저장소 추가하기

$ git remote add <shortCut> <url>


- 단축이름을 사용하여 fetch를 할 수 있다.

$ git fetch <shortCut>




리모트 저장소를 pull 하거나 fetch 하기

$ git fetch <remoteName>

- fetch 명령은 자동으로 머지하지 않는다. 수동 머지해야 한다.

$ git pull

- fetch 와 merge를 한번에 지원한다.




리모트 저장소에 push 하기

$ git push <remoteName> <branchName>
$ git push origin master 

- 이 명령은 저장소에 쓰기 권한이 있고, clone 한 이후에 아무도 저장소에 push 를 하지 않았을 때에만 사용 가능하다. 다른 사람이 이미 push 를 했다면 push 한 내용을 가져와 머지한 후에 push 를 해야 한다.




리모트 저장소 살펴보기

$ git remote show <remoteName>




리모트 저장소 이름 바꾸거나, 리모트 저장소 삭제하기

$ git remote rename <originalRemoteName> <newRemoteName>


$ git remote rm <remoteName>




Tag

- 보통 릴리즈할 때 사용한다.

Tag 조회하기

$ git tag




Annotated tag

- 이름, 이메일, 태그 만든 날짜, Tag 메세지, 서명 등을 저장한다. 

$ git tag -a <tagName> -m '<Message>'

 

$ git show <tagName>

 - tag정보를 볼 수 있다.
 

- GPG 개인키가 있다면 서명을 할 수 있는데 -a 대신 -s를 사용한다.

$ git tag -s <tagName> -m '<Message>'




Lightweight Tag

- 파일의 체크섬만 추가 저장한다.

$ git tag <tagName>




Tag 검증하기

$ git tag -v <tagName>

- GPG 서명을 검증할 수 있다.




나중에 tag 하기

- 커밋한 후에 태깅을 할 수도 있다.

- git log 를 통해 commit 로그를 보고, checksum을 이용하면 tag를 추후에 달 수 있다.

$ git tag -a <tagName> <commit checksum>




Tag 공유하기

- git push 는 tag를 함께 전송하지 않는다. tag는 따로 전송해주어야 한다.

$ git push origin <tagName>

 

$ git push origin --tags

 - remote server에 없는 모든 태그를 전송할 수 있다.





팁과 트릭

자동완성

- git 소스 contrib/completion 에 git-completion.bash 파일이 있다. 맥이라면 /opt/ local/etc/bash_completion.d 위치에 저장하면 자동완성이 지원된다.




git alias

- 완벽한 명령 없이 축약형 명령을 만들 수 있다.

$ git config --global alias.co chekcout

 - checkout 대신 co 를 사용해도 인식한다.





Git Branch

- 브랜치는 원래 코드에 상관없이 독립적으로 코드 작업을 하고 싶을 때 사용한다.

- 커밋을 하게 되면, 각 파일들에 대한 blob, 파일과 디렉토리 구조를 나타내는 트리 개체 하나, 메타데이터와 루트 트리를 가르키는 포인터 이렇게 3가지 형태가 저장된다.

- 브랜치 생성

$ git branch <branchName>


- HEAD 라는 포인터는 현재 작업중인 브랜치를 가르킨다.

$ git checkout <branchName>

 -새로운 브랜치에 접근할 수 있다.


Branch 와 Merge 의 기초

- 브랜치를 만들고 checkout 까지 한번에 하려면

$ git checkout -b <branchName>


- 브랜치로 작업한 내용을 master 브랜치에 합치려면 

$ git checkout master
$ git merge <otherBranchName> 


- master보다 더 많은 내용을 담고 있는 branch에 대한 merge 이기 때문에 fast forward 머지라 한다. ( 작업한 내용의 커밋이 마스터 브랜치의 커밋보다 더 뒤의 내용 )

- 작업한 브랜치를 삭제하고 싶다면,

$ git branch -d <branchName>




Merge 의 기초

- merge를 할 때 공통 부모가 아니라면, 3-way merge가 발생한다. 3-way merge 후에 commit을 하면 해당 commit은 2개의 merge parent 를 가르킨다. 이런 커밋을 머지 커밋이라고 부른다.

- merge와 commit 이 완료되었다면, 브랜치는 보통 삭제한다.




Conflict 의 기초

- 머지하는 두 브랜치에서 같은 파일의 한 부분을 동시에 수정하고 merge를 하면 git은 해당 부분을 머지하지 못한다. 충돌이 발생하면 git status 명령으로 어느 부분이 충돌이 났는지를 알 수 있다.

$ git status

 

- 충돌을 해결하면 git add 로 충돌해결한 파일들을 다시 add 해준다.

$ git add <conflictedFile>

 

- 충돌이 났을 경우에는 git mergetool 을 이용하여 머지를 처리해줄 수 있다. git mergetool 결과는 바로 자동으로 add 된다.

$ git mergetool

 

- 머지후에는 git status 로 다시 머지상황을 확인하고 commit 해준다.




브랜치 관리

$ git branch


- 현재 존재하는 브랜치를 보여준다. * 붙어있는 녀석은 현재 작업중인 브랜치이다.

$ git branch -v

- 마지막 커밋 내용까지 함께 보여준다.

$ git branch --merged

 - 이미 머지된 브랜치들을 보여준다. * 가 붙어있지 않은 브랜치는 삭제해도 좋은 브랜치들이다.

- 브랜치 삭제는..

$ git branch -d <branchName>


$ git branch --no-merged

- 현재 checkout 된 branch에 머지되지 않은 브랜치들을 보여준다. no-merged 로 표시되는 녀석들은 -d 명령으로 지워지지 않는다. 머지되지 않았기 때문이다




브랜치 워크플로우

긴 호흡 (long-running) 브랜치

- 배포했거나 배포할 코드들만 master 브랜치에 merge 하고, 개발하고 안정화하는 작업들을 하는 브랜치들은 develop 이나 next 라는 브랜치를 추가로 만들어서 관리한다.



토픽 브랜치

- 어떤 한 가지 주제나 토픽을 가지고 만든 브랜치.




리모트 브랜치

- 리모트 브랜치의 이름은 리모트이름/브랜치이름 으로 된다.

Push 하기

- 브랜치를 전송하기 위해서는 명시적으로 브랜치를 push 해야 한다.

$ git push <remoteName> <branchName>
$ git push <remoteName> <localBranchName>:<remoteBranchName> 


- fetch 명령으로 remote branch 를 패치한 것이 수정 가능한 로컬 브랜치가 생기는 것은 아니다. 수정 불가능한 branch pointer 만 받아오는 것으로 머지만 가능한다.

$ git merge <remoteName>/<branchName>


- 리모트 브랜치에서 시작하는 새로운 브랜치를 만들려면

$ git checkout -b <localBranchName> <remoteName>/<branchName>




브랜치 추적 ( branch tracking )

- 리모트 브랜치를 로컬 브랜치로 checkout 하면 자동으로 추적 브랜치가 만들어진다. 추적 브랜치는 리모트 브랜치와 직접적인 연결고리가 있는 브랜치이다. 추적 브랜치에서 git push 명령을 내려도 어떤 리모트 브랜치에 push 해야 하는지 자동으로 연결된다. git pull 을 내리면 자동으로 리모트 브랜치의 내용을 가져와 머지한다.

- 클론을 해올때도 자동으로 master 브랜치에 대해 추적 브랜치를 만든다.



리모트 브랜치 삭제

$ git push <remoteName> :<branchName>

- 명령어의 형태가 조금 이상하지만, 리모트 브랜치를 삭제할 때 사용된다.




Rebase 하기

Rebase 의 기초

- 2개의 브랜치를 합치는 방법은 merge가 있고 rebase가 있다. rebase는 한개의 브랜치를 patch 로 만들어서 나머지 한개의 브랜치에 patch를 적용하는 것을 말한다.

$ git rebase <branchName>

- 머지와 달리 rebase를 하면 브랜치는 모두 머지된 브랜치로 이동한다.

- 리베이스가 히스토리가 linear 하게 깔끔하게 된다. 그래서 remote branch에 깔끔하게 커밋할 때 주로 rebase를 사용한다.

- 머지와 리베이스는 결과물은 같고 히스토리만 다르다.




Rebase 질

$ git rebase master <branchName>




Rebase 의 위험성

- 이미 공개 저장소에 push 한 커밋을 rebase 하면 안된다!

- 즉 리모트에 공유하는 부분에 push 한 커밋을 삭제하고 rebase 하는 일은 해서는 안된다. 



도움이 되셨다면 손가락 꾸욱~ ( 로그인 필요 x )




반응형

댓글