로컬 목록 보기

git branch

 

리모트 목록 보기

git branch -r

 

전체 목록 보기

git branch -a

Posted by KENSIN
,

참조 링크

배포/빌드 서버 등에 계속해서 최근 항목만을 가져오는 등의 경우에 사용 할 수 있다.

로컬에 있는 모든 내용을 덮어쓰려는 경우

git fetch --all
git reset --hard origin/master

master 아닌 특정 branch 지정 사용 시

git reset --hard origin/<branch_name>

현재 로컬 커밋을 유지(branch로 만들어 두고 덮어쓰기)

git checkout master
git branch <branch name>
git fetch --all
git reset --hard origin/master
Posted by KENSIN
,

reset 은 HEAD 포인터의 위치를 다른 커밋개체로 이동 시킵니다.


1. merge 의 취소


직전 merge 를 취소하고 다시 작업을 하고 싶다면


> git reset --merge ORIG_HEAD

or

> git reset --hard ORIG_HEAD


2. commit 의 취소


> git reset [--soft/mixed/hard] <TARGET_VERSION>


soft : index, work tree 둘다 유지합니다. 약간의 오타만 수정하여 다시 커밋하고 싶을때 유용합니다.

mixed : 미지정시 기본값, index는 취소 work tree만 유지합니다.

hard : index, tree 모두 제거 합니다.


TARGET_VERSION 에 HEAD포인터의 위치를 지정한다.


HEAD 의 여러 표현방법 (1.8.4 버전부터 @ 표식을 대신 사용할 수 있다.)


HEAD^[n] : n번째 부모 버전  (the parent of HEAD), 생략시 1


HEAD~[n] : n번째 부모의 부모. (the first parent of the first parent or the grandparent)


HEAD~ 와 HEAD^ 는 같은 대상이지만 특정숫자들을 입력하면 대상이 달라진다. (HEAD^4 와 HEAD~4 는 다르다.) 하지만 다음 예제는 같은 커밋개체을 가르킨다.


HEAD^^^ == HEAD~3    (HEAD^^^ 가 첫번째부모의 첫번째부모의 첫번째부모 노드를 뜻하므로 같은 값을 가르킨다.) 



3. ORIG_HEAD


.git/ORIG_HEAD 파일에 저장되는 포인터. HEAD의 이전 포인터 정보를 가진다. ( HEAD@{1}, HEAD^, HEAD~ )



Posted by KENSIN
,

Git branch 이해

버전관리 2015. 2. 21. 00:22

git의 각 브랜치와 head 의 위치 이동에 대해 게임과 비교해 보았다.


git 의 커밋객체는 각 파일에 대한 정보, 그리고 tree 구조를 함께 저장한다. 그리고 이전 커밋이 있을 경우 이전 커밋에 대한 정보도 함께 가지고 있다.

다음 초록색 동그라미는 각각 하나의 커밋객체이다. 게임상 한개의 라운드라고 생각해보자. 그리고 master 라는 플레이어가 있다.


master 플레이어가 현재 3라운드까지 진행한상태이다. (3번의 commit)





그리고 여기서 develop 이라는 플레이어가 들어온다. (develop 브랜치 생성)





이 게임은 자신의 순서에만 행동을 할 수 있다. 현재 턴에 행동가능한 플레이어가 누구인지에 대해 HEAD 라고 표시된다.





develop 플레이어가 자신의 턴에 필요한 행동을 하고 턴을 종료(commit) 한다.





master 플레이어에게 행동권을 넘긴다. (checkout master)




Posted by KENSIN
,

통합브랜치(Integration Branch)

언제든 배포 할수 있는 안정적인 상태의 브랜치. 보통 MASTER 를 통합브랜치로 사용한다.


토픽브랜치(Topic Branch)

통합브랜치에서 파생되는 단위 작업등을 위한 브랜치. 여러개 생성가능. 통합브랜치를 메인으로 하여 생성하고 작업이 완료 되면 다시 병합된다. 


A successful Git branching model



새로운 브랜치 생성


> git branch <브랜치명>


삭제 할경우는 -d 옵션을 사용


> git branch -d <브랜치명>


브랜치 목록 전체 확인


> git branch

  브랜치명

* master


아마 이전에 만든적이 없다면 위처럼 나올것이다. master 의 색이 다르고 * 표시가 있다.


remote 저장소의 branch 를 확인하려면 -r 옵션을 사용한다. 로컬과 원격 모두 확인하려면 -a 를 사용한다.


> git branch -r

> git branch -a


좀더 상세한 내역 및 추적상태나 push, pull 사용시 -u 옵션으로 저장된 매핑 상태등을 보기를 원한다면 다음 명령을 입력한다.


> git remote show origin


remote 저장소의 head 포인터 추적상태는 다음명령으로 확인 할 수 있다.


> git ls-remote --heads origin


사용할 브랜치를 선언 (checkout 사용) 한후 목록확인


> git checkout <브랜치명>

> git branch

* 브랜치명

   master


색과 * 표시가 변경되었다. ( HEAD 가 브랜치로 이동된다. )


아래처럼 b 옵션을 입력하면 생성함과 동시에 checkout 한다.


> git checkout -b <브랜치명>


파일의 수정후 master 로 이동하고, 병합을 해보자. (fast forward merge)


> git checkout master

> git merge <브랜치명>


파일의 충돌이 일어날 경우. 해당부분을 찾아 수정하고 다시 add, commit 해준다.


이전 커밋의 취소


> git reset --hard HEAD~


옵션에 따른 변경 여부

옵션

HEAD 위치

INDEX

작업트리

 soft

 O

 X

