[Git-지옥에서 온 git] 3일차 - branch

2022. 8. 4. 14:46개발공부 기강잡자/Git

Branch

문서를 제작하는 상황을 가정했을 때, 🤔

- 원본 파일을 수정하여 수정본을 client한테 배포하는 경우와

- client 에게 제공된 문서의 내용이 원본에 반영되어야하는 경우가 생길 수도 있다.

→ 파일의 이름이 복잡해지기도 하고, 합치기 등 문서의 관리가 복잡해진다.

👌 이럴때를 위해 git은 branch 기능을 제공한다!

 

✔ 작업 중 필요에 의해 작업을 분기 => branch를 만든다

ex) 특정 고객을 위한 커스터마이징 개발, 개발 내용을 원본에 반영하기 전에 테스트를 위한 분기 작업 등에 사용

✔ branch의 내용을 원본에 합친다. => merge

branch 만들기

master : 기본(원본) branch

git branch : 현재 있는 branch 정보 가져옴

git branch [branch명] : branch 생성

: 현재 사용 중인 branch는 master

 

git checkout -b [branch명] : branch 생성 후 이동

git checkout [branch명] : branch 이동

exp branch로 이동하기
branch 이동 완료

☞ branch에서 작업한 내역은 해당 branch에만 반영된다.

 

* branch를 생성하면 현재 속해있는 branch의 상태를 그대로 갖게 된다.

git log로 확인 가능

- 새로 생성된 exp branch의 commit 내역은 master의 commit 내역과 동일하다.

- exp 에서 새로운 commit을 하는 경우, exp의 commit에만 추가되며, master에는 반영되지 않는다.

branch 정보확인

git log --branches : 저장소의 모든 branch의 로그를 보여줌

master branch의 가장 최신 커밋을 표시

exp branch의 가장 최신 커밋을 표시

- HEAD -> : 현재 checkout 되어있는 branch (현재 우리는 exp branch에 checkout 되어있다.)

 

git log --branches --decorate --graph

: master brach와 exp branch의 commit을 그래프 형식으로 볼 수 있다.

- 위의 로그에서는 master branch와 exp branch의 공통의 부모는 "Add f2.txt" commit이고, 3번 커밋부터 각각 다르다는 것을 알 수 있다.

 

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

한줄로 간결하게 commit branch 현황을 볼 수 있다. 

위와 동일하게 Add f2.txt 까진 동일한 commit을 갖고, 그 이후부턴 각 branch는 다른 commit 로그를 갖고 있다.

 

git log master..exp

: master에는 없고 exp에 있는 commit 내역을 볼 수 있다.

 

git log -p master..exp

:  master에는 없고 exp에 있는 commit 내역에서 수정된 파일의 차이를 확인할 수 있다.

 

git diff master..exp

: 각 branch의 최종 버전에서 파일의 차이를 확인할 수 있다.

 

stree : 현재 디렉토리의 소스트리를 gui로 볼 수 있음, sourcetree라는 툴을 설치해야할 것으로 보인다.

 

branch 병합

exp의 내용을 master로 병합 (exp -> master)

1. master로 checkout

2. master에서 merge 명령

git merge exp

merge 커밋인 49af10e는 원래 master가 가지고 있던 4번 커밋(3b7238e)과 exp 가 작업한 3(ab52981), 4(2854ec6)번을 master로 가져옴

- merge한 commit으로 master는 두개의 부모를 갖는 하나의 커밋으로 master 의 커밋과, exp가 작업한 두개의 커밋을 모두 갖는 상태가 된다.

- exp의 최종 커밋은 2854ec6 커밋 : exp는 master의 4번 커밋(3b7238e)을 가지지 못하고, 본인의 작업 내역이 마지막이다.

 

-> exp도 master와 동일한 상태로 만들려면

1. exp로 checkout

git checkout exp

2. exp에서 master merge 명령

git merge master

exp의 최종 커밋도 49af10e 버전으로 변경된 것을 확인할 수 있다.

 

Stash

stash : 숨기다

- branch에서 작업하다가 checkout 할 때 commit 하지 않고 working directory의 현재 작업 내용을 숨기는 기능

- branch에서 작업한 내용을 commit 하지않고 master로 checkout 하면 master의 상태에도 영향을 주게 됨

 

ex) exp branch에서 f4.txt 파일을 생성하고 commit하지 않고, master로 checkout 했을 경우

master에서 git status 명령을 실행하면,

위와 같이 master의 작업 내용이 아닌데도 untracked file이라고 뜨게 됨.

 

> checkout 하기전 branch의 작업 중인 내용을 숨기기 위해 stash를 사용한다.

 

git stash 

하고 나면 master로 checkout 하고 git status를 확인하면

exp branch에서 작업중이던 내용이 뜨지 않게 된다!

 

다시 살리기

작업 중이던 branch로 가서 > git stash apply

git stash list : stash 한 내용의 리스트 반환 (위의 것이 가장 최신의 stash - apply시 제일 위에 있는 stash를 복원함)

git stash drop  : 가장 최신 stash 삭제

git stash pop : apply후 drop

(stash는 명시적으로 삭제하기 전에는 사라지지 않음)

 

git reset --hard HEAD : commit 했을 때의 상태로 되돌림


git을 공부할수록, 이렇게 소스를 효율적이고 안전하게 관리할 수 있는데 그동안 회사에서는 무엇을 한 것인가 회의감이 조금 든다. git을 사용하지 않은 이유가 있기야하겠지만, git을 사용하지 않은 협업의 과정 속에서 소스를 합치고 버전 관리를 하는데 많은 어려움과 위험이 존재했다. 그런 불안전함을 감수하면서 비효율적인 방식을 고수할 필요가 있었는가 싶다.