1. branch 만들기

・브랜치를 해야하는 상황

기존에 여러가지로 응용될 수 있는 모듈을 개발해 놓은 상태

각각의 클라이언트의 맡게 기존 모듈을 부분적으로 수정해야함

기존 모듈을 더럽히지 않고, 각각의 클라이언트에게 맞는 새로운 소스코드를 브랜치에서 작성

・git branch : 브랜치의 목록을 볼 때

-브랜치를 생성하지 않아도, 기본 master브랜치가 존재

-브랜치를 생성하면, 직전 속해있던 브랜치의 상태를 그대로 가져온다.

・git branch "새로운 브랜치 이름" : 새로운 브랜치를 생성

・git checkout "전환하려는 브랜치 이름" : 다른 브랜치로 갈아탈 때




브랜치의 목록을 볼 때

git branch


브랜치를 생성할 때 

git branch "새로운 브랜치 이름"


브랜치를 삭제할 때

git branch -d


병합하지 않은 브랜치를 강제 삭제할 때 

git branch -D


브랜치를 전환(체크아웃)할 때

git checkout "전환하려는 브랜치 이름"


브랜치를 생성하고 전환까지 할 때 

git checkout -b "생성하고 전환할 브랜치 이름



2. branch 간 정보확인

[지금까지의 작업흐름]

master 브랜치에서 test1.txt에 내용 1추가

master 브랜치에서 test1.txt에 내용 2추가

exp 브랜치 생성한 후 exp브랜치로 head이동

exp 브랜치에서test2.txt생성

exp 브랜치에서 test2.txt에 내용 3추가

exp 브랜치에서 test2.txt에 내용 4추가

master 브랜치로 head이동

master 브랜치에서 test3.txt생성

master 브랜치에서 test3.txt에 내용 5추가

・git log --branches --graph --decorate : (HEAD -> exp)리스트와 (master)리스트가 별도로 표시됨

(log는 repository(commit된 대상)를 기준으로만 표시된다.)


・git log --branches --graph --decorate --oneline : 브랜치간 변화를 최소한의 행으로 보여줌

・git log "비교할 브랜치 명 1".."비교할 브랜치 명 2" : 마스터브랜치에는 없고 exp에는 있는 커밋을 보여줌

・git diff "비교할 브랜치 명 1".."비교할 브랜치 명 2" : 브랜치 간의 코드를 비교 할 때 



브랜치 간에 비교할 때

git log "비교할 브랜치 명 1".."비교할 브랜치 명 2"


브랜치 간의 코드를 비교 할 때 

git diff "비교할 브랜치 명 1".."비교할 브랜치 명 2"


로그에 모든 브랜치를 표시하고, 그래프로 표현하고, 브랜치 명을 표시하고, 한줄로 표시할 때 

git log --branches --graph --decorate --oneline


3.브랜치의 병합

[지금까지의 작업흐름]

master 브랜치에서 test1.txt에 내용 1추가

master 브랜치에서 test1.txt에 내용 2추가

exp 브랜치 생성한 후 exp브랜치로 head이동

exp 브랜치에서test2.txt생성

exp 브랜치에서 test2.txt에 내용 3추가

exp 브랜치에서 test2.txt에 내용 4추가

master 브랜치로 head이동

master 브랜치에서 test3.txt생성

master 브랜치에서 test3.txt에 내용 5추가

・각각의 브랜치에서 각기 다른 일을 전개해 나가다가 하나로 병합해야 할 일이생길때 사용하는 branch merge

・(HEAD가 master 브랜치에 있을 때) git merge exp

-이때 주의할 점은 exp 브랜치의 결과를 master 브랜치로 병합시키기 위해선, head를 마스터 브랜치로 설정한 상태에서merge명령어를 수행해야한다.

・merge후 탄생한 커밑은 master 브랜치의 최후 커밑(master 브랜치에서 test3.txt에 내용 5추가)과 exp 브랜치의 최후 커밑(exp 브랜치에서 test2.txt에 내용 4추가)를 동시에 부모로 갖는다.

・이때 master는 1,2,3,4,5를 전부가지지만, exp는 3,4만 지니므로 master와 exp는 완전이 동일하지 않다.

