10 minute read

[GIT]Branch를 만들고, 정보를 확인하고, 병합하기 ❤

  • 클라이언트와 회사 내부에 배포될 파일을 분리해서 진행할 필요가 있는 경우와 같은 상황에서 클라이언트회사 내부가 각각이 브랜치가 될 수 있다! 즉, 케이스에 따라 버전 관리를 분기해서 진행할 수 있도록 하는 개념이 바로 브랜치다!

  • 다른 VCS의 브랜치 시스템보다 깃의 브랜치가 보다 가볍고 쓸만한 수준까지 끌어올렸다!

01. git branch - 현재 사용중인 브랜치 확인하기

git branch

나의 경우에는 origin/main으로 달린 브랜치를 사용중이기 때문에 main이 표시되는 것을 볼 수 있다

  • 원래는 기본 브랜치는 master인데 main으로 표기되기도 한다

둔치의 개발 이야기

02. git branch 브랜치명 - 브랜치명으로 브랜치 생성하기

git branch exp_git_test

위의 명령어를 통해서 레포지토리에는 “exp_git_test”라는 이름의 브랜치가 만들어지고, git branch 명령어를 통해서 생성된 브랜치를 확인해볼 수 있다

  • 보통, 기능을 추가하면 feature로 시작하고, 실험적인 브랜치면 exp를 붙여서 사용하기도 한다
  • *가 붙은 곳이 지금 있는 브랜치!

03. git checkout 브랜치명

  • 기존에 사용중이던 브랜치에서 나와서, 브랜치명 브랜치로 이동

git checkout exp_git_test

위와 같이 명령어를 실행해보면, 기존의 main 브랜치에서 exp_git_test로 이동된 것을 확인해볼 수 있다

🌟 로그를 찍어보면 기존의 브랜치에서 만들었던 로그와 동일한 것을 보아, 기존의 브랜치와 생성된 브랜치는 같은 상태임을 알 수 있다!

그리고 새로 만든 브랜치에서 f1.txt라는 파일을 새로 만들어 수정 후 , 커밋까지 진행하고,

main 브랜치에 돌아오면 아래처럼 버전 값 확인이 안되는 것을 볼 수 있다

추가로, 원래 main 브랜치에는 f1.txt가 없었기 때문에 cat f1.txt를 하면,

$ cat f1.txt cat: f1.txt: No such file or directory

아래와 같이 그런 파일이나 주소는 없다고 뜬다

즉, 파일이 어떤 브랜치에 있는지 혹은 같은 파일이더라도 어떤 브랜치에서 작업했는지에 따라서 완전히 달라질 수 있는 것이다!

https://github.com/hy6219/TIL/blob/main/gitStudy/doItStudy/versionControl/%EB%B8%8C%EB%9E%9C%EC%B9%98%EC%97%90%EC%84%9C%20%EC%BB%A4%EB%B0%8B%ED%95%9C%20%EB%82%B4%EC%9A%A9%EC%9D%84%20main%20%EB%B8%8C%EB%9E%9C%EC%B9%98%EC%97%90%EC%84%9C%20%ED%99%95%EC%9D%B8%ED%95%98%EA%B8%B0.PNG?raw=true

즉, 아래처럼, f2.txt파일을 하나 더 만들고 버전을 생성하기까지 한 채로 main으로 이동하면 디렉토리에서 f1.txt나 f2.txt를 확인할 수가 없는 것이다!

https://github.com/hy6219/TIL/blob/main/gitStudy/doItStudy/versionControl/git%20branch%EC%9D%98%20%ED%8A%B9%EC%A7%95.gif?raw=true

🌟 이렇게 깃은 저장소를 추가적으로 사용하지 않고 버전관리를 할 수 있게 된다! 브랜치를 통해서!

🌟 다만, 브랜치를 위해서 익혀야 할 것이 많다!

04. Branch 정보 확인하기

04-1. 브랜치 간 정보 차이 확인하기 1 git log --branches --decorate

저장소에 있는 모든 브랜치들의 버전을 폰트 색상을 달리주어 확인할 수 있도록 도와준다

https://github.com/hy6219/TIL/blob/exp_git_test/gitStudy/doItStudy/versionControl/git%20log%20--branches%20--decorate.PNG?raw=true

🌟 HEAD는 현재 체크아웃된 브랜치를 바라본다!

위에서는 현재 exp_git_test 브랜치의 최근 버전에서의 커밋 메시지가 “git log branches”임을 보여주고 있다

04-2. 브랜치 간 정보 확인하기 2 - git log —branches —decorate —graph

