[Git] Git Branch์ ๋ํ ์ดํด์ ํ์ฉ
Git Branch์ ๋ํ ์ดํด์ ํ์ฉ
Git Branch๋ Git์์ ๋งค์ฐ ์ค์ํ ๊ฐ๋
์ค ํ๋์
๋๋ค.
์ด๋ฒ ํฌ์คํธ์์๋ Git Branch๋ ๋ฌด์์ธ์ง, Git Branch๋ฅผ ํ์ฉํ์ฌ ์ด๋ป๊ฒ ์ฝ๋๋ฅผ ๊ด๋ฆฌํ ์ ์๋์ง, ๊ทธ๋ฆฌ๊ณ Git Branch๋ฅผ ํ์ฉํ ํ์
๋ฐฉ๋ฒ ๋ฑ์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
- โ๋ชจ๋ ๋ฒ์ ๊ด๋ฆฌ ์์คํ
์ ๋ธ๋์น๋ฅผ ์ง์ํ๋ค. ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ์ฝ๋๋ฅผ ์ฌ๋ฌ ๊ฐ๋ก ๋ณต์ฌํด์ผ ํ๋ ์ผ์ด ์์ฃผ ์๊ธด๋ค. ์ฝ๋๋ฅผ ํต์งธ๋ก ๋ณต์ฌํ๊ณ ๋์ ์๋ ์ฝ๋์๋ ์๊ด์์ด ๋
๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐ์ ์งํํ ์ ์๋๋ฐ, ์ด๋ ๊ฒ ๋
๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐํ๋ ๊ฒ์ด ๋ธ๋์น๋ค.โ
โณ ์ถ์ฒ : Git ๋ธ๋์น - ๋ธ๋์น๋ ๋ฌด์์ธ๊ฐ
-
Git Branch๋?

https://digitalvarys.com/git-branch-and-its-operations/
Git Branch๋ Git์์ ์ฝ๋๋ฅผ ๋ถ๊ธฐํ์ฌ ๊ด๋ฆฌํ๋ ๊ฐ๋
์
๋๋ค.
- Git์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก
main ํน์ master๋ผ๋ ํ๋์ ๋ธ๋์น๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ด ๋ธ๋์น์์ ์๋ก์ด ๋ธ๋์น๋ฅผ ๋ง๋ค์ด ์์
์ ์งํํฉ๋๋ค.
- ์๋ก์ด ๋ธ๋์น๋ฅผ ๋ง๋ค๋ฉด, ๊ธฐ์กด ๋ธ๋์น์ ๋
๋ฆฝ์ ์ผ๋ก ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ์ ์์ด ๊ธฐ๋ฅ ๊ฐ๋ฐ, ๋ฒ๊ทธ ์์ , ์คํ์ ์๋ ๋ฑ์ ์์ ํ๊ฒ ์ํํ ์ ์์ต๋๋ค.
-
Git Branch ๊ด๋ฆฌ ๋ฐฉ๋ฒ
2.1. ํ์ฌ ๋ธ๋์น ์ ๋ณด ํ์ธ
- ํ์ฌ ์์
์ค์ธ ๋ธ๋์น๋
* ํ์๋ก ๋ํ๋ฉ๋๋ค.
์์:

- ์๊ฒฉ ๋ธ๋์น๊น์ง ํ์ธํ๊ณ ์ถ๋ค๋ฉด:
์์:

