모든 버전 관리 시스템은 브랜치를 지원한다.
개발을 하다 보면 코드를 여러 개로 복사해야 하는 일이 자주 생긴다.
코드를 통째로 복사하고 나서 원래 코드와는 상관없이 독립적으로 개발을 진행할 수 있는데, 이렇게 독립적으로 개발하는 것이 브랜치다.
사람들은 브랜치 모델이 Git의 최고의 장점이라고, Git이 다른 것들과 구분되는 특징이라고 말한다.
당최 어떤 점이 그렇게 특별한 것일까.
Git의 브랜치는 매우 가볍다.
순식간에 브랜치를 새로 만들고 브랜치 사이를 이동할 수 있다.
다른 버전 관리 시스템과는 달리 Git은 브랜치를 만들어 작업하고 나중에 Merge 하는 방법을 권장한다. 심지어 하루에 수십 번씩해도 괜찮다.
Git 브랜치에 능숙해지면 개발 방식이 완전히 바뀌고 다른 도구를 사용할 수 없게 된다.
출처: https://git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
👉 master ➡ main
: master는 git의 가장 기본 branch였다. 현재는 master라는 이름이 main으로 바뀜!
가장 먼저 git에 commit하면 branch를 따로 생성하지 않는 한 모든 커밋 내용은 main에 올라간다.
👉 $ git branch test1
: 새로운 branch 생성 ➡ 이름은 아무거나 설정해도 상관 없다.
👉 $ git checkout test1
: test1 branch로 이동 ➡ 이제 이 브랜치에서는 main과 무관하게 독자적인 작업이 가능하다!
👉 $ ls -al 혹은 $ git log
실행 해보면 main 브랜치와 내용이 똑같다.
즉, branch를 생성하면 현재 속한 branch = main을 그대로 복사한다.
👉main에 파일 생성 후 commit ➡ push
ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (main)
$ vim f1.txt
ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (main)
$ git add f1.txt
warning: LF will be replaced by CRLF in f1.txt.
The file will have its original line endings in your working directory
ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (main)
$ git commit -m "first"
[main (root-commit) 172cd42] first
1 file changed, 1 insertion(+)
create mode 100644 f1.txt
ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (main)
$ git push -u origin main
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 206 bytes | 206.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:ssnhhyejin/for_branch.git
* [new branch] main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.
👉 새로운 branch 생성 & 새 파일 생성 후 커밋
<ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (main)
$ git log
* commit 172cd42b7eb455b4ef5ab852ab1feed788608dd7 (HEAD -> main, origin/main)
Author: ssnhhyejin <ssnhhyejin@gmail.com>
Date: Thu Feb 23 11:26:00 2023 +0900
first
ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (main)
$ git branch new
ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (main)
$ git checkout new
Switched to branch 'new'
ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (new)
$ vim f2.txt
ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (new)
$ git add f2.txt
warning: LF will be replaced by CRLF in f2.txt.
The file will have its original line endings in your working directory
ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (new)
$ git commit -m "2"
[new 507d420] 2
1 file changed, 1 insertion(+)
create mode 100644 f2.txt
👉 브랜치 별 파일들을 cmd로 확인
ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (new)
$ git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (main)
$ ls -al
total 13
drwxr-xr-x 1 ssnhh 197610 0 Feb 23 11:27 ./
drwxr-xr-x 1 ssnhh 197610 0 Feb 23 11:23 ../
drwxr-xr-x 1 ssnhh 197610 0 Feb 23 11:27 .git/
-rw-r--r-- 1 ssnhh 197610 4 Feb 23 11:25 f1.txt
ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (main)
$ git checkout new
Switched to branch 'new'
ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (new)
$ ls -al
total 14
drwxr-xr-x 1 ssnhh 197610 0 Feb 23 11:58 ./
drwxr-xr-x 1 ssnhh 197610 0 Feb 23 11:23 ../
drwxr-xr-x 1 ssnhh 197610 0 Feb 23 11:58 .git/
-rw-r--r-- 1 ssnhh 197610 4 Feb 23 11:25 f1.txt
-rw-r--r-- 1 ssnhh 197610 8 Feb 23 11:58 f2.txt
👉 새로운 branch로 push
ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (new)
$ git push origin new
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 260 bytes | 260.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote:
remote: Create a pull request for 'new' on GitHub by visiting:
remote: https://github.com/ssnhhyejin/for_branch/pull/new/new
remote:
To github.com:ssnhhyejin/for_branch.git
* [new branch] new -> new
👉 push한 branch 확인
✨ $ git log --branches --decorate
➡ 모든 branch의 log 표시
ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (new)
$ git log --branches --decorate
commit 507d42073fab350648a4231d430cdd32dc8b0e64 (HEAD -> new, origin/new)
Author: ssnhhyejin <ssnhhyejin@gmail.com>
Date: Thu Feb 23 11:27:52 2023 +0900
2
commit 172cd42b7eb455b4ef5ab852ab1feed788608dd7 (origin/main, main)
Author: ssnhhyejin <ssnhhyejin@gmail.com>
Date: Thu Feb 23 11:26:00 2023 +0900
first
➡ 제일 최근 commit된 내용이 최상단에 위치
✨ $ git log --branches --decorate --graph (--oneline)
➡ branch별 변동 사항을 graph로 볼 수 있다.
ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (new)
$ git log --branches --decorate --graph
* commit 507d42073fab350648a4231d430cdd32dc8b0e64 (HEAD -> new, origin/new, origin/main, main)
| Author: ssnhhyejin <ssnhhyejin@gmail.com>
| Date: Thu Feb 23 11:27:52 2023 +0900
|
| 2
|
* commit 172cd42b7eb455b4ef5ab852ab1feed788608dd7
Author: ssnhhyejin <ssnhhyejin@gmail.com>
Date: Thu Feb 23 11:26:00 2023 +0900
first
✨ $ git log main..new
➡ main에는 있고 new에는 없는 내용을 보여준다
✨ $ git log new..main
➡ new에는 있고 main에는 없는 내용을 보여준다
ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (main)
$ git log main..new
commit 55c71f6a0c80d5c9a7f8acfa57a3c64508ff4078 (new)
Author: ssnhhyejin <ssnhhyejin@gmail.com>
Date: Thu Feb 23 14:17:15 2023 +0900
3
ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (main)
$ git log new..main
commit 507d42073fab350648a4231d430cdd32dc8b0e64 (HEAD -> main, origin/new, origin/main)
Author: ssnhhyejin <ssnhhyejin@gmail.com>
Date: Thu Feb 23 11:27:52 2023 +0900
2
✨ $ git diff main..new
➡ new에는 있고 main에는 없는 내용을 보여준다
ssnhh@DESKTOP-9APISNT MINGW64 ~/git/forGit (main)
$ git diff main..new
diff --git a/f2.txt b/f2.txt
deleted file mode 100644
index 9f47804..0000000
--- a/f2.txt
+++ /dev/null
@@ -1 +0,0 @@
-bbbbbb
diff --git a/f3.txt b/f3.txt
new file mode 100644
index 0000000..dfa5c2c
--- /dev/null
+++ b/f3.txt
@@ -0,0 +1 @@
+adv
📌1-2에서 정리한 것 처럼 main에 push 하는 경우는 거의 없다!
컨펌 후 merge하는 것이다. 대부분의 작업물은 파트 완성 후 자신의 branch로 push한다!!!
git은 branch 생성하고 여기에 push 하고 다시 main으로 merge하기까지가 편하다는게 장점이다🙌🙌