본문 바로가기
git

<5> 생활코딩 - GIT

by ChaeLOTUS 2022. 11. 24.
728x90
Git - branch

작업을 하다가 필요에 의해서 작업이 분기되는 현상을 브랜치를 만든다 라고 하는 것이다. 그리고 이 맥락에서 각각의 브랜치는 뭐가 있냐

 

클라이언트에게 제공했던 문서들은 새로운 브랜치이고 원래부터 우리가 쭉 가지고 왔었던 작업들은 원래 있었던 브랜치가 되는 것이다. 그럼 이 맥락에서 우리는 브랜치를 2개를 갖게 되는 것이다.


우리가 작업하고 있는 소스코드를 그대로 두면서도 예를 들면 어떤 고객사에게 제공하는 커스텀 된 기능이 추가되는 경우에 우리는 우리의 원래 소스코드를 변경하지 않으면서 그 고객을 위한 기능등을 추가해야 될 때가 있을 것이다.

이런 경우에 브랜치 하기 딱 좋은 경우이다.

또 다른 경우는 누군가가 어떤 기능을 우리에게 개발해 달라고 했는데 필요없는데 개발해달라고 하는 경우 나중에 정말 필요가 없으면 버려야 될 수도 있다. 이럴때 우리가 쉽게 버릴 수 있는 방법은 분기를 해서, 브랜치를 만들어서 작업을 진행하는 것이다.

등등 여러가지 용도에 사용이 가능하다.

 

일단 브랜치를 만들어보자!

 

 

그러기 위해 사용할 명령은 git branch라는 명령이 있다.

 입력하면 * master 이렇게 나온다.

이것은 현재 우리가 마스터라는 브랜치를 쓰고 있다는 뜻이다.  ( 현재 마스터 브랜치를 쓰고 있기 때문에 * 이 붙어있음)

깃은 우리가 기술을 사용하는 그 순간부터 기본 브랜치를 사용하게 되어있따. 그 브랜치의 이름이 마스터이고, 

따라서 마스터라는 브랜치는 일종의 약속 같은 특별한 이름의 브랜치이다.

 

git branch [파일이름]

git checkout [파일이름] : master에서 체크아웃하고 파일로 들어가는 거다 

ls -al를 하면 f1.txt가 나오고 git log를 하면 1과 2가 나온다. 이 얘기는 마스터 브랜치와 exp 브랜치는 같은 상태라는 것이다. 우리가 브랜치를 생성하면 그 생성한 브랜치는 내가 현재 속해있는 브랜치의 상태를 그대로 복사한다.

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만 해도 아래의 정보가 나온다.)

master 브랜치의 가장 최신 커밋이 2이고 exp브랜치의 최신 커밋이 4라는 뜻이다. HEAD는 현재 우리는 exp 브랜치에 체크아웃 되었다 라는 것이다.

 

git log --branches --decorate --graph 를 하면 옆에 빨간 줄이 생긴다. 이게 무슨 뜻이냐.

아래에서 위로 브랜치가 흘러왔다라는 뜻이데, 지금 이 상황에서 이것만으로는 그래프의 효용이 전혀 드러나지 않는다.

마스터와 exp가 서로 브랜치의 상태, 서로 커밋 상태가 각자의 길을 걷고 있을 때 효용이 드러난다.

 

 

 

exp 브랜치는 최신커밋이 4이고 그 이전에는 3이었다. 그리고 2라고 하는 커밋에서 비롯된 것이다.&nbsp; 그리고 마스터 브랜치는 5 이전에 누구였나 보면 2였다. 즉 마스터와 exp는 커밋 2 가 공통의 조상이다.

 

--online까지 추가해서 입력하면 한 줄로 현재 상태를 훨씬 더 간결하게 보여준다.

 

 

그리고 버전과 버전 사이의 차이점을 비교할 때는 

git log master..exp // 현재 내가 있는 마스터와 exp 사이에 차이가 무엇이냐 라는 명령

=> 마스터에는 없고 exp에는 있는 것들을 보여준다.

반대로 git log exp..master 하면 exp에는 없고 마스터에 있는 것들을 보여준다.

만약에 소스 코드까지 필요하면 각각의 버전별로 어떤 차이가 있는가를 -p를 통해서 알아낼 수 있다.

 

exp에는 없고 마스터에는 있는 커밋이 5라는 것과 exp에는 ---/dev/null => 파일이 없는데 마스터에서는 f3라는 파일을 생성했고 그 파일의 내용은 a 가 추가되었다는 것을 보여줌.

그리고 git diff를 사용하게 되면 각각의 브랜치에 현재 상태들을 비교할 수가 있다.

git diff master..exp


작업을 분기해서 작업의 히스토리를 만들어보았는데 그러다가 이 작업들을 어느 시점에서 병합해야 될 필요성이 생긴다.

병합 (merge)

지금까지 exp에서 작업했던 내용을 마스터로 병합하는 방법을 살펴보자! 마스터 브랜치가 exp에서 작업했던 3,4라고 하는 두개의 커밋의 내용을 마스터 브랜치도 갖게 하는 것이 첫번째 목표이다.

 

exp를 마스터로 가져올 거면 마스터로 체크아웃 하고 그 상태에서 git merge하고 exp를 해야된다. 

git merge를 입력하니 에디터가 열리면서 merge branch 'exp' = exp를 마스터로 머지 했다.     라는 커밋이 만들어 진다.

:wq 하고 확인해보면

Merge branch 'exp'라고 자동으로 커밋메세지가 지정된 이 커밋은 2개의 부모 커밋을 가진다. 첫번째는 원래 마스터가 가지고 있었던 5번을 일단 부모로 갖고, 동시에 exp가 작업했던 3번과 4번을 부모로 가진다.

그래서 내가 merge를 해서 만들어진 커밋은 2개의 부모를 갖는 하나의 커밋으로 만들어졌고 마스터는 이제 자기가 작업했던 5번과 exp가 작업했던 3,4번의 커밋을 모두 가지고 있는 상태가 된 것이다.

따라서 ls -al을 입력하여 파일 목록을 보니깐 마스터는 이제 드디어 f1.txt, f3.txt를 모두 갖는 상태가 된 것이다.

 

하지만 exp는 3,4번의 커밋을 갖고있지만 5번 커밋은 갖고있지 않다. exp도 마스터가 작업했던 5번 커밋을 포함하도록 만들어 보겠다.( 그럼 exp와 마스터는 완전히 같은 상태가 됨)

 

exp와 마스터가 똑같은 커밋을 최신 커밋으로 갖고 있고 exp는 마스터와 똑같이 3,4,와 5 커밋을 공통의 부모로 갖는 커밋이 됐기 때문에 exp와 마스터는 완전히 똑같은 상태가 되었다.

이제 더이상 exp는 작업이 끝났으니 지워도 된다.

마스터로 돌아가서 

git branch -d exp : exp 브랜치가 삭제가 된다.

 

728x90

'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

댓글