Git - branch


우리가 작업하고 있는 소스코드를 그대로 두면서도 예를 들면 어떤 고객사에게 제공하는 커스텀 된 기능이 추가되는 경우에 우리는 우리의 원래 소스코드를 변경하지 않으면서 그 고객을 위한 기능등을 추가해야 될 때가 있을 것이다.
이런 경우에 브랜치 하기 딱 좋은 경우이다.
또 다른 경우는 누군가가 어떤 기능을 우리에게 개발해 달라고 했는데 필요없는데 개발해달라고 하는 경우 나중에 정말 필요가 없으면 버려야 될 수도 있다. 이럴때 우리가 쉽게 버릴 수 있는 방법은 분기를 해서, 브랜치를 만들어서 작업을 진행하는 것이다.
등등 여러가지 용도에 사용이 가능하다.
일단 브랜치를 만들어보자!
그러기 위해 사용할 명령은 git branch라는 명령이 있다.
입력하면 * master 이렇게 나온다.
이것은 현재 우리가 마스터라는 브랜치를 쓰고 있다는 뜻이다. ( 현재 마스터 브랜치를 쓰고 있기 때문에 * 이 붙어있음)
깃은 우리가 기술을 사용하는 그 순간부터 기본 브랜치를 사용하게 되어있따. 그 브랜치의 이름이 마스터이고,
따라서 마스터라는 브랜치는 일종의 약속 같은 특별한 이름의 브랜치이다.
git branch [파일이름]
git checkout [파일이름] : master에서 체크아웃하고 파일로 들어가는 거다


f1.txt의 내용에 c를 추가하고 add와 commit(커밋 메세지 3)을 하고 git log 를 하면 1,2,3의 커밋 메세지가 나온다.
하지만 git checkout master를 하고 git log를 해서 보면 1,2만 나오는 걸 확인할 수 있다.
f1.txt 파일의 내용도 a b 만 갖게 되어 있다.
즉, f1.txt라는 파일이 내가 어느 브랜치에 속해 있느냐에 따라서 내용이 완전히 달라진다 라는 것이다.
브랜치를 만들었을 때 현재 어떤 상황인지를 판단할 수 있도록 하기 위한 여러가지 확인 방법들을 살펴보자.
git log를 해서 볼 때 현재 master 인지 exp 인지 구분이 잘 되지 않는다.
그럴 때 git log --branches --decorate 현재 자신이 체크아웃되어있는 브랜치 말고 우리의 저장소에 있는 모든 브랜치들을 다 보여준다.
( 지금은 git log만 해도 아래의 정보가 나온다.)

git log --branches --decorate --graph 를 하면 옆에 빨간 줄이 생긴다. 이게 무슨 뜻이냐.
아래에서 위로 브랜치가 흘러왔다라는 뜻이데, 지금 이 상황에서 이것만으로는 그래프의 효용이 전혀 드러나지 않는다.
마스터와 exp가 서로 브랜치의 상태, 서로 커밋 상태가 각자의 길을 걷고 있을 때 효용이 드러난다.


그리고 버전과 버전 사이의 차이점을 비교할 때는
git log master..exp // 현재 내가 있는 마스터와 exp 사이에 차이가 무엇이냐 라는 명령
=> 마스터에는 없고 exp에는 있는 것들을 보여준다.
반대로 git log exp..master 하면 exp에는 없고 마스터에 있는 것들을 보여준다.
만약에 소스 코드까지 필요하면 각각의 버전별로 어떤 차이가 있는가를 -p를 통해서 알아낼 수 있다.

그리고 git diff를 사용하게 되면 각각의 브랜치에 현재 상태들을 비교할 수가 있다.
git diff master..exp
작업을 분기해서 작업의 히스토리를 만들어보았는데 그러다가 이 작업들을 어느 시점에서 병합해야 될 필요성이 생긴다.
병합 (merge)

지금까지 exp에서 작업했던 내용을 마스터로 병합하는 방법을 살펴보자! 마스터 브랜치가 exp에서 작업했던 3,4라고 하는 두개의 커밋의 내용을 마스터 브랜치도 갖게 하는 것이 첫번째 목표이다.
exp를 마스터로 가져올 거면 마스터로 체크아웃 하고 그 상태에서 git merge하고 exp를 해야된다.
git merge를 입력하니 에디터가 열리면서 merge branch 'exp' = exp를 마스터로 머지 했다. 라는 커밋이 만들어 진다.
:wq 하고 확인해보면

그래서 내가 merge를 해서 만들어진 커밋은 2개의 부모를 갖는 하나의 커밋으로 만들어졌고 마스터는 이제 자기가 작업했던 5번과 exp가 작업했던 3,4번의 커밋을 모두 가지고 있는 상태가 된 것이다.
따라서 ls -al을 입력하여 파일 목록을 보니깐 마스터는 이제 드디어 f1.txt, f3.txt를 모두 갖는 상태가 된 것이다.
하지만 exp는 3,4번의 커밋을 갖고있지만 5번 커밋은 갖고있지 않다. exp도 마스터가 작업했던 5번 커밋을 포함하도록 만들어 보겠다.( 그럼 exp와 마스터는 완전히 같은 상태가 됨)

이제 더이상 exp는 작업이 끝났으니 지워도 된다.
마스터로 돌아가서
git branch -d exp : exp 브랜치가 삭제가 된다.

'git' 카테고리의 다른 글
| <7> 생활코딩 - GIT (0) | 2022.11.27 |
|---|---|
| <6> 생활코딩 - GIT (0) | 2022.11.25 |
| <4> 생활코딩 - GIT (0) | 2022.11.21 |
| <3> 생활코딩 -GIT (0) | 2022.11.11 |
| <2> 생활코딩 - GIT (0) | 2022.11.07 |
댓글