820 likes | 982 Views
What is git & How to use git. By Nakhyun Choi ( bbashong ). 가여운 프로그래머가 한명있다 . 이창원 (21 세 , 남 ) 그에게는 두가지 고민이 있다 . 첫 번째 고민. 내가 개발하고 있는 프로그램 A 가 잘못 되었을 때 과거의 어떤 시점으로 다시 되돌아가고 싶어 !. 그의 해결법. 프로젝트에 변경 사항이 있을 때 마다 프로젝트 폴더 전체를 복사해서 다른이름으로 저장해두자 !
E N D
What is git &How to use git By Nakhyun Choi (bbashong)
가여운 프로그래머가 한명있다. • 이창원 (21세, 남) • 그에게는 두가지 고민이 있다.
첫 번째 고민 • 내가 개발하고 있는 프로그램 A가 잘못 되었을 때 과거의 어떤 시점으로 다시 되돌아가고 싶어!
그의 해결법 • 프로젝트에 변경 사항이 있을 때 마다 프로젝트 폴더 전체를 복사해서 다른이름으로 저장해두자! • 조금 많이 귀찮겠지만 개발하다 삐끗해서 전체 프로젝트를 날리는 것 보단 났겠지..
두 번째 고민 • 다른 프로그래머인 박보영(43세, 남) 씨와 같은 프로젝트를 함께 진행하고 싶어!
그의 해결법 • 프로젝트에 변경사항이 있을 때 마다 전체 프로젝트 폴더를 서로에게 Email로 보내서 싱크를 맞추자!
어떻게 됬을까? • 처음 서너번은 잘 프로젝트를 복사해 두었지만 너무 귀찮아서 안하게 되었다. • 몇달 뒤, 개발중 치명적인 버그가 생겨서 다시 예전으로 돌아가려 했지만 코드가 너무 꼬여 처음부터 다시 짜게 되었다. • 프로젝트에 신입 팀원이 10명 추가되었다. • 이제 그는 프로그램을 한번 수정할 때 마다 11명의 팀원에게 메일을 보내야 한다다. • 이제 그는 11명의 팀원이 보낸 메일을 받아야 한다.
좀 더 멋진 해결법이 없을까? • VCS(Version Control System)을 사용한다.
VCS(Version control System)? • 각 파일, 전체 프로젝트를 이전 상태로 되돌릴 수 있다. • 시간에 따라 수정 내용을 비교해 볼 수 있다. • 누가 문제를 일으켰는지 추적해 볼 수 있다. • CVCS나 DVCS를 사용하면 쉽게 다른 프로그래머와 협업할 수 있다.
CVCS vs DVCS • CVCS(Centralized VCS) : 중앙 집중식 버전 관리 시스템 • DVCS(Distributed VCS) : 분산형 버전 관리 시스템
CVCS의 특징 • 모든 파일을 관리하는 서버가 따로있고 많은 클라이언트가 이 중앙 서버에서 파일을 받아서 사용한다(Checkout). • 관리하기가 쉽다 • Subversion이 대표적인 예이다.
But, • 만약 중앙서버가 한시간 동안 다운되면 아무도 다른사람과 협업할 수 없고 했던 일을 백업할 수도 없다. • 만약 중앙서버의 하드디스크에 문제가 생기면 프로젝트를 복구할 수 없다.
DVCS의 특징 • 전체 저장소를 클라이언트가 가지고 있다. • 중앙서버가 다운되거나 인터넷을 사용 할 수 없어도 충분히 작업을 진행할 수 있다. • 중앙서버의 하드디스크에 문제가생겨도 클라이언트의 저장소로 복구할 수 있다. • 대표적으로 동아리에서 자주 사용되는 mercurial(hg)와 git이 있다.
git? • DVCS이다. • 리눅스의 창시자인 리누스 토발즈가 원래 사용하고 있던 BitKeeper라는 VCS를 사용할 수 없게 되면서 직접 VCS를 개발하였다.
git? • Git은 다음과같은 4가지 목표를 가지고 개발되었다. • 빠른 속도 • 단순한 구조 • 비 선형적인 개발(동시 다발적인 수천개의 branch) • 완벽한 분산
Git을 배우려면 Subversion이나 Perforce 같은 다른 VCS를 사용하던 경험을 지워버려야 한다. (물론 다른 vcs를 사용한 경험이 있는 사람만)
거의 모든 명령을 로컬에서 실행한다. • 다른 vcs에 비해 미친듯이 빠른 속도를 가진다. • 오프라인 상태에서도 commit 하고 비교할 수 있다.
Git은 무조건 데이터를 추가하기만한다 • git으로 무얼하던 데이터는 추가되기만 한다. • 손실되는 데이터는 절대 없다. • 프로젝트가 망가질 걱정 없이 재미있는 실험들을 해볼 수 있다.(물론 git을 잘 쓸 줄 알면)
Git기본설정 설치는 그냥 apt-get 하면 됩니다. 따라해보세요emacs 쓸줄 모르잖아요..
Git의 3가지 설정 파일 • /etc/gitconfig파일: 시스템의 모든 사용자와 모든 저장소에 적용되는 설정이다. git config --system 옵션으로 이 파일을 읽고 쓸 수 있다. • ~/.gitconfig파일: 특정 사용자에게만 적용되는 설정이다. git config --global 옵션 으로 이 파일을 읽고 쓸 수 있다. • .git/config: 이 파일은 Git Directory에 있고 특정 저장소(혹은 현재 작업 중인 프로 젝트)에만 적용된다. 각 설정은 역순으로 우선시 된다. 그래서 .git/config가 /etc/ gitconfig보다 우선한다.
사용자 정보 • $ git config --global user.name"John Doe"$ git config --global\user.emailjohndoe@example.com
편집기 • $ git config --global core.editorvi
Diff 도구 • $ git config --global merge.toolvimdiff
설정 확인 • $ git config --list
Tip • git source code 의 contrib/completion 의git-completion.bash를 홈디렉에 숨김파일로 복사하고 • .bashrc file에 source ~/.git-completion.bash 을 추가하면 자동완성을 사용할 수 있다. • Git-completion.bash를 찾기 귀찮으면 arari서버의 bbashong홈디렉에 있으니 복사해가면됨.
git의 기초 지금부터 하는 모든 내용은 remote 서버와 관련 없이, 인터넷 연결 없이,local에서 할 수 있는 내용 들 입니다.remote서버에 연결해서 협업하는 부분은 더 뒤에 설명할 것 입니다.
저장소 clone하기 • $git clone yourID@arari.sparcs.org:/arari.git • Ssh프로토콜로 git repository를 클론한다.
하지만 이번 실습에선! • 서버에서 받지 말고 각자 개인의 repository를 만들어서 실습을 해봅시다. • working directory를 만들고 그 directory 안에서 • $gitinit
기억하세요 • 아까 말씀드린 git에서 file의 3가지 상태를 기억하세요.
실습 • 다같이 arari.sparcs.org로 ssh접속을 해보고 저를 따라해보세요
기본 명령어 • git status • git add • git commit& git commit -a • Staged의 개념 • 파일 무시하기 (.gitignore file)
diff 사용법 • git diff : staged된 data와 working directory의 data를 비교한다 • git diff --cached or git diff --staged : 저장소에 commit된 data와 staged된 data를 비교한다.
파일 삭제와 이름 변경 • gitrm • git mv
commit log 확인 • git log • 옵션 설명-p 각 커밋에 적용된 패치를 보여준다.--stat 각 커밋에서 수정된 파일의 통계정보를 보여준다.--shortstat `--stat` 명령의 결과 중에서 수정한 파일, 추가된 줄, 삭제된 줄만 보여준다.--name-only 커밋 정보중에서 수정된 파일의 목록만 보여준다.--name-s tatus수정된 파일의 목록을 보여줄 뿐만 아니라 파일을 추가한 것인지, 수정한 것인지, 삭제한 것 인지도 보여준다.--abbrev-commit 40자 짜리 SHA-1 체크섬을 전부 보여주는 것이 아니라 처음 몇 자만 보여준다. --relative-date 정확한 시간을 보여주는 것이 아니라 `2 주전`처럼 상대적인 형식으로 보여준다. --graph 브랜치와 머지 히스토리 정보까지 아스키 그래프로 보여준다.--pretty 지정한 형식으로 보여준다. 이 옵션에는 oneline, short, full, fuller, format이 있다. format 은 원하는 형식으로 출력하고자 할 때 사용한다.
log format argument • Option Description of Output %H Commit hash%h Abbreviated commit hash %T Tree hash • %t Abbreviated tree hash%P Parent hashes%p Abbreviated parent hashes%an Author name%ae Author e-mail%ad Author date (format respects the –date= option) %ar Author date, relative%cn Committer name%ce Committer email%cd Committer date%cr Committer date, relative%s Subject
조회 제한 • -(n) 최근 n 개의 커밋만 조회한다.--since, --after 명시한 날짜 이후의 커밋만 검색한다. --until, --before 명시한 날짜 이전의 커밋만 조회한다. --author 입력한 저자의 커밋만 보여준다.--committer 입력한 커미터의 커밋만 보여준다. • git log hash.value
커밋 수정하기 • $git commit --amend • $gitreset HEAD <file>.. • $git checkout <file>
branch git의 핵심 git의 앙꼬
branch란? • commit사이를 자유롭게 움직이며 특정 commit을 가리키는 포인터 같은 것이다.
merge의 개념 • 1. 작업 중인 웹사이트가 있다.2. 새로운 이슈를 처리할 새 Branch를 하나 생성.3. 새로 만든 Branch에서 작업 중. • 그런데 작업도중에 hotfix를 당장 만들어야 하는 일이 생겼다. • 1. 새로운 이슈를 처리하기 이전의 운영(Production) 브랜치로 복원. 2. Hotfix 브랜치를 새로 하나 생성.3. 수정한 Hotfix 테스트를 마치고 운영 브랜치로 Merge.4. 다시 작업하던 브랜치로 옮겨가서 하던 일 진행.