위의 명령어를 실행해보면 아래처럼 왼쪽에 모양의 선들이 생긴 것을 확인해볼 수 있다

https://github.com/hy6219/TIL/blob/main/gitStudy/doItStudy/versionControl/git%20log%20--branches%20--decorate%20--graph.PNG?raw=true

이것은 그 선의 흐름대로 브랜치가 작업을 해왔다는 것을 나타내는 것인데

이것으로만 정보를 확인하는 것은 그 이전과 별다른 차이가 없다

다만, 브랜치가 서로 각자의 길을 걷고 있을 때에는 그 차이가 보여질 수 있다!

main에서도 새로운 커밋을 만들어보자

✴️ git log 는 현재 체크아웃된 브랜치의 로그만을 보여준다!

먼저 main 브랜치에서 f3.txt라는 파일을 만들고, 커밋한 후 git log --branhes --decorate --graph를 해보자

그러면 빨간 글자가 exp_git_test 브랜치의 색이고, 초록색 글자가 main 브랜치의 색인데 이 두 색상을 이용한 선들이 보이는 것을 확인해볼 수 있다

https://github.com/hy6219/TIL/blob/main/gitStudy/doItStudy/versionControl/%EB%B8%8C%EB%9E%9C%EC%B9%98%EA%B0%80%20%EA%B0%81%EC%9E%90%20%EA%B4%80%EB%A6%AC%EB%90%A0%20%EB%95%8C%20git%20log%20--branches%20--decorate%20--graph.gif?raw=true

그리고 이를 통해서 두 브랜치의 공통의 조상은 바로 아래의 버전임을 확인해볼 수 있다!

  • commit b9c299118dfc70736142b4af4abdfe03653a0802 | Author: JSJeong hy6219@naver.com | Date: Fri Aug 20 20:39:47 2021 +0900

04-3. 브랜치 간 정보 확인하기 3 - git log --branches --decorate --graph --oneline

https://github.com/hy6219/TIL/blob/main/gitStudy/doItStudy/versionControl/git%20log%20--branches%20--decorate%20--graph%20--oneline.PNG?raw=true

이 명령어는 —oneline옵션을 주어서 한줄에 커밋메시지와 버전 아이디값을 보여준다!

그리고 어떤 부분에서 분기되고 내용이 달라지는지도 / 표시를 통해 확인해볼 수 있다!

이를 통해서 훨씬 간결하게 살펴볼 수 있다!

🌟 깃에서 저장소 위치에서 stree를 입력하면 해당 레포지토리에 대해서 GUI로 깃을 살펴볼 수 있는 소스트리가 실행될 수 있다! 이렇게 브랜치간 작업을 GUI에서 보다 시각적으로 확인해볼 수 있지만 CLI에서도 각자만의 가치가 있다고 한다!

04-4. 브랜치 간 정보 차이 확인하기 git log 브랜치1..브랜치2

$ git log main..exp_git_test

를 입력해보면

commit 11cbd671f973ed34a3436e9a399d9a927d30e77d (origin/exp_git_test, exp_git_test) Author: JSJeong hy6219@naver.com Date: Sat Aug 21 15:04:15 2021 +0900

test:git log --branches --decorate

commit 61de8713faa0c1ca9f525e0520d0593e0f310dbe Author: JSJeong hy6219@naver.com Date: Sat Aug 21 15:00:25 2021 +0900

git log branches

위와 같이 출력되는 것을 확인해볼 수 있는데, 이는 풀어서 설명하면 브랜치1에는 없고 브랜치2에만 있는 정보를 확인 한다는 것이다!

그러면 반대로 git log exp_git_test..main 은 아래처럼 main에서만 있는 정보를 확인하는 것이다! 즉 브랜치1이 집합A, 브랜치2가 집합B라면 B-A의 차집합 개념이라고 보면 되는 것이다!

commit fdaa2113512b506daef74114cd757ac63cf02498 (HEAD -> main, origin/main, origin/HEAD) Merge: b1fe5a6 a17ee32 Author: JSJeong hy6219@naver.com Date: Sat Aug 21 15:41:06 2021 +0900

git push origin main
Merge branch 'main' of https://github.com/hy6219/TIL

commit b1fe5a664f7d2f98310bfd11492a2a43099c2ca2 Author: JSJeong hy6219@naver.com Date: Sat Aug 21 15:25:01 2021 +0900

test:git log --branches --decorate --graph (--oneline)

commit 853837bf484f440305531244821f24869c53674b Author: JSJeong hy6219@naver.com Date: Sat Aug 21 15:13:56 2021 +0900

