Let's learn about git
Learn about the git concept, control, and flow
1. Git Concept ๐ฉโ๐ป
Git ์ ๋ณ๊ฒฝ ๋ด์ญ์ ์ถ์ ๊ธฐ๋กํ๋ ์ฆ๋ถ ๋ฐฑ์
(Snapshots)์ผ๋ก ๋์ํ๋ฉฐ ์ด์ ๋ฒ์ ๊ณผ ๋ค์ ๋ฒ์ ์ ๋ณ๊ฒฝ ๋ด์ญ์ delta
๋ผ๊ณ ํ๋ค. ๋ฐ๋ผ์ Git
Repository ๋ฅผ Clone ํ๋ค๋ ๊ฒ์ ์ด ๋ชจ๋ delta
๋ฅผ ํ์ด๋ธ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
C0 ๋ผ๋ ์ต์ด์ Base-commit ์ด ์กด์ฌํ๊ณ ์ฌ๊ธฐ์ 2๋ฒ์ ์ปค๋ฐ ์ ํ๋ค๊ณ ํด๋ณด์.
C0(Base) โฌ ๏ธ C1 โฌ ๏ธ C2((main*, HEAD))
C2 ๋ ์์ ์ ๋ถ๋ชจ๋ก C1 ์ ๊ฐ๋ฆฌํค๊ณ , C1 ์ ๋ค์ ์์ ์ ๋ถ๋ชจ๋ก C0 ๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ์ด๋ ๊ฒ ์ต์ด์ Base-commit ์ผ๋ก๋ถํฐ ์ฐ๊ฒฐ๋๋ Snapshot Chain
์ผ๋ก ์ด๋ฃจ์ด์ง๋ฉฐ, ํ์ฌ Branch ์ ๋ง์ง๋ง ์ปค๋ฐ์ Head
๋ผ ๋ถ๋ฅธ๋ค.
2. Basic Git Commands ๐ฉโ๐ป
1. Create New Branch and Checkout
Git ์์ Branch ๋ ๋จ์ง ํน์ ์ปค๋ฐ์ ๋ํ Reference ์ ๋ถ๊ณผํ๋ค. ์ฆ, ์ ๋ธ๋์น๋ฅผ ๋ง๋๋ ๊ฒ์ด ๋ณต์ ๋ณธ์ ์์ฑํ๋ ๊ฒ์ด ์๋๋ฏ๋ก ์๋๋ ์ฉ๋์ ์๋ฌด๋ฐ ์ํฅ์ ๋ฏธ์น์ง ์๊ณ ๋งค์ฐ ๊ฐ๋ณ๊ฒ ๋์ํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ๋ฐ๋ผ์ ์์ ์ ์ปค๋ค๋ ๋ธ๋์น๋ก ๋ง๋๋ ๊ฒ ๋ณด๋ค ์์ ๋จ์๋ก ์๋ผ ๋ธ๋์น๋ฅผ ์์ฃผ ๋ง๋ค์ด ์์ ๋จ์๋ก ๋ค๋ฃจ๋ ๊ฒ์ด ์ข๋ค.
Syntax
# Create New Branch
git branch "branch_name"
# Move to the Branch
git checkout "branch_name"
Example
bugFix ๋ผ๋ ๋ธ๋์น๋ฅผ ๋ง๋ค์ด๋ณด์.
git branch bugFix
C0(Base) โฌ ๏ธ C1 โฌ ๏ธ C2((main*, HEAD), bugFix)
C2 ์ปค๋ฐ์ ๋ ๋ค๋ฅธ Reference ๊ฐ ์ถ๊ฐ๋์๋ค. ์์ง Current Branch ๋ main ์ ์ ์งํ๊ณ ์๋ค. ์ด์ bugFix ๋ธ๋์น๋ก ์ด๋ํด๋ณด์.
git checkout bugFix
C0(Base) โฌ ๏ธ C1 โฌ ๏ธ C2(main, (bugFix*, HEAD))
๊น ํธ๋ฆฌ๋ ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค. Current Branch ๊ฐ bugFix ๋ก ๋ณ๊ฒฝ๋์์ผ๋ฉฐ, HEAD ๊ฐ bugFix ์ C2 ์ปค๋ฐ์ ๊ฐ๋ฆฌํจ๋ค.
2. Git Merge
Syntax
git merge "branch_name"
๋ค์์ C2 ์ปค๋ฐ์ ๊ธฐ์ค์ผ๋ก main ๋ธ๋์น์ bugFix ๋ธ๋์น๊ฐ ๊ฐ๊ฐ ํ๋์ฉ ์ปค๋ฐ์ ํ ์ํ๋ฅผ ๋ํ๋ธ๋ค.
Current Branch ๋ main ๋ธ๋์น์ ์์นํด ์๋ค. ์ด์ bugFix ๋ธ๋์น๋ฅผ main ๋ธ๋์น์ merge
ํด๋ณด์.
git checkout main
git merge bugFix
3. Git Rebase
Rebase
๋ Merge
์ ๋ฌ๋ฆฌ ํ๋์ ๋ธ๋์น์์ ๊ฐ๋ฐํ ๊ฒ์ฒ๋ผ ์ง๋ญ๊ฐ๋ฒ๋ฆฐ๋ค. ์ 2๋ฒ์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๋์๊ฐ Merge ๋์ Rebase ๋ฅผ ํด๋ณด์.
๋จ, ์ด๋ฒ์๋ ์์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ ๋์ผํ์ง๋ง Current Branch ๊ฐ main ์ด ์๋๋ผ bugFix ๋ผ๋ ๊ฒ์ ์ฃผ๋ชฉํ์.
Syntax
# "branch_from_name" ์ ์๋ตํ๋ฉด ์์์ ์ผ๋ก "current_branch" ๊ฐ "branch_from_name" ๊ฐ ๋๋ค.
# ๋ฐ๋ผ์ "current_branch" ๋ฅผ "branch_to_name" ๋ค์ ์ฐ๊ฒฐํ๋ค.
git rebase "branch_to_name"
# "branch_to_name" ๋ค์ "branch_from_name" ๋ฅผ ์ฐ๊ฒฐํ๋ค.
git rebase "branch_to_name" "branch_from_name"
Example
git checkout bugFix
git reabse main
๋ฌผ๋ก , main ์ชฝ์ผ๋ก Rebase ๋ฅผ ํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
git checkout main
git rebase bugFix
๋ฅผ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก Rebase ๋๋ค.
C0(Base) โฌ ๏ธ C1 โฌ ๏ธ C2 โฌ ๏ธ C3 โฌ ๏ธ C4((main*, HEAD), bugFix)
3. Intermediate Git Commands ๐ฉโ๐ป
1. HEAD
HEAD
๋ ํ์ฌ Checkout ๋ ๋ธ๋์น, ์ฆ, ์์
์ค์ธ ๊น ํธ๋ฆฌ์ ์ต์ ์ปค๋ฐ์ ๊ฐ๋ฆฌํจ๋ค. ๊น ํธ๋ฆฌ์ ๋ณํ๋ฅผ ์ฃผ๋ Git ๋ช
๋ น์ด๋ค์ ๋๋ถ๋ถ HEAD ๋ฅผ
๋ณ๊ฒฝํ๋ ๊ฒ์ผ๋ก ์์ํ๋ค.
HEAD ๋ฅผ ๋ถ๋ฆฌํ๋ค๋ ๊ฒ์ HEAD ๋ฅผ ๋ธ๋์น ๋์ ์ปค๋ฐ์ ๋ถ์ด๋ ๊ฒ์ ์๋ฏธํ๋ค.
Syntax
git checkout "commit_hash"
Example
git checkout C3
2. Relative Reference
์ 4๋ฒ์ด ํน์ ์ปค๋ฐ์ ํด์๋ฅผ ์ง์ Checkout ํด์ HEAD ๋ฅผ ์์ง์๋ค๋ฉด, ๊น ํธ๋ฆฌ ๊ตฌ์กฐ์์ Chain ์ ๋ฐ๋ผ ์ด๋ํ๋๋ก ํ ์ ์๋ค.
Syntax
# ^ ํ ์ปค๋ฐ ์๋ก ์ด๋
git checkout "branch_name"^
# ~n n ์ปค๋ฐ ์๋ก ์ด๋
git checkout "branch_name"~n
- ๋ง์ฝ ๋ถ๋ชจ๊ฐ 2๊ฐ ์ด์์ผ ๊ฒฝ์ฐ
git checkout "branch_name"^1
,git checkout "branch_name"^2
์ ๊ฐ์ด ๊ฐ๊ฐ ์ ๊ทผ ํ ์ ์๋ค.git checkout HEAD~^2~2
์ ๊ฐ์ด ์ฐ์ํด์ ์ฌ์ฉํ ์ ์๋ค.
Example 1
git checkout main^
Example 2
git checkout main~3
branch ์ HEAD ๋ฅผ ๊ฐ์ ๋ก ์ด๋ํ ๋
-f
๋ฅผ ์ด์ฉํด ๋ค์๊ณผ ๊ฐ์ด ํ์ฉํ ์ ์๋ค.git branch -f main HEAD~3 git branch -f main C5
3. Reset and Revert
๊น์์ ์์
์ ๋๋๋ฆฌ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ Reset
๊ณผ Revert
๋ ๊ฐ์ง๊ฐ ์๋ค.
1 ) Reset
Reset ์ ์ ์ด์ ์ปค๋ฐ์ ํ์ง ์์ ๊ฒ์ฒ๋ผ ์์ ์ปค๋ฐ์ผ๋ก ๋ธ๋์น๋ฅผ ์ฎ๊ธด๋ค. ๋ฐ๋ผ์ ํ์ ํ๋ Repository ์ธ ๊ฒฝ์ฐ ์ด๋ฏธ Remote ์ ์ฌ๋ผ๊ฐ ์ปค๋ฐ์ Reset ์ ํ๋ฉด ์ ๋๋ค. ์์ง Remote ์ ์ฌ๋ผ๊ฐ๊ธฐ ์ Local ์ ์กด์ฌํ๋ ์ปค๋ฐ ๋๋ ๊ฐ์ธ Repository ์์๋ง ์ฌ์ฉํด์ผํ๋ค.
Syntax
# ๋๋์๊ฐ๋ ค๋ ์ปค๋ฐ ์ง์ ์ ๋ฐ๋๋ค
git reset "commit_hash"
git reset "branch_name"^
git reset "branch_name"~n
Example
git reset C3
2 ) Revert
Revert ๋ ๊น์ delta
๋ฅผ ์ญ์ผ๋ก ๋๋๋ฆฌ๋ ์ปค๋ฐ์ ์์ฑํ๋ค. ๋ณ๊ฒฝ๋ถ์ ๋๋๋ฆฌ๋ ์ ์ปค๋ฐ์ ์์ฑํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํ์
์์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
Syntax
# ๋๋๋ฆฌ๋ ค๋ ์ปค๋ฐ์ ๋ฐ๋๋ค
git revert "commit_hash"
Example
git revert C5
4. Cherry Pick
Rebase ๊ฐ ์๋ ํ๋์ ๋ธ๋์น์์ ๊ฐ๋ฐํ ๊ฒ์ฒ๋ผ ์ง๋ญ๊ฐ๋ฒ๋ฆฐ๋ค๊ณ ํ๋ค. ๊ทธ๋ฌ๋ฉด ํน์ ์ปค๋ฐ๋ง ๋ฝ์์ Rebase ๋ฅผ ํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
์ด๋ ์ฒด๋ฆฌํผ์ปค์ฒ๋ผ ํน์ ์ปค๋ฐ๋ง ๋ฝ์์์ ์์ ์ ํธ๋ฆฌ ๊ตฌ์กฐ์ ๋ฃ๋ ๋ช
๋ น์ด๊ฐ cherry-pick
์ด๋ค.
Syntax
git cherry-pick "commit_hash1" "commit_hash2"
Example
git checkout main
git cherry-pick C4 C5 C78
5. Interactive Rebase
Cherry Pick ์ ์ํ๋ ์ปค๋ฐ์ ํด์๊ฐ์ ์ ๋ ์ ์ฉํ๋ค. ํ์ง๋ง ์ํ๋ ์ปค๋ฐ์ ๋ช ํํ ๋ชจ๋ฅผ ๋๋ Interactive Rebase ๋ฅผ ์ฌ์ฉํด Rebase ํ ์ปค๋ฐ์ ๊ฒํ ํ๋ ๊ณผ์ ์ ์ถ๊ฐํ ์ ์๋ค.
Syntax
git rebase -i "branch_name"
-i
์ต์ ์ ์ถ๊ฐํ๋ฉด Rebase ์ฒ๋ฆฌ ์ vim ๊ณผ ๊ฐ์ ํ ์คํธ ํธ์ง๊ธฐ๋ฅผ ์ด์ด ๊ฐ ์ปค๋ฐ์ ๊ตฌ๋ถํ ์ ์๋ ํด์์ ๋ฉ์์ง๋ฅผ ๋ณด์ฌ์ค๋ค.
์ด๋ ์ฒ๋ฆฌ ๊ฐ๋ฅํ ๋ช ๋ น์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ปค๋ฐ๋ค์ ์์ ๋ณ๊ฒฝ.
- ์ํ๋ ์ปค๋ฐ๋ง ์ ํ
pick
์ ์ด์ฉ.- ์ปค๋ฐ๋ค์
squash
์ฒ๋ฆฌ.
Example 1
C0(Base) โฌ ๏ธ C1 โฌ ๏ธ C2 โฌ ๏ธ C3 โฌ ๏ธ C4 โฌ ๏ธ C5(main*)
git rebase -i HEAD~4
์ด๋ ์ปค๋ฐ์ C2, C4, C5 ๋ง pick ํ๊ณ ์์๋ฅผ C4 โฌ ๏ธ C5 โฌ ๏ธ C2 ๋ก ๋ณ๊ฒฝํ๋ค๋ฉด ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
Example 2
์ด๋ฒ์๋ ๋ฒ๋ฆฌ๋ ์ปค๋ฐ ์์ด ๋ชจ๋ pick ํ๊ณ ๋์ C3~C5 ๋ฅผ squash ์ฒ๋ฆฌํ๋ค๋ฉด ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
4. Use Cases ๐ฉโ๐ป
1. Change Old Commit - Interactive Rebase
- ์ฃผ์ด์ง ์กฐ๊ฑด
โnewImageโ ์ โcaptionโ ๋ธ๋์น์ ๊ฐ๊ฐ์ ๋ณ๊ฒฝ ๋ด์ญ์ด ์๊ณ , ์๋ก ์ฝ๊ฐ์ ๊ด๋ จ์ด ์์ด ์ ์ฅ์์ฒด ์ฐจ๋ก๋ก ์์ฌ ์๋ ์ํฉ
C0(Base) โฌ ๏ธ C1(main) โฌ ๏ธ C2(newImage) โฌ ๏ธ C3(caption*)
- ๋ณ๊ฒฝํ ๋์
๊น ํธ๋ฆฌ์ ์์ชฝ์ ์๋ ์ปค๋ฐ ๋ด์ฉ์ ์ผ๋ถ๋ฅผ ์ด์ง ๋ฐ๊ฟ ๋ฌ๋ผ๋ ์์ฒญ์ด ๋ค์ด์๋ค(i.e. newImage ์ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํด์ฃผ์ธ์).
- ํด๊ฒฐ ๋ฐฉ๋ฒ
git rebase -i
๋ช ๋ น์ผ๋ก ๋ฐ๊พธ๋ ค๋ ์ปค๋ฐ์ ๊ฐ์ฅ ์ต๊ทผ ์์๋ก ๋ณ๊ฒฝํ๋ค.git commit --amend
๋ช ๋ น์ผ๋ก ์ปค๋ฐ ๋ด์ฉ์ ์ ์ ํ๋ค.git rebase -i
๋ช ๋ น์ผ๋ก ์๋ ์์๋ก ๋๋๋ฆฐ๋ค.- main ์ ์์์ ์์ ์ ์๋ฃํ ํธ๋ฆฌ๋ก ์ด๋ํ๋ค.
1 ) ์์ ๋ณ๊ฒฝ
git rebase -i C1
์ด ๋ C2 ์ C3 ์ ์์๋ฅผ ๋ณ๊ฒฝํ๋ค.
2 ) ์ปค๋ฐ ์ ์
git commit --amend
3 ) ์์ ์๋๋๋ก ์ฌ๋ณ๊ฒฝ
git rebase -i C1
4 ) ๊น ํธ๋ฆฌ main ์ ์์ ํ ๋ธ๋์น๋ก ์ด๋
git branch -f main caption
2. Change Old Commit - Cherry Pick
์ด๋ฒ์๋ ์์ ๋์ผํ ๋ฌธ์ ๋ฅผ Cherry Pick ์ ์ด์ฉํด ํด๊ฒฐํด๋ณด์.?
- ํด๊ฒฐ ๋ฐฉ๋ฒ
git checkout
๋ช ๋ น์ผ๋ก ๋ณ๊ฒฝํ๋ ค๋ ์ปค๋ฐ๋ณด๋ค ์ด์ ์ปค๋ฐ์ผ๋ก ์ด๋ํ๋ค.(Cherry Pick ํ๋ ค๋ ์ปค๋ฐ์ด ํ์ฌ ๋ธ๋์น์ ์กด์ฌํด์๋ ์ ๋๋ค)
git cherry-pick
๋ช ๋ น์ผ๋ก ๋ณ๊ฒฝํ๋ ค๋ ์ปค๋ฐ๋ง Cherry Pick ํ๋ค.git commit --amend
๋ช ๋ น์ผ๋ก ์ปค๋ฐ ๋ด์ฉ์ ์ ์ ํ๋ค.git cherry-pick
๋ช ๋ น์ผ๋ก ๋๋จธ์ง ์ปค๋ฐ์ Cherry Pick ํ๋ค.(ํ์ฌ HEAD ๊ฐ main ์ด๋ฏ๋ก ์ด๋๋ก ์๋ฃ๋๋ค)
1 ) ๋ณ๊ฒฝํ๋ ค๋ ์ปค๋ฐ ์ด์ ์ปค๋ฐ์ผ๋ก ์ด๋
git checkout main;
C0(Base) โฌ ๏ธ C1(main*) โฌ ๏ธ C2(newImage) โฌ ๏ธ C3(caption)
2 ) ๋ณ๊ฒฝํ๋ ค๋ ์ปค๋ฐ Cherry Pick
git cherry-pick C2
3 ) ์ปค๋ฐ ์ ์
git commit --amend
4 ) ๋๋จธ์ง ์ปค๋ฐ Cherry Pick
git cherry-pick C3
3. Tag
๊น์ Tag
๋ ํน์ ์ปค๋ฐ๋ค์ ๋ธ๋์น๋ก ์ฐธ์กฐํ๋ฏ์ด ์๊ตฌ์ ์ธ Milestone
์ผ๋ก ํ์ํ๊ธฐ ์ํด ์กด์ฌํ๋ค.
Syntax
# Commit Hashcode ๋ฅผ ์๋ตํ๋ฉด HEAD ์ Tag ๋ฅผ ๋ถ์ธ๋ค.
git tag "tag_name"
# ํน์ Commit Hashcode ์ Tag ๋ฅผ ๋ถ์ธ๋ค.
git tag "tag_name" "commit_hash"
Example
๋ค์๊ณผ ๊ฐ์ ๊น ํธ๋ฆฌ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
git tag v0 C1
์ด๋ฒ์๋ HEAD ๋ฅผ ์ด๋์ํค๊ณ ํน์ Commit Hashcode ๋์ HEAD ์ ๋ฐ๋ก Tag ๋ฅผ ๋ถ์ฌ๋ณด์.
git checkout C2
git tag v1
4. Describe
๊น์๋ ํ์ฌ ๊น ํธ๋ฆฌ๋ฅผ ์๋์ผ๋ก ์์ฝํด ์ค๋ช
ํ๋๋ก ๋ช
๋ นํ ์ ์๋ Describe
๋ผ๋ ๋ช
๋ น์ด๊ฐ ์๋ค. ์ด๋ ์ด์ ํ ์ญํ ์ ํด์ฃผ๋ ๊ฒ ์ค ํ๋๊ฐ Tag
๋ค.
Syntax
git describe <ref>
<ref>
์๋ ์ปค๋ฐ์ ์๋ฏธํ๋ ์ด๋ค ๊ฒ์ด๋ ์ฌ์ฉํ ์ ์๋ค. ๋ง์ฝ ํน์ ์ง์ด์ฃผ์ง ์์ ๊ฒฝ์ฐ ํ์ฌ HEAD ๋ฅผ ์ฌ์ฉํ๋ค.์ถ๋ ฅ๋๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋ค์๊ณผ ๊ฐ๋ค [Milestone][Commit ๊ฐ์][Describe ๋์]
- Milestone: Base or Tag
- Commit ๊ฐ์: Milestone ๊ณผ Describe ๋์ ์ฌ์ด์ ์ปค๋ฐ ๊ฐ์
- Describe ๋์: HEAD or ํน์ ์ปค๋ฐ
Example
๋ค์๊ณผ ๊ฐ์ ๊น ํธ๋ฆฌ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
git describe main # v0_2_gC2
git describe C2 # v0_2_gC2
git describe C3 # v1
git describe v1 # v1
Tag
๊ฐ ์ ์ด์ ํ๋ฅผ ๋ง๋ค์ดTag
๋ถํฐ ์์๋๋ค.
git describe C5 # v1_1_gC5
git describe C6 # v1_2_gC6
git describe bugFix # v1_2_gC6
git describe # v1_2_gC6
5. Git Remote ๐ฉโ๐ป
Syntax
"remote_name"/"branch_name"
์ผ๋ฐ์ ์ผ๋ก origin/main
์ผ๋ก ์ง๋๋ค.
6. Git Origin ๐ฉโ๐ป
1. Fetch and Pull
Pull
๋ช
๋ น์ Fetch
๋ช
๋ น๊ณผ Merge
๋ช
๋ น์ ํฉ์น ๊ฒ๊ณผ ๊ฐ๋ค.
git fetch; git merge o/main
git pull
Pull
๋ช
๋ น์ Fetch
๋ช
๋ น๊ณผ Rebase
๋ช
๋ น์ ํฉ์น ํจ๊ณผ๋ฅผ ๋ด๋ ค๋ฉด option ์ผ๋ก --rebase
๋ฅผ ์ค์ ํ๋ค.
git fetch; git rebase o/main
git pull --rebase
2. Control Tracking Branch - Checkout
Syntax
git checkout -b "branch_name" "tracking_branch_name"
branch_name
์ผ๋ก ๋ธ๋์น๋ฅผ ์์ฑํ๋ค.- ์ด ๋ธ๋์น๊ฐ
tracking_branch_name
๋ฅผ ์ถ์ ํ๋๋ก ์ค์ ํ๋ค.
Example
git checkout -b foo origin/main
git pull
C0(Base) โฌ ๏ธ C1(main) โฌ ๏ธ C2(foo*, origin/main)
main ์ด ์๋ foo
๊ฐ origin/main
์ ์ถ์ ํ๋ค.
git commit -m "commit_message"
git push
C0(Base) โฌ ๏ธ C1(main) โฌ ๏ธ C2 โฌ ๏ธ C3(foo*, origin/main)
๋ง์ฐฌ๊ฐ์ง๋ก Push ์ญ์ foo
๊ฐ origin/main
๊ณผ ์ฐ๊ฒฐ๋๋ค.
3. Control Tracking Branch - Branch
์์์ Checkout ์ ์ด์ฉํด Branch ์ Remote ํธ๋ํน์ ์ฐ๊ฒฐํ๋ค๋ฉด ์ด๋ฒ์๋ Branch ๋ช ๋ น์ ์ด์ฉํด ์ถ์ ํ๋๋ก ํด๋ณด์.
Syntax
# "local_branch_name" ์ ์๋ตํ๋ฉด ์์์ ์ผ๋ก "current_branch" ๊ฐ "local_branch_name" ์ด ๋๋ค.
git branch -u "origin_branch_name"
git branch -u "origin_branch_name" "local_branch_name"
Example
git branch -u origin/main foo
์์์ ์ค๋ช ํ๋ฏ์ด ํ์ฌ ์์ ์ค์ธ ๋ธ๋์น๊ฐ foo ์ผ ๊ฒฝ์ฐ ์๋ตํ ์ ์๋ค.
git branch -u origin/main
5. Push
Syntax
# Remote ์ฐ๊ฒฐ์ด ๋์ด ์๋ค๋ฉด ๋จ์ง git push ๋ง ์
๋ ฅํด๋ ๋๋ค.
git push
git push "remote_name" "branch_name"
Example
๋ค์๊ณผ ๊ฐ์ ๊น ํธ๋ฆฌ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
C0(HEAD) โฌ ๏ธ C1(origin/main, origin/foo) โฌ ๏ธ C2(main) ย โ๏ธ C3(foo)
git push origin main
C1 ์ (origin/main) ์ ๋ณด๊ณ ์ด ๋ ์์ Push ํ๋ ๊ฒ์ผ๋ก ํผ๋ํ์ง ๋ง์. ํ์ฌ Remote ๊ฐ ๋ค์ ์ํ์์ ๋ํ๋ด๋ ๊ฒ์ด๋ค.
- Remote ์ ๊น ์ํ
C0 โฌ ๏ธ C1(main, foo)
git push origin main
๋ช
๋ น์ ํ์ฌ C2(main)
์ Remote ์ด๋ฆ์ด origin
์ธ ๊ณณ์ Push ๋ฅผ ํ๊ฒ ๋ค๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ๋ก์ปฌ์ main
๊ณผ foo
๋ฅผ ๋ชจ๋ origin
์ Push ๋ฅผ ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
6. Push - Destination
Syntax
git push "remote_name" "local_source":"remote_destination"
ํน์ ์ปค๋ฐ์ผ๋ก Checkout ํ์ง ์๊ณ ๋ Push ๋ฅผ ํ ์ ์๋ค. Source ๋ ํน์ ์ปค๋ฐ์ด ๋ ์๋ ์๊ณ , ๋ธ๋์น๊ฐ ๋ ์๋ ์๋ค.
๋ก์ปฌ์ A ๋ฅผ Remote ์ B ๋ก Push ํ๋ค๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค.
Example
๋ค์๊ณผ ๊ฐ์ ๊น ํธ๋ฆฌ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
๋ค์๊ณผ ๊ฐ์ด ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด๋ณด์.
git push origin foo^:main
๊ทธ๋ฌ๋ฉด foo
๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ชจ ์ปค๋ฐ(C2) ๊ฐ origin/main ์ Push ๋ ๊ฒ์ด๋ค.
๋ง์ฝ Remote ์ Destination ์ด ์กด์ฌํ์ง ์๋๋ค๋ฉด ์ ๋ธ๋์น๋ฅผ ์์ฑํ๋ค.
git push origin main:bar
๋ง์ฝ Local Source ๋ฅผ ๋น์๋๋ฉด Remote Destination ์ ์ ๊ฑฐํ๋ค
git push origin :bar
์๊ฐํด๋ณด๋ฉด ์ฝ๋ค. ์๋ฌด ๊ฒ๋ ์๋ ๊ฒ์ ๋ชฉ์ ์ง์ Push ํ๊ฒ ๋ค๋ ๊ฒ์ด๋๊น. ๋ฐ๋ผ์, ์ค์๋ก ์ญ์ ํ์ง ์๋๋ก ์ฃผ์ํด์ผํ๋ค.
7. Fetch - Destination
Syntax
git fetch "remote_name" "remote_source":"local_destination"
๋งํฌ
Push - Destination ์ ๊ฐ๋
์ ๋์ผํ๋ค. ๋จ์ง ์์๊ฐ Remote ์์ ๋ก์ปฌ ๋ฐฉํฅ์ผ๋ก ๋ฐ๋๊ฐ ๋ ๋ฟ์ด๋ค.
์ฆ, Remote ์ A ๋ฅผ ๋ก์ปฌ์ B ๋ก Fetch ํ๋ค๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค.
Example
๋ค์๊ณผ ๊ฐ์ ๊น ํธ๋ฆฌ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
๋ค์๊ณผ ๊ฐ์ด ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด๋ณด์.
git fetch origin foo~1:bar
๊ทธ๋ฌ๋ฉด Remote ์ foo
๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ชจ ์ปค๋ฐ C2 ๊ฐ bar ๋ก Fetch ๋ ๊ฒ์ด๋ค.
๋ง์ฝ Local Destination ์ ๋น์๋๋ฉด ํ์ฌ ์์นํ HEAD ์ ์ ๋ธ๋์น๋ฅผ ์์ฑํ๋ค
์ผ๋ฐ์ ์ธ ๋์์ ์๋๋ค. ๋ธ๋์น๋ฅผ ๋ค๋ฃจ๋ ๋ช ๋ น์ด ๋ณ๋๋ก ์กด์ฌํ๋๊นโฆ ๋จ์ง ๊น์ Fetch ๊ฐ ์ด๋ค์์ผ๋ก ๋์ํ๋์ง ์์๋ง ๋๊ณ ์ฌ์ฉํ ์ผ์ ์๋ค.
Reference
- โLearn Git Branching.โ Learn Git Branching. accessed Apr. 21, 2023, Learn Git Branching.