관리 메뉴

김종권의 iOS 앱 개발 알아가기

[git] 5. branch, stash 본문

Git, CocoaPods, Xcode, Shell/Git

[git] 5. branch, stash

jake-kim 2020. 6. 10. 15:17

branch생성

 

merge하는 과정

이 두 가지를 위해서 branch사용


1. branch 기초

1) branch 목록

git branch

현재 브랜치 : master

2) branch 생성

git branch ["branch name"]

3) branch 접근

branch checkout [branch name]

exp 브랜치로 이동

4) branch로 이동해서 작업한 경우, 해당 branch에서만 변경

exp 브랜치
master 브랜치

2. branch 정보 확인

1) branch목록

git branch

 

2) 모든 브랜치 표시

git log --branches --decorate

3) 브랜치 그래프

git log --branches --graph --decorate

- commit 별 graph를 그려서 branch간의 관계를 파악 할 수 있음

4) oneline

git log --branchs --decorate -- graph --oneline

5) 브랜치 간 비교

git log [브랜치명1]..[브랜치명2]
git diff [브랜치명1]..[브랜치명2]

브랜치명1에는 없고 브랜치명2에 있는 것을 보여줌

master에는 없고 exp에 있는 내용

6) 브랜치 간 소스까지 확인

git log -p [브랜치명1]..[브랜치명2]

3. branch 병합 및 삭제

- exp branch 정보를 master branch에 넣기

 

초기화면

1) exp 브랜치 -> master 브랜치

exp를 master로 가져올 땐, master로 체크아웃

git checkout master
git merge exp

* merge 된 것 확인

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

master는 exp가 작업했던 3번 커밋, 내용을 가지고 있음

2) 삭제 

git branch -d [branch name]

 

4. merge의 개념

1) Fast-forward : 빨리 감기(브랜치 포인터를 최신 커밋으로 옮김)

git checkout master
git merge hotfix

<hotfix 브랜치 삭제, iss53커밋>

git branch -d hotfix
check out iss53

git commit -am "new"

2) 3 way merge commit

위 그림에서 merge다시 시도

$ git checkout master
Switched to branch 'master'

$ git merge iss53
Merge made by the 'recursive' strategy.
index.html |    1 +
1 file changed, 1 insertion(+)

master와 iss53의 merge : 공통의 조상 찾음(C2) -> 3 way merge의 방법을 이용하여 merge

c4, c5 merge -> 두개를 합쳤다는 정보 C6커밋 생성

 

* fast forward는 커밋을 생성하지 않지만, merge commit할 시 커밋이 생김

 

5. branch merge시 충돌 해결 방법

git merge exp인 상황에서 exp의 내용 변경시 master에도 갱신 되지만,

master에서 바꾸면 exp에 반영안됨

1) exp에서도 master 병합

git checkout exp
git merge master

2) 병합된 두 브랜치 상에서, 같은 파일을 변경 후 각각 커밋 -> merge하면 어떤일 발생?

 

merge 실패

파일 열어보면,

<<<<<<< HEAD : 현재 checkout한 브랜치의 변동사항 시작점

====== : 기준선(위는 현재 checkout한 내용, 아래는 merge하려는 checkout의 변동사항)

>>>>>>>> exp : merge하려는 checkout의 변동사항 끝점

 

이 파일을 수정 한 후 merge를 다시 시도하면 해결

6. stash

- working directory의 파일 내용을 감추는 것(버전 관리가 되고 있는 파일 대상만 작동)

 

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

-> 작업 중이던 파일을 임시로 저장해두고 현재 브랜치의 상태를 마지막 커밋의 상태로 초기화 기능

 

master -> f1.txt생성

git branch -b exp -> f1.txt수정

git checkout master -> git status

exp에서 수정한 f1.txt는 master에게도 영향을 미침

- git commit을 하지 않았으므로 midified라고 뜸

 

1) exp 브랜치에 working directory와 index state에 저장

git stash

-> 이제 f1.txt는 exp에서 수정한 내용을 담고 있지 않음

 

2) 복원

git stash apply

-> f1.txt내용 다시 갱신되어 있음

 

3) stash 정보 목록

git stash list

최신 stash는 {0}

4) 최상위 stash{0} 삭제 

git stash drop

5) git status 전 상태 지우기

git reset --hard HEAD

 

* git stash pop 명령어

git stash pop

// git stash apply + git stash drop

'Git, CocoaPods, Xcode, Shell > Git' 카테고리의 다른 글

[git] 7. Tag  (0) 2020.06.10
[git] 6. branch, reset, merge의 원리  (0) 2020.06.10
[git] 4. git의 원리  (0) 2020.06.09
[git] 3. 되돌리기, 메뉴얼 활용  (0) 2020.06.09
[git] 2. 버전 생성 & 변경사항 파악  (0) 2020.06.09
Comments