test:git log --branches --decorate --graph

commit a17ee32247cda9bb096ff636424bc007a02aec3f Merge: 9a47781 ffd7f37

04-5. 브랜치 간 정보 차이 +소스 차이 확인하기 git log -p 브랜치1..브랜치2

로그에 대해서 -p 옵션은 이미 아래의 링크에서 확인해본 바 있다! 소스 차이!!

[GIT]버전만들기

https://github.com/hy6219/TIL/blob/main/gitStudy/doItStudy/versionControl/git%20log%20-p%20%EB%B8%8C%EB%9E%9C%EC%B9%981..%EB%B8%8C%EB%9E%9C%EC%B9%982.PNG?raw=true

먼저 exp_git_test 브랜치에서 f1.txt의 내용을 수정해주고 커밋까지 진행해준 후,

git log -p main..exp_git_test 를 실행해주었다

그 결과 —-, +++로 차이점이 드러나는데,-가 앞 +가 뒤[버전간 차이에서는 -가 이전버전, +가 지금버전]이므로 main에서는 f1.txt파일이 없었는데 지금 브랜치에서는 해당 파일이 존재하며

그 내용이 “e”가 추가되었음을 확인해볼 수 있다

04-6. 브랜치 간 정보+소스 차이 확인하기with diff!- git diff 브랜치1..브랜치2

각 브랜치의 현재 상태들을 비교 가능

$ git diff main..exp_git_test

위를 실행해보면 아래처럼 마치 git log -p 브랜치1..브랜치2와 유사한 것을 확인해볼 수있다!

앞부분이 main, 뒤가 exp_git_test이기 때문에 -가 main이 되는 것이다! 따라서

main에서는 f1.txt파일이 없었는데 지금 브랜치에서는 해당 파일이 존재하며

그 내용이 “e”가 추가되었음을 확인해볼 수 있다

https://github.com/hy6219/TIL/blob/main/gitStudy/doItStudy/versionControl/git%20diff%20%EB%B8%8C%EB%9E%9C%EC%B9%981%20%EB%B8%8C%EB%9E%9C%EC%B9%982.PNG?raw=true

05. Branch 병합

각자 브랜치 작업을 진행하여 히스토리에 기록되던 중, 병합하고자 할 때 생각해볼 부분!

05-1. 분기한 브랜치 exp_git_test를 메인 브랜치인 main에 병합시키기

  1. main 브랜치로 체크아웃
  2. main 브랜치에서 merge 명령어 사용

먼저 exp_git_test에서 f1.txt 파일의 내용을 수정해주고 커밋까지 해주도록 하자

그 후 git checkout main을 통해서 메인 브랜치로 이동해주자

그 후, 아래와 같이 git merge 분기된_브랜치 명령어를 사용해주자

$ git merge exp_git_test

그런데 나의 경우에는 f3.txt파일에 대해서 충돌이 있었는데,

Removing gitStudy/doItStudy/readme.md CONFLICT (add/add): Merge conflict in f3.txt Auto-merging f3.txt Automatic merge failed; fix conflicts and then commit the result.