X

 mixed (기본)

 O

O

X

 hard

 O

O

O


** HEAD 를 사용하여 버전이동시

HEAD^ , HEAD~ , HEAD~1 등은 전단계

HEAD^^ , HEAD~2 등은 전전단계.. 로 사용할 수 있다.




Posted by KENSIN
,

Git --distributed-is-the-new-centralized


http://git-scm.com/


- 자신의 로컬에 저장소를 가진다.

- 원격저장소(Remote Repository)인 리모트(Remote) 저장소가 있다.

- 자신의 로컬저장소(Local Repository)에 저장(index | stage) 한다.

- 공용저장소에 커밋(push) 한다.


설정


전체설정(global)의 경우 설정파일은 윈도우즈일 경우 C:\Users\<사용자>\.gitconfig


변경 및 수정은 다음과 같이 한다.


> git config --global user.name "사용자명"


.gitconfig 파일에 아래처럼 기록될 것이다.


[user]

name = 사용자명


한글 파일명이 깨져보이지 않도록 설정

> git config --global core.quotepath off


mac osx 에서 한글때문에 생기는 문제는 다음 설정 추가.

(https://heartgamer.wordpress.com/2015/02/15/맥mac-os에서-git을-사용할-때-한글-파일명-때문에-생기는-문/

, http://git-scm.com/docs/git-config

, http://aero2blog.blogspot.kr/2011/07/macos-x.html

, https://kldp.org/node/132431

, http://gypark.pe.kr/wiki/Git)


> git config --global core.precomposeunicode true

> git config --local core.precomposeunicode true


에디터 지정

> git config --global core.editor "\"EditPlus 전체경로\""


버전관리 폴더에서 버전관리 프로젝트로 초기 생성


> git init


없애려면


> git remove


새로 생성하는게 아니고 이미 원격저장소가 있다면 통째로 복사해 오면 된다.


> git clone <원격저장소URI> [저장할폴더명]


설정에서 무시할 파일들을 지정해 주자. 이건 그냥.. 관용구라 생각하고 어디에 복사해 놓고 그냥 쓰자.

(참고로 d: 드라이브의 project/study 폴더를 생성하여 해당 폴더위치에서 작업중이다.)


> git config --global core.excludesfile /d/project/study/.gitignore


** 파일의 추가 없이 기본 workflow 부터 만들고 싶다면, 빈 커밋을 우선 실행한 후 develop branch 를 생성한다.

> git commit --allow-empty -m 'Initial commit'

> git checkout -b develop


(git config --global alias.emptycommit "commit --allow-empty -m 'Initial commit'" 으로 단축어를 등록할 수 있다.)


파일을 하나 생성하고


> vi test.txt


파일을 추가한 후


> git add .


한개씩 추가하려면


> git add file file file .......


삭제하고 싶다면


> git rm <file>


하드디스크의 물리적 파일은 삭제 하지 않고 git에서만 삭제하고 싶다면.. (실수로 추가한 경우등..)


> git rm --cached <file>


버전 관리 상태를 확인


> git status


커밋이 필요한 이력 변경 내용이 있다면 표시된다. 코멘트를 포함하여 로컬 저장소로 커밋한다.


> git commit -m '주석'


정상출력 및 오류시 결과가 출력된다. 이번엔 리모트 서버에 저장소 목록을 살펴 보자.


> git remote -v


만든게 없다면 안보일거다.

리모트 저장소를 만들어 보자. remote 서버의 https://github.com/xxx/study 위치에 study라는 이름의 저장소를 add 한다.

실제 리모트저장소에 만드는게 아니다. 로컬에서 변수를 만들어 둔거라고 생각하자 (ex :  String remote = "https://github.com/xxx/study"; )

(github는 무료 저장소다. 하지만 소스가 공개상태로 된다. 유료로 사용해야만 비공개로 만들수 있다.)


> git remote add study https://github.com/xxx/study.git


다음의 형식이다. name이 꼭 url 과 같아야 할 필요는 없다. 별명이라고 생각하면되겠다.

> git remote add <name> <url>


삭제 하고 싶다면


> git remote remove study


생성한 저장소에 push 하자.


> git push <저장소이름> <브랜치명>


> git push study


or


> git push -u study master


옵션으로 -u 를 넣으면 이후로 <브랜치명>을 지정하지 않아도 된다.(git push 만 해도 된다.) 당연히 최초에는 다 넣어야한다.


username 과 password 를 입력한다.


저장소의 변경이력을 확인해 보자


> git log


GUI 를 이용해서 확인하려면


> gitk


이번에는 다른 사용자가 반영한 내용이 없는지 확인하고 변경내용이 있다면 내려받도록 해보자.


> git pull [<저장소명>] [<브랜치명>]


사용자간 동일파일 변경시 충돌이 발생하면 병합 (merge ) 작업이 필요하다.

원격저장소에 올리다가 거부당하면 우선 원격저장소의 소스를 받아와야(pull) 한다. 해당 명령을 실행하면 자동 merge 작업이 되나, 같은 위치의 내용이 수정될경우 자동merge 가 실패 되었다는 메시지를 확인할수있다.


Automatic merge failed;


해당하는 파일을 편집기로 열어보면 다음의 형식으로 나온다.


<<<<<<< HEAD
written by local
=======
written by remote
>>>>>>> fb51122d60d93319ccb4a69005b07635444a5ff0


======= 를 기준으로 위쪽이 내가 작업한 내용, 아래쪽이 원격에 있던 내용이다. 내용을 적당히 수정하여 저장하고 ADD, COMMIT, PUSH 의 작업을 다시 해주면 된다.






Posted by KENSIN
,