(master와 exp의 결과가 완전 동일하지 않아, HEAD가 master만을 가르키고 있는 것을 볼 수 있다)


・(HEAD가 exp 브랜치에 있을 때) git merge master -> 이제 master와 exp의 상태가 완전동일

(양쪽에서 서로를 병합한 결과 master와 exp의 결과가 완전 동일해, HEAD가 master와 exp 둘다를 가르키고 있는 것을 볼 수 있다)


・병합이 끝나면 

・git branch -d exp로 exp 브랜치 삭제



3. merge conflict

・충돌이 일어나는 이유
A와 B 브랜치가 가지고 있는 common.txt 파일의 같은 위치(같은 행)에서 변화가 일어나면, git은 A브랜치의 내용을 가져와야하는지 B브랜치의 내용을 가져와야 하는지 판단하지 못한다. 따라서 수동 fix가 필요하다.

・충돌시 해결법 : 수동으로 하는 방법뿐..

충돌이 생기면 아래와 같은 메시지가 뜹니다. 

git status를 하면 충돌이 일어난 파일을 찾을 수 있습니다. 

 충돌이 발생한 파일을 수정합니다. 아래와 같습니다. 

'<<<<<<< HEAD' 부터 '=======' 사이의 구간이 현재 체크 아웃된 파일의 내용이고 '=======' 부터 '>>>>>>> exp' 사시의 구간이 병합하려는 대상인 exp 브랜치의 코드 내용입니다.  이 정보를 참고로해서 두개의 코드를 병합한 후에 특수기호들을 제거해주시면 됩니다. 작업이 끝나면 파일을 저장.


4. stash

・stash

다른 브랜치로 checkout을 해야 하는데 아직 현재 브랜치에서 작업이 끝나지 않아 커밋을 하기가 애매한 경우에는

현재 브랜치의 변경사항을 커밑하지 않았기 때문에 다른브랜치로 checkout을 할 수가 없습니다.

이런 경우 stash를 이용하면 작업중이던 파일을 임시로 저장해두고 현재 브랜치의 상태를 마지막 커밋의 상태로 

초기화 할 수 있습니다. 그 후에 다른 브랜치로 이동하고 작업을 끝낸 후에 작업 중이던 브랜치로 복귀한 후에 

이전에 작업하던 내용을 복원할 수 있습니다. 여기서는 이 기능에 대해서 알아봅니다. 


[현재까지의 작업흐름]

master 브랜치에서 test1.txt에 내용 a추가

exp 브랜치 생성한 후 exp브랜치로 head이동

exp 브랜치에서test1.txt에 b내용 추가


・exp에서 2를 추가했는데, 이때 exp에서 제대로 커밑하지 않고 master 브랜치로 옮기면 수정된 내용이 master 브랜치에 까지 영향을 미친다.

-그렇다면, 아직수정이 안된 exp의 text1.txt를 커밑하지가 뭐한데.. 어떻게해야할까? 이때 사용하는 것이 stash!


・git stash하면 커밑하지 않은 작업내용(b추가)이 저장됨

・이후에는 master브랜치로 checkout도 가능해짐

・git stash apply하면 아까 stash했던 작업내용이 되살아남

・git stash list하면 stash했던 항목이 표시되는데, 한번 stash 리스트에 저장된 작업은, reset으로 날려도 다시 살릴 수 있다.

・그런데 stash 리스트에 복수개가 있으면 어떻게 할까?

・stash list에는 가장 최신이 위에 쌓이고, 이전것이 아래에 쌓이는데


stash@{0} : WIP on exp : 9161e43 1

stash@{1} : WIP on exp : 9161e43 1

stash@{0}을 적용하고 stash@{1}을 적용하고 싶다면

git stash apply (stash@{0} 적용)

->

git stash drop (가장 최신 stash인 stash@{0}삭제)

->

git stash apply (stash@{1} 적용)


 

・git stash pop : 가장 최신의 stash를 apply하고 적용한 stash를 삭제해버림

+ git stash는 index에 포함된 파일을 대상으로함. 즉 add까지는 된 놈이여야함.

+ Recent posts