1_[git]브랜치란 무엇인가(1)
[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
아래와 같이 그런 파일이나 주소는 없다고 뜬다
즉, 파일이 어떤 브랜치에 있는지 혹은 같은 파일이더라도 어떤 브랜치에서 작업했는지에 따라서 완전히 달라질 수 있는 것이다!
즉, 아래처럼, f2.txt파일을 하나 더 만들고 버전을 생성하기까지 한 채로 main으로 이동하면 디렉토리에서 f1.txt나 f2.txt를 확인할 수가 없는 것이다!
🌟 이렇게 깃은 저장소를 추가적으로 사용하지 않고 버전관리를 할 수 있게 된다! 브랜치를 통해서!
🌟 다만, 브랜치를 위해서 익혀야 할 것이 많다!
04. Branch 정보 확인하기
04-1. 브랜치 간 정보 차이 확인하기 1 git log --branches --decorate
저장소에 있는 모든 브랜치들의 버전을 폰트 색상을 달리주어 확인할 수 있도록 도와준다
🌟 HEAD는 현재 체크아웃된 브랜치를 바라본다!
위에서는 현재 exp_git_test 브랜치의 최근 버전에서의 커밋 메시지가 “git log branches”임을 보여주고 있다
04-2. 브랜치 간 정보 확인하기 2 - git log —branches —decorate —graph
위의 명령어를 실행해보면 아래처럼 왼쪽에 | 모양의 선들이 생긴 것을 확인해볼 수 있다 |
이것은 그 선의 흐름대로 브랜치가 작업을 해왔다는 것을 나타내는 것인데
이것으로만 정보를 확인하는 것은 그 이전과 별다른 차이가 없다
다만, 브랜치가 서로 각자의 길을 걷고 있을 때에는 그 차이가 보여질 수 있다!
main에서도 새로운 커밋을 만들어보자
✴️ git log
는 현재 체크아웃된 브랜치의 로그만을 보여준다!
먼저 main 브랜치에서 f3.txt라는 파일을 만들고, 커밋한 후 git log --branhes --decorate --graph
를 해보자
그러면 빨간 글자가 exp_git_test 브랜치의 색이고, 초록색 글자가 main 브랜치의 색인데 이 두 색상을 이용한 선들이 보이는 것을 확인해볼 수 있다
그리고 이를 통해서 두 브랜치의 공통의 조상은 바로 아래의 버전임을 확인해볼 수 있다!
- 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
이 명령어는 —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 옵션은 이미 아래의 링크에서 확인해본 바 있다! 소스 차이
!!
먼저 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”가 추가되었음을 확인해볼 수 있다
05. Branch 병합
각자 브랜치 작업을 진행하여 히스토리에 기록되던 중, 병합하고자 할 때 생각해볼 부분!
05-1. 분기한 브랜치 exp_git_test를 메인 브랜치인 main에
병합시키기
- main 브랜치로 체크아웃
- 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
그러면 만들었던 브랜치가 삭제되었음을 확인해볼 수 있다