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 리모트별명 로컬브랜치이름




댓글 없음:

댓글 쓰기