차분하게 안내되는 대로 git add 후 commit까지 적어주면 merge되는 것을 확인해볼 수 있다. 그 후 git log --branches --decorate --graph를 통해서 병합된 것을 다시금 시각적으로 확인해볼 수 있다!

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main)
$ git merge exp_git_test
Removing gitStudy/doItStudy/readme.md
CONFLICT (add/add): Merge conflict in f3.txt
Auto-merging f3.txt
Automatic merge failed; fix conflicts and then commit the result.
(중략)
gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main|MERGING)
$ git merge exp_git_test
error: Merging is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: Exiting because of an unresolved conflict.

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main|MERGING)
$ git add .

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main|MERGING)
$ git commit -m 'test:git merge'
[main 93b78b2] test:git merge

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main)
$ git log --branches --graph --decorate --oneline
*   93b78b2 (HEAD -> main) test:git merge
|\
| * 3423172 (exp_git_test) merge test pre
| * 812f1d0 git test
| * 11cbd67 (origin/exp_git_test) test:git log --branches --decorate
| * 61de871 git log branches
* | f3d0ded (origin/main, origin/HEAD) test:git diff branch1 branch2
* | e5e4274 test:git log -p 브랜치1..브랜치2
* |   fdaa211 git push origin main Merge branch 'main' of https://github.com/hy6219/TIL
|\ \
| * | a17ee32 Merge pull request #3 from hy6219/exp_git_test
| |\|
| | * ffd7f37 git branch
| | * 2aa6220 create f2.txt
| | * 4c1e3b5 test git after modify'
| | * 57d1ee6 test3
* | | b1fe5a6 test:git log --branches --decorate --graph (--oneline)
* | | 853837b test:git log --branches --decorate --graph
|/ /
* | 9a47781 git branch
* | 24d942b git branch
|/
:...skipping...
*   93b78b2 (HEAD -> main) test:git merge
|\
| * 3423172 (exp_git_test) merge test pre
| * 812f1d0 git test
| * 11cbd67 (origin/exp_git_test) test:git log --branches --decorate
| * 61de871 git log branches
* | f3d0ded (origin/main, origin/HEAD) test:git diff branch1 branch2
* | e5e4274 test:git log -p 브랜치1..브랜치2
* |   fdaa211 git push origin main Merge branch 'main' of https://github.com/hy6219/TIL
|\ \
| * | a17ee32 Merge pull request #3 from hy6219/exp_git_test
| |\|
| | * ffd7f37 git branch
| | * 2aa6220 create f2.txt
| | * 4c1e3b5 test git after modify'
| | * 57d1ee6 test3
* | | b1fe5a6 test:git log --branches --decorate --graph (--oneline)
* | | 853837b test:git log --branches --decorate --graph
|/ /
* | 9a47781 git branch
* | 24d942b git branch
|/
* b9c2991 docs:Update README.md
* c8959a7 docs:깃의 버전관리 공부
* ae3e338 add all and commit message not in vim editor
* ee951e7 git commit all option
* 4a1dfbc test git 210820-2
* 1b44d33 test git
* b5bf9f0 test git
* 8acf082 docs:git status
* 03d411d docs:References for git, JPA listener
* 46171a0 docs:Update README.md:210820-1
* 574f73c docs:JPA 엔티티 공부
* ad3123a Update README.md-210819-2
* 83005e8 docs:YAML,JUnit5 특징
* 110b0f2 JUnit5-SpringBootTest,WebMvcTest, DataJpaTest, JsonTest,RestClientTest
* 49e9231 Update README.md:210819-1
* cafa3ad overview about YAML
* b80c68a 스프링부트-자동설정
* 5dc3eaf docs:SWEA1926번  개의 숫자열
* 09eeabf 백준 18870-Arrays.sort, Map구조를 이용
* 1ad9ecf Update README.md:210818-1
* 29c2314 docs:퀵정렬 알고리즘 공부
* 0104145 단위 테스트  나타날  있는 Mockito 관련 에러
* ac759cc Update TIL
* 24ae1a4 Update README.md:210817-1
* f5bc3f8 [Spring dependencies]보다 유연한 그레이들 설치하기
* 42e9e3a check gradle build settings in project
* 58858b1 Update README.md:210816-1
* b54ab0c merge sort
* be33ba6 time complexity of merge sort
* 970919b merge sort algorithm
* c247d14 Update README.md:210815-4
* 22c376a 페이징 처리를 위한 쿼리메서드
* 883f034 Update README.md:210815-3
* b232238 정렬을 위한 다양한 쿼리메서드 정의 방식 with 코드가독성 측면
* 407461b Update README.md:210815-2

🌟 만약, 나와 같이 충돌이 있지 않는다면, 병합되면서 vim에디터가 뜨는데, 에디터에서 메시지를 수정하지 않는다면, 자동으로 Merge branch '분기된 브랜치명' 이 맨 상단에 보일 것이다(로그 추적시)

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (exp_git_test)
$ git checkout main
Switched to branch 'main'
Your branch is ahead of 'origin/main' by 7 commits.
  (use "git push" to publish your local commits)

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main)
$ git merge exp_git_test
Merge made by the 'recursive' strategy.
 f4.txt | 2 ++
 1 file changed, 2 insertions(+)
 create mode 100644 f4.txt
$ git log --branches --decorate --graph
*   **commit 9998e7dc8f9144d4f1c763887dc5aea0ed22fcf7 (HEAD -> main)**
|\  Merge: 17b2381 1ace639
| | Author: JSJeong <hy6219@naver.com>
| | Date:   Sat Aug 21 17:02:03 2021 +0900
| |
| |     **Merge branch 'exp_git_test'**
| |
| * commit 1ace6395b646923fb6fc03f8e0255785e66b363c (exp_git_test)
| | Author: JSJeong <hy6219@naver.com>
| | Date:   Sat Aug 21 17:01:47 2021 +0900
| |
| |     test:git merge test
| |
* | commit 17b2381859c49278d23f2f333905a3f5809d3667
|\| Merge: 93b78b2 7172399
| | Author: JSJeong <hy6219@naver.com>
| | Date:   Sat Aug 21 17:00:28 2021 +0900
| |
| |     merging
| |
| * commit 717239987a4e404ad63a6420f7ff799cf768714e
| | Author: JSJeong <hy6219@naver.com>

그러면 원래 분기전 포인트와 merge 포인트들로 부터 여러개의 부모 지점들이 생기게 된다![이제 main에서는 f1~f4.txt를 모두 갖고, f3.txt를 예로 들면 아래처럼 내용이 병합된 것을 확인해볼 수 있다]

<<<<<<< HEAD
iii
=======
git
<<<<<<< HEAD
>>>>>>> exp_git_test
=======
merge test
>>>>>>> exp_git_test

05-2. 05-1은 분기된 브랜치를 복사해서 main에 넣는것이라면, 이제는 분기된 브랜치와 main브랜치가 완전하게 같게 만들도록 하자

지금 하려는 것이 무슨 말인지 확인해보기 위해서 분기된 브랜치인 exp_git_test 브랜치로 체크아웃해보자

그 후 f3.txt 파일을 확인해보면, 분기된 브랜치에서 작성된 내용만이 포함된 것을 확인해볼 수 있다

직감이 오는가?? 그렇다! 이전에는 a 팀원님, 합본하기 위해서 팀장님께 파일 전달부탁드려요 라는 느낌으로 a 팀원은 그 팀원이 작성한 파일만 갖고 있었다면

이번에는 a 팀원님, 작업하면서 모든 팀원들과 같은 파일들을 갖고 있도록 합시다 라는 느낌이다!

$ cat f3.txt
git
merge test

이런 느낌으로 가보자!

먼저, 분기된 브랜치인 exp_git_test 브랜치로 체크아웃해보자

git checkout exp_git_test

🌟 main을 exp_git_test로 즉, 메인브랜치 내용을 분기된 브랜치로 가져오도록 하기 위해서 분기된 브랜치에서 git merge 메인브랜치를 해주자

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (exp_git_test)
$ git merge main
$ git log --branches --decorate --graph
*   **commit 9998e7dc8f9144d4f1c763887dc5aea0ed22fcf7 (HEAD -> exp_git_test, main)**
|\  Merge: 17b2381 1ace639
| | Author: JSJeong <hy6219@naver.com>
| | Date:   Sat Aug 21 17:02:03 2021 +0900
| |
| |     Merge branch 'exp_git_test'
| |
| ***** commit 1ace6395b646923fb6fc03f8e0255785e66b363c
| | Author: JSJeong <hy6219@naver.com>
| | Date:   Sat Aug 21 17:01:47 2021 +0900
| |
| |     test:git merge test
| |
* | commit 17b2381859c49278d23f2f333905a3f5809d3667
|\| Merge: 93b78b2 7172399
| | Author: JSJeong <hy6219@naver.com>
| | Date:   Sat Aug 21 17:00:28 2021 +0900
| |
| |     merging
| |
| ***** commit 717239987a4e404ad63a6420f7ff799cf768714e
| | Author: JSJeong <hy6219@naver.com>
| | Date:   Sat Aug 21 16:59:49 2021 +0900

그러면 HEAD, 즉 지금 체크아웃된 브랜치를 가리키는 HEAD가 exp_git_test를 가리키는데, 최신의 커밋이 exp_git_test와 main을 동시에 가리키고 있는 것을 확인해볼 수 있다!

그리고 두번째 라인위에 있는 * 표시를 확인해보았을 때, 해당 버전까지 포함시켜서 두 브랜치는 완전히 같은 상태가 되었다!

05-3. git branch -d 분기된 브랜치명 : 브랜치 삭제

나는 지금 exp_git_test를 계속해서 테스트용으로 사용하기 위해서 새로 exp라는 브랜치를 새로 만들어서 테스트해보겠다!

먼저 main브랜치로 이동하자

git checkout main

그리고 exp라는 브랜치를 만들고 확인하자

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main)
$ git branch 'exp'

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main)
$ git branch
  exp
  exp_git_test
* main

그리고 아래와 같이 명령어를 실행해보고 git branch로 확인해보자

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main)
$ git branch -d exp
Deleted branch exp (was 9998e7d).

gs813@DESKTOP-4A8Q9J9 MINGW64 /d/VirtualBox_share_folder/TIL (main)
$ git branch
  exp_git_test
* main

그러면 만들었던 브랜치가 삭제되었음을 확인해볼 수 있다

Updated: