2010년 5월 28일 금요일

git 사용법 요약

master - 메인 작업 브랜치 포인터.
HEAD - 현재 작업하는 브랜치를 가리키는 포인터.

commit을 실행하면 현재 작업본의 브랜치(HEAD가 가리키는 브랜치)는 자동으로 커밋에 따라 새로운 스냅샷으로 진행.

merge는 HEAD가 가리키는 브랜치로 지정한 브랜치의 내용을 합치게됨.


fetch는 원격지의 데이터를 모두 수집해옴. ( 진행상태, 모든 브랜치 등등..). 그냥 최신정보로 갱신.
원격지에서 받아온 브랜치는 HEAD가 바로 가리킬수 없음. 즉, 편집불가.

원격지에서 갱신된 브랜치로 이동 해 편집하고 싶다면, 로컬브랜치로 만들어 전환해야 함.
>> git checkout -b 브랜치명 리모트/브랜치명 # 이런식으로 원격지의 브랜치를 가져와 편집.
>> git checkout --track 리모트/브랜치명 #명시적으로 추적브랜치생성. 로컬에 같은이름의 브랜치가 만들어지고 추적이 시작됨.

원격지의 브랜치를 checkout해 로컬 브랜치를 만들면(이름이 달라도!) '추적브랜치'가 되어 원격지브랜치와 연동됨. push/ pull시 자동으로 해당 원격 브랜치의 내용에 보내고 merge처리가 행해짐.

기존 브랜치를 원격브랜치에 연결(추적)시키고 싶을때.
git branch --set-upstream foo upstream/foo

That will cause Git to make foo track upstream/foo.


#추적브랜치 제거
git push [원격지이름] :[브랜치명]

원래 원격지에 [로컬브랜치]:[원격브랜치] 식으로 push해야 하는 구문에서 로컬을 [null]로 보내어 원격지의 브랜치를 날리는 것.

rebase 는 HEAD의 브랜치 내용을 대상 브랜치로 평탄화 하는것. merge와 다른점은 현재 HEAD가 가리키고 있는 스냅샷이 변경되어 새로운 스냅샷이(새로운 해쉬) 된다. 물론 합쳐진 브랜치도 history에 나오지 않게 평탄화 된다.

#rebase
git rebase [현재내용을패치로적용시킬대상브랜치] #대상브랜치로 현재 브랜치를 평탄화.
git rebase --root [브랜치] #현재브랜치 위쪽으로 연결되는 모든 브랜치들을 평탄화
git rebase --onto [패치를적용할대상브랜치] [공통조상체크용브랜치] [패치로만들어평탄화될브랜치]
#git rebase --onto master sub1 sub2 #sub2와 sub1의 공통위치에서부터 sub2의 변경을 패치로 만들어 master브랜치에 패치를 적용시킨다(sub2브랜치는 사라짐)



push는 특정 브랜치의 내용을 서버에 동기화시킴.
#push
git push #master 브랜치를 원격지 master브랜치로 보낸다
git push 원격지 로컬브랜치명
git push 원격지 로컬브랜치명:원격브랜치명

#pull : 원격지의(모든 혹은 브랜치) 내용을 fetch하여 그 내용을 merge까지 한다.

#stash : 현재 편집중인 상태를 임시로 저장하고 복구한다. 스테이지/커밋하지 않고 브랜치를 변경해야 하거나 할 때 사용가능.
git stash
git stash save 메시지 #현재 편집중인 내용을 일단 저장

git stash branch 브랜치명
#마지막 저장된 상태를 새 브랜치로 만들고, 그 브랜치로 HEAD를 지정한다.

git stash pop
#저장한 목록에서 마지막을 꺼내어 현재 상태에 적용시킨다. 목록에서 삭제됨. - 단, 충돌 발생시에는 목록에 그대로 남게되므로stash drop필요.

git stash apply
#pop과 비슷하지만 목록을 그대로 유지.

#tag
git tag -a 태깅이름(버전명) -m 메시지 #git tag -a v1.0 -m '1.0릴리즈!!'
git tag -s 태깅이름(버전명) -m 메시지

git push 원격지 태깅이름 #원격지에 해당 태그를 보낸다
git push 원격지 --tags #원격지에 모든 태그를 보낸다

#브랜치 생성 / 삭제
git branch 이름
새 브랜치는 현재 브랜치 포인터(HEAD)에 생성하게 됨. 생성만 할 뿐 HEAD가 가리키지는 않음.
git branch -d 이름
커밋내용은 영향없음.

#브랜치이동
git checkout 브랜치명
해당 브랜치로 HEAD를 이동하고 스냅샷을 교체함. 만약 이전에 작업본에 커밋되지 않은 내용이 있다면 날라감.

#머지 (http://progit.org/book/ja/ch3-2.html)
git merge 합칠브랜치명


#저장소 초기화
git init
git --bare init  #서버용 저장소 생성

#무시 설정
cat .gitignore #무시 설정파일 생성
*.[oa] #확장자 o, a를 무시
*~ #파일명이 ~로 끝나는 파일 무시
!lib.a #lib.a는 무시에서 제외
/kin #루트의 kin파일만 무시, 서브는 상관없음
build/ #build 디렉토리이후의 모든 파일 무시
doc/*.bak #doc/*.bak는 무시. doc/sub/*.bak는 무시아님.

#작업본에는 파일을 남기고 스테이지(추적)에서만 제거
git rm --cached 제거할파일

# 현상황 파악
git status

#새로운 파일들 스테이지에 추가
git add *.cpp
git add . //전부

#스테이지에서 제거 - 파일변경은 없음
git reset HEAD 파일

#변경된 사항을 되돌리기
git checkout -- 파일

# 커밋
git commit -a -m
-a 옵션은 추적되는 파일들의 변경사항을 자동적으로 스테이지에 올리기.
새로 추가한 파일들은git add 해줘야 함.

#리모트 추가 / 삭제/ 이름변경
git remote add 리모트별명 주소 #git remote add pb git://github.com/test/test.git
git remote rm 리모트별명
git remote rename 리모트별명 새로운별명
git remote set-url 리모트별명 새로운리모트주소

#리모트의 모든 정보를 가져옴(리모트의 모든 브랜치를 참조)
git fetch 리모트별명

#리모트에 로컬 브랜치의 내용을 업데이트
git push 리모트별명 로컬브랜치이름




2010년 5월 27일 목요일

윈도우에 Cygwin으로 Git서버 설치하기

실제 작업에 쓰는건 Subversion이고 git은 테스트로 로컬에서 잠깐씩 써보는정도였는데
실제로 작업에 사용해보기 위해서 개인 서버에 git 서버를 설정하기로 했다.

예전에도 그냥 써볼까 해서 잠깐 시도하다 git을 어떻게 써야되는지 잘 모르겠으니 말았지만
progit.com 설명보고 좀 이해된다 싶으니 일단 좀 제대로 써보고 싶어졌다.
git에 대해서 간단히 보려면 progit.com이 짱인듯..

윈도에 git서버 설정하는 방법은 검색해보니 대충 2개 발견했는데

걍 첫번째 링크를 먼저 본 관계로 -_- .. cygwin을 사용해서 해보기로 했다.
그냥 cygwin 설치하면서 git, python, openSSH 선택해 설치한 뒤, gitosis받아 설치하면 되는 듯 한데..

다만 내 windows2003서버에는 이미 apache2, trac, python에 svn을 webdav로 돌리고 있었는데
그게 문제인건지.. 뭐가 어찌된건지. gitosis를 설치하면 내부에서는 제대로 접속이 되는데
원격지에서 ssh접속 후 gitosis실행이 cygwin내에서 되지 않아 연결이 되지 않았다.
그래서 간결하게 걍 cygwin ( git + openSSH )로 끝.
어차피 혼자나 소규모로 쓸거니깐.

1. Cygwin 설치
cygwin.com에 가서 받으라는데 가면 다운로드링크가 없어.-_ -;;
http://cygwin.com/setup.exe
여기로 받아야됨.
  1. setup.exe 실행 > Install from Internet 선택
  2. 모든 유저를 위해 설치를 선택.
  3. 다운받을 곳은 적당히 가까울까 싶어서 .jp붙은거 골랐더니 잘 안됐다 그냥 맨위에거로 진행.
  4. 패키지에서 git ( Devel 카테고리), openssh ( Net 카테고리)를 고른다.
그리고 기다리면 설치완료.
시작 메뉴나 바탕화면에 Cygwin Bash Shell이 생긴다.

2. SSH 설정
  1. 바탕화면의 Cygwin Bash Shell을 실행.
  2. chmod +r /etc/passwd
  3. chmod u+w /etc/passwd
  4. chmod +r /etc/group
  5. chmod 755 /var 로 권한 설정 해준뒤,
  6. ssh-host-config를 타이핑하고 실행하면, 몇가지 질문이 나온다.
  7. 기본적으로 모두 yes 하면 된다. 다만 중간에 이름 바꿀거냐 물을 때는 적당히 no
  8. 그리고 패스워드를 설정해준다.
  9. 설정이 완료 되면, 윈도우 서비스로 가서 생성된 CGWIN 서비스를 시작하거나, net start sshd 를 입력하면 서비스 시작.

이 후, 원 메뉴얼에서는 python과 setuptools를 설치해 gitosis를 준비하지만 난 안되니 스킵.

3. ssh로 접속할 윈도우즈 계정 생성.
시작>관리도구>컴퓨터관리 를 실행시켜 계정을 추가. 패스워드를 설정해준다.
덤으로 암호 변경불가 + 암호 사용기간 제한 없음 선택.
기본적으로 ssh로 접속하면, cygwin이 설치된 폴더/home/계정명이 홈폴더가 되는데,
계정정보>프로필 탭에서 홈폴더 항목의 로컬경로에 원하는 별도의 경로를 지정해주면 접속시
그곳이 홈폴더가 되므로, git저장소를 작성하고 싶은 곳으로 정해두면 좋은거 같다.
이번 설정때는 c:/git으로 설정.. 데이터 하드가 c드라이브기 땜에.

계정을 생성 한 뒤, cygwin bash shell에서 다음을 입력한다.
mkpasswd -l -u 생성한계정명 >> /etc/passwd

그냥 윈도우 계정/프로필 탭에 홈폴더를 설정해서는 적용이 되지 않음.
/etc/passwd 를 notepad++등으로 열어 맨 아래 줄의 /home 부분을 원하는 위치로 수정해준다.
윈도우식 경로는 사용할수 없고, 예를 들어 e:/git 이라면 /cygdrive/e/git 과 같은 형식으로 적어준다.


4.접속할수있는 허가된 사용자를 만들기위해 공개키를 추가
여기서 공개 SSH키를 준비한다. 난 맥에서 ssh-keygen입력 후, 엔터3번으로 생성했다.
생성하면 자신의 홈폴더/.ssh 폴더가 생기고 거기에 개인키(확장자 안보임)와 공개키(.pub확장자)가 생긴다. 윈도우에서는 git서버설정과는 별도로 msysgit등을 설치하면 ssh-keygen이 bin폴더에 있는거 같다.

생성 한 공개키(.pub)를 cygwin설치폴더/tmp 폴더에 복사한다. 내경우(d:/cygwin/tmp)

cygwin bash shell에서 아래를 입력.
chmod 755 /tmp/복사한공개키파일명.pub

이후, 저 공개키를 인증목록에 추가하기위해 아까 생성한 계정으로 접속한다.
윈도우 기본 cmd.exe를 실행해 다음을 입력.

runas /user:생성한계정명 cygwin쉘경로

내 경우 계정명은 'git', cygwin쉘 경로는 d:/cygwin/tmp이므로
runas /user:git d:/cygwin/cygwin.bat 가 된다.

실행하면 새로 생성한 계정으로 쉘에 접속된다.
거기에서 다음을 입력
cat /tmp/복사한공개키파일명.pub >> ~/.ssh/authorized_keys

이 후에도, ssh접근할 계정을 추가하고 싶으면 공개키를 받아서 저기에 추가하면 되는것 같다.
같은 계정에 여러개의 공캐키를 추가해도 실제 git에서 커밋할 때는 각자 다른 이름으로 올라가니
상관없는듯.
이것으로 git서버를 돌릴수있는 ssh 설정이 완료 -_-.
끝.

5. 저장소 생성
생성한 계정으로 cygwin쉘로 접속한 뒤,
디렉토리를 만들면 된다.
예를 들어
mkdir project1.git && cd project1.git
git --bare init
를 입력하면 홈폴더아래에 project1.git폴더를 만들고 거기에 새로운 저장소를 초기화하게 된다.

이후, 작업하는 클라 컴퓨터에서 푸시 하면 된다.

예를 들면 작업용 컴터에서..
일단 개발툴로 test1프로젝트 생성했으면, 터미널로 해당 test1폴더로 이동해서
git init
git add .
git commit -m '초기화 커밋'
git remote add origin 계정명@서버경로:project1.git
git push origin master
하면 된다.
'깃'은 아까 윈도우계정으로 추가된 계정명이고 그뒤는 naver.com과 같이 서버 경로가 붙으면 된다.

이 후, 다른 곳에서는
git clone 계정명@서버경로:project1.git
해서 작업을 시작하면 되는 듯.

지금 작업은 맥에서 하니까 상관없는데 윈도에서는 ssh어떻게 접속하는지 또 찾아봐야겠다;;
생전 윈도우만 쓰다보니 이런거 하나 하기도 너무 어렵다.
나이들면서 삽질하기가 귀찮아져서 그런거 같기도 하고.