1
2
3
| * main
remotes/origin/HEAD -> origin/main
remotes/origin/main
|
ํด์:
* main โ ์ง๊ธ ๋น์ ์ ๋ก์ปฌ์ main ๋ธ๋์น์์ ์์
์ค์
๋๋ค.
origin/main์ ์๊ฒฉ ์ ์ฅ์(origin) ์ ์๋ main ๋ธ๋์น์
๋๋ค.
- ์ฆ, GitHub๋ GitLab์ main ๋ธ๋์น๋ฅผ ์๋ฏธํฉ๋๋ค.
remotes/origin/HEAD -> origin/main
origin์ด๋ผ๋ ์๊ฒฉ ์ ์ฅ์์ ๊ธฐ๋ณธ ๋ธ๋์น๋ main์์ ์๋ฏธํฉ๋๋ค.
HEAD๋ ๊ทธ ๊ธฐ๋ณธ ๋ธ๋์น๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์
๋๋ค.
Q. ์ง๊ธ ์ฌ์ฉํ๋ ๋ธ๋์น main์ด origin/main์ด๋ ๊ฐ์ ๊ฑฐ์ผ?
- ๐ ์์ ํ ๊ฐ์ง๋ ์์์.
main: ๋ด ์ปดํจํฐ(Local) ์ ์๋ ๋ธ๋์น
origin/main: ์๊ฒฉ ์ ์ฅ์(Remote) ์ ์๋ ๋ธ๋์น
โ ์ฆ, ๊ฐ์ ์ด๋ฆ์ด์ง๋ง ์๋ก ๋ค๋ฅธ ๊ณต๊ฐ์ ์์ต๋๋ค.
โ ๊ทธ๋ฆฌ๊ณ , ์ฐ๋ฆฌ๋ ์ด๋ค์ ์๋ก ๋๊ธฐํ(push/pull) ํ๋ฉด์ ๊ด๋ฆฌํ๋ ๊ฒ์
๋๋ค.
๋ณดํต์ ์ด๋ฐ ์์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค :
1
2
3
4
5
| # ์๊ฒฉ์ ์ต์ ๋ด์ฉ์ ๋ด ๋ก์ปฌ main ๋ธ๋์น์ ๋ฐ์
$ git pull origin main
# ๋ก์ปฌ์ ๋ณ๊ฒฝ ๋ด์ฉ์ ์๊ฒฉ main์ ๋ฐ์
$ git push origin main
|
Q. ๋ ์์ฌ์ด ๋ง์. ๋ก์ปฌ ๋ธ๋์น main์ด ์๊ฒฉ ๋ธ๋์น origin/main๊ณผ ์ ๋ง ์ฐ๊ฒฐ๋์ด ์๋์ง(๋งค์นญ๋๋์ง) ํ์ธํ๊ณ ์ถ์ด.
- ๐
git status๋ก ํ์ธ์ด ๊ฐ๋ฅํฉ๋๋ค.
์
๋ ฅ:
์ถ๋ ฅ:
1
2
| On branch main
Your branch is up to date with 'origin/main'.
|
2.2. Git Branch ์์ฑ
1
| $ git branch <์ ๋ธ๋์น ์ด๋ฆ>
|
์:
1
| $ git branch feature/login
|
ํน์ ์์ฑ๊ณผ ๋์์ ์ ํํ๋ ค๋ฉด:
1
| $ git checkout -b feature/login
|
2.3. Git Branch ์ด๋ฆ ๋ณ๊ฒฝ
1
| $ git branch -m <์ ๋ธ๋์น ์ด๋ฆ>
|
ํ์ฌ ๋ธ๋์น์์ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ:
1
| $ git branch -m feature/login feature/auth
|
2.4. Git Branch ์ญ์
1
| $ git branch -d <์ญ์ ํ ๋ธ๋์น ์ด๋ฆ>
|
๊ฐ์ ์ญ์ (๋ณํฉ ์ ๋ ๊ฒฝ์ฐ๋ ํฌํจ):
1
| $ git branch -D <์ญ์ ํ ๋ธ๋์น ์ด๋ฆ>
|
2.5. Git Branch ์ ํ
1
| $ git checkout <์ ํํ ๋ธ๋์น ์ด๋ฆ>
|
๋๋ Git 2.23 ์ดํ์๋ switch ๋ช
๋ น๋ ์ฌ์ฉ ๊ฐ๋ฅ:
1
| $ git switch feature/login
|
๐ง Git ์ค๋ฌด ์์
โ
A. ์๋ก์ด ๊ธฐ๋ฅ ๋ธ๋์น ์์ฑ ๋ฐ ์์
(๊ธฐํ/๊ธฐ๋ฅ ์ ๊ท ์ฐฉ์ ์)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # 1. ๊ธฐ์ค ๋ธ๋์น(main ๋๋ dev) ์ต์ ํ
$ git checkout main
$ git pull origin main
# 2. ์๋ก์ด ๊ธฐ๋ฅ ๋ธ๋์น ์์ฑ ๋ฐ ์ ํ
$ git checkout -b feat/user-profile
# 3. ์์
ํ ์ปค๋ฐ
$ git add .
$ git commit -m "โจ feat: ์ฌ์ฉ์ ํ๋กํ ํ์ด์ง ์์ฑ"
# 4. ์๊ฒฉ ์ ์ฅ์์ ์ ๋ธ๋์น ํธ์
$ git push -u origin feat/user-profile
# 5. PR ์์ฑ โ ๋ฆฌ๋ทฐ โ Merge โ ๋ธ๋์น ์ญ์
|
โ
B. ์๊ฒฉ์ ์ด๋ฏธ ์กด์ฌํ๋ ๋ธ๋์น์์ ์์
๊ณ์ํ๊ธฐ (๊ธฐ์กด ๋ธ๋์น ์ด์ด๋ฐ๊ธฐ)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| # 1. ์ ์ฅ์ clone (์ฒ์ ๋ฐ๋ ๊ฒฝ์ฐ)
$ git clone https://github.com/your-org/your-repo.git
$ cd your-repo
# 2. ์๊ฒฉ ๋ธ๋์น ๋ชฉ๋ก ํ์ธ
$ git branch -r
# 3. ์์
ํ ๋ธ๋์น checkout (๋ก์ปฌ ๋ธ๋์น ์์ฑ + ์๋ ํธ๋ํน)
$ git checkout feat/user-profile
# ๋๋ ๋ช
์์ ์ผ๋ก
$ git checkout -b feat/user-profile origin/feat/user-profile
# ๋๋ ์๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ๊ฐ๋ฅ (์ถ์ฒ)
$ git checkout --track origin/feat/user-profile
$ git switch --track origin/feat/user-profile
# 4. ์์
์์
$ git pull # ํน์ ์ต์ ์ํ๊ฐ ์๋ ๊ฒฝ์ฐ
$ git status
$ git add .
$ git commit -m "โป๏ธ fix: ํ๋กํ UI ์์ "
# 5. ์๊ฒฉ ์ ์ฅ์๋ก ํธ์
$ git push # ์ด๋ฏธ tracking ์ค์ด๋ฉด ๋ธ๋์น๋ช
์๋ต ๊ฐ๋ฅ
|
-
Git Branch ์ ๋ต
Git Branch ์ ๋ต์ ํ์
์ ๋ธ๋์น ๋ช
๋ช
๊ท์น, ์์ฑ/๋ณํฉ ํ๋ฆ์ ๋ช
ํํ ํ๊ธฐ ์ํ ์ ๋ต์ ์ ํ์
๋๋ค. ์๋๋ ๋ํ์ ์ธ 3๊ฐ์ง ์ ๋ต์
๋๋ค.
3.1. Git Flow ์ ๋ต
๊ตฌ์ฑ:
main: ์ค์ ์ด์ ์ค์ธ ์ฝ๋ (๋ฐฐํฌ์ฉ)
develop: ๊ฐ๋ฐ ํตํฉ ๋ธ๋์น
feature/๊ธฐ๋ฅ: ๊ธฐ๋ฅ ๊ฐ๋ฐ ๋ธ๋์น
release/๋ฒ์ : ์ถ์ ์ค๋น ๋ธ๋์น
hotfix/์ด์: ์ด์ ์ด์ ๊ธด๊ธ ์์
1
2
| # ์์: feature ๋ธ๋์น ์์ฑ
$ git checkout -b feature/search-filter develop
|
3.2. GitHub Flow ์ ๋ต
main์์ ์ง์ ๋ธ๋์น๋ฅผ ํ์ ์์
ํ Pull Request
CI/CD๊ฐ ์๋์ผ๋ก ๋์ํ๋ฉฐ ๋ฐฐํฌ ๊ฐ๋ฅ
- ๋น ๋ฅธ ๋ฐ๋ณต๊ณผ ๊ฐ๊ฒฐํ ๊ตฌ์กฐ์ ์ ํฉ
3.3. GitLab Flow ์ ๋ต
- GitLab Flow๋ GitHub Flow์ Git Flow์ ์ค๊ฐ ํํ
main, production, feature, bugfix, release ๋ธ๋์น๋ฅผ ํผํฉ์ ์ผ๋ก ์ด์ฉ
- ํ๊ฒฝ(branch-to-environment) ๊ธฐ๋ฐ ๋ฐฐํฌ ์ฐ๊ณ๊ฐ ์์ฃผ ์ฌ์ฉ๋จ
-
Git Branch ํ์
๋ฐฉ๋ฒ
4.1. ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ์ํ Git Branch ํ์ฉ
1
2
| $ git checkout -b feature/payment
$ git push origin feature/payment
|
- GitHub์์ Pull Request ์์ฑํ์ฌ ์ฝ๋ ๋ฆฌ๋ทฐ ์์ฒญ
main ๋๋ develop ๋ธ๋์น๋ก ๋ณํฉํ๊ธฐ ์ ๋ฆฌ๋ทฐ ํ์
4.2. ํ ํ์
์์ ๋ธ๋์น ๊ท์น ์์
| ๋ธ๋์น ํ์
|
๋ช
๋ช
๊ท์น |
์ฉ๋ |
| ๊ธฐ๋ฅ ์ถ๊ฐ |
feature/<๊ธฐ๋ฅ๋ช
> |
์ ๊ธฐ๋ฅ ๊ฐ๋ฐ |
| ๋ฒ๊ทธ ์์ |
bugfix/<์ด์๋ช
> |
๋ฐ๊ฒฌ๋ ๋ฒ๊ทธ ์์ |
| ๊ธด๊ธ ํจ์น |
hotfix/<์ด์๋ช
> |
์ด์ ์ค ๊ธด๊ธ ์์ |
| ๋ฐฐํฌ ์ค๋น |
release/<๋ฒ์ > |
QA ๋ฐ ๋ฐฐํฌ ์ ์ต์ข
๊ฒ์์ฉ ๋ธ๋์น |
| ์คํ/๊ฐ์ธ ํ
์คํธ |
experiment/<์ฃผ์ > |
์คํ์ ์ฝ๋ ํ
์คํธ |
-
๋ฐ์ ๊ฐ๋ฅ ๋ฌธ์ ๋ฐ ํด๊ฒฐ๋ฐฉ๋ฒ
5.1. ์ถฉ๋ ๋ฐ์ ์์ ๋ฐ ํด๊ฒฐ
1
2
| Auto-merging app.py
CONFLICT (content): Merge conflict in app.py
|
ํด๊ฒฐ ๋ฐฉ๋ฒ:
app.py ํ์ผ์ ์ด์ด <<<<<<<, =======, >>>>>>> ๋ก ํ์๋ ๋ถ๋ถ์ ํ์ธ
- ์ํ๋ ์ฝ๋๋ง ๋จ๊ธฐ๊ณ ๋๋จธ์ง ์ญ์
- ์์ ํ add & commit:
1
2
| $ git add app.py
$ git commit -m "Resolve merge conflict in app.py"
|
-
Git ์ถฉ๋ ํด๊ฒฐ ์ค์ต๊ณผ rebase vs merge ๋น๊ต
6.1. ์ถฉ๋(Conflict)์ด๋?
Git์์ ์ถฉ๋(conflict) ์ ๋ ๋ธ๋์น์์ ๋์ผํ ํ์ผ์ ๊ฐ์ ๋ผ์ธ์ ์์ ํ๊ณ ๋ณํฉํ ๋ ๋ฐ์ํฉ๋๋ค. Git์ ์ด๋ค ๋ณ๊ฒฝ์ ์ ์ฉํด์ผ ํ ์ง ์๋์ผ๋ก ๊ฒฐ์ ํ ์ ์๊ธฐ ๋๋ฌธ์, ์ฌ์ฉ์๊ฐ ์๋์ผ๋ก ํด๊ฒฐํด์ผ ํฉ๋๋ค.
6.2. ์ค์ต ์์ : ์ถฉ๋ ์ํฉ ๋ง๋ค๊ธฐ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # main ๋ธ๋์น์์ ์๋ก์ด ํ์ผ ์์ฑ
$ git checkout -b main
$ echo "console.log('Hello from main');" > app.js
$ git add app.js
$ git commit -m "Main: Add greeting message"
# feature ๋ธ๋์น ์์ฑ ๋ฐ ์์
$ git checkout -b feature
$ echo "console.log('Hello from feature');" > app.js
$ git commit -am "Feature: Update greeting message"
# main ๋ธ๋์น์์ ๋ค๋ฅธ ๋ด์ฉ์ผ๋ก ์์
$ git checkout main
$ echo "console.log('Hello from MAIN branch');" > app.js
$ git commit -am "Main: Change greeting message"
|
์ด์ feature ๋ธ๋์น๋ฅผ main์ ๋ณํฉํ๋ ค๊ณ ํ๋ฉด ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค.
6.3. ์ถฉ๋ ํด๊ฒฐ ๋ฐ ๋ณํฉ
1
2
3
| # feature ๋ธ๋์น์์ main ๋ณํฉ ์๋
$ git checkout feature
$ git merge main
|
์ถ๋ ฅ:
1
2
3
| Auto-merging app.js
CONFLICT (content): Merge conflict in app.js
Automatic merge failed; fix conflicts and then commit the result.
|
app.js ํ์ผ์ ์ด์ด๋ณด๋ฉด ์๋์ ๊ฐ์ ์ถฉ๋ ๋ง์ปค๊ฐ ํ์๋ฉ๋๋ค.
1
2
3
4
5
| <<<<<<< HEAD
console.log('Hello from feature');
=======
console.log('Hello from MAIN branch');
>>>>>>> main
|
ํด๊ฒฐ ๋ฐฉ๋ฒ:
- ์ํ๋ ์ฝ๋๋ง ๋จ๊ธฐ๊ณ ์์ :
1
| console.log('Hello from BOTH branches');
|
- ์์ ํ ์ ์ฅ, add & commit
1
2
| $ git add app.js
$ git commit -m "Resolve conflict in app.js"
|
์ด์ ์ถฉ๋์ด ํด๊ฒฐ๋์์ต๋๋ค.
6.4. Merge vs Rebase
| ํญ๋ชฉ |
merge |
rebase |
| ๋ชฉ์ |
๋ ๋ธ๋์น๋ฅผ ํตํฉ |
๋ธ๋์น ๊ธฐ๋ฐ์ ์ต์ ์ปค๋ฐ์ผ๋ก ๋ณ๊ฒฝ |
| ์ปค๋ฐ ์ด๋ ฅ |
๋ธ๋์น ๋ณํฉ ํ์คํ ๋ฆฌ ์ ์ง (merge commit) |
์ปค๋ฐ ํ์คํ ๋ฆฌ๋ฅผ ๊น๋ํ๊ฒ ์ฌ์์ฑ |
| ์ฌ์ฉ ์ํฉ |
ํ์
๊ธฐ๋ก์ ๋ช
ํํ ๋จ๊ธฐ๊ณ ์ถ์ ๋ |
๊ฐ์ธ ๋ธ๋์น ์ ๋ฆฌ, ๊น๋ํ ํ์คํ ๋ฆฌ ๊ด๋ฆฌ ์ |
| ์ถฉ๋ ๋ฐ์ ์์ |
๋ณํฉ ์์ |
rebase ๊ณผ์ ์ค ๊ฐ ์ปค๋ฐ๋ง๋ค ์ถฉ๋ ๊ฐ๋ฅ์ฑ ์์ |
| ๋ช
๋ น์ด ์์ |
$ git merge main |
$ git rebase main |
6.5. Rebase ์ค์ต
1
2
3
| # feature ๋ธ๋์น์์ main ๋ณ๊ฒฝ ์ฌํญ์ rebase
$ git checkout feature
$ git rebase main
|
์ค๊ฐ์ ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ๋์ผํ๊ฒ ์๋ ํด๊ฒฐ ํ:
1
2
| $ git add app.js
$ git rebase --continue
|
์ ์ฒด rebase ์ค๋จ์:
โ
์ ๋ฆฌ
merge๋ ๋ณํฉ ์ด๋ ฅ์ ๋ช
ํํ ๋ณด์ฌ์ฃผ๋ ๋ฐ๋ฉด,
rebase๋ ํ์คํ ๋ฆฌ๋ฅผ ๊น๋ํ๊ฒ ์ ๋ฆฌํ๋ ๋ฐ ์ ๋ฆฌํฉ๋๋ค.
- ํ์
์์๋ ๋ณดํต
merge๋ฅผ, ๊ฐ์ธ ๋ธ๋์น ์ ๋ฆฌ์๋ rebase๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค.
- ์ถฉ๋์ Git ํ์
์์ ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ฉฐ, ์๋์ผ๋ก ์ถฉ๋ ๋ง์ปค๋ฅผ ์ฝ๊ณ ํด๊ฒฐํ๋ ์ญ๋์ด ์ค์ํฉ๋๋ค.