1. Git Concept ๐Ÿ‘ฉโ€๐Ÿ’ป

Git ์€ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์ถ”์  ๊ธฐ๋กํ•˜๋Š” ์ฆ๋ถ„ ๋ฐฑ์—…(Snapshots)์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ ์ด์ „ ๋ฒ„์ „๊ณผ ๋‹ค์Œ ๋ฒ„์ „์˜ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ delta๋ผ๊ณ  ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ Git Repository ๋ฅผ Clone ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ด ๋ชจ๋“  delta๋ฅผ ํ’€์–ด๋‚ธ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

C0 ๋ผ๋Š” ์ตœ์ดˆ์˜ Base-commit ์ด ์กด์žฌํ•˜๊ณ  ์—ฌ๊ธฐ์— 2๋ฒˆ์˜ ์ปค๋ฐ‹ ์„ ํ–ˆ๋‹ค๊ณ  ํ•ด๋ณด์ž.

Git Concept

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 ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ๊ฐ ํ•˜๋‚˜์”ฉ ์ปค๋ฐ‹์„ ํ•œ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

Git Merge 1

Current Branch ๋Š” main ๋ธŒ๋žœ์น˜์— ์œ„์น˜ํ•ด ์žˆ๋‹ค. ์ด์ œ bugFix ๋ธŒ๋žœ์น˜๋ฅผ main ๋ธŒ๋žœ์น˜์— mergeํ•ด๋ณด์ž.

git checkout main
git merge bugFix

Git Merge 2

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 Rebase 1

git checkout bugFix
git reabse main

Git Rebase 2


๋ฌผ๋ก , 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 HEAD 1

git checkout C3

Git HEAD 2

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 Relative Reference 1

git checkout main^

Git Relative Reference 2


Example 2

Git Relative Reference 3

git checkout main~3

Git Relative Reference 4

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 1

git reset C3

Git Reset 2


2 ) Revert

Revert ๋Š” ๊นƒ์˜ delta๋ฅผ ์—ญ์œผ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ์ปค๋ฐ‹์„ ์ƒ์„ฑํ•œ๋‹ค. ๋ณ€๊ฒฝ๋ถ„์„ ๋˜๋Œ๋ฆฌ๋Š” ์ƒˆ ์ปค๋ฐ‹์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜‘์—…์‹œ์—๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Syntax

# ๋˜๋Œ๋ฆฌ๋ ค๋Š” ์ปค๋ฐ‹์„ ๋ฐ›๋Š”๋‹ค
git revert "commit_hash"


Example

Git Revert 1

git revert C5

Git Revert 2

4. Cherry Pick

Rebase ๊ฐ€ ์›๋ž˜ ํ•˜๋‚˜์˜ ๋ธŒ๋žœ์น˜์—์„œ ๊ฐœ๋ฐœํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ง“๋ญ‰๊ฐœ๋ฒ„๋ฆฐ๋‹ค๊ณ  ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํŠน์ • ์ปค๋ฐ‹๋งŒ ๋ฝ‘์•„์„œ Rebase ๋ฅผ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ์ด๋•Œ ์ฒด๋ฆฌํ”ผ์ปค์ฒ˜๋Ÿผ ํŠน์ • ์ปค๋ฐ‹๋งŒ ๋ฝ‘์•„์™€์„œ ์ž์‹ ์˜ ํŠธ๋ฆฌ ๊ตฌ์กฐ์— ๋„ฃ๋Š” ๋ช…๋ น์–ด๊ฐ€ cherry-pick์ด๋‹ค.

Syntax

git cherry-pick "commit_hash1" "commit_hash2"


Example

Cherry Pick 1

git checkout main
git cherry-pick C4 C5 C78

Cherry Pick 2

5. Interactive Rebase

Cherry Pick ์€ ์›ํ•˜๋Š” ์ปค๋ฐ‹์˜ ํ•ด์‹œ๊ฐ’์„ ์•Œ ๋•Œ ์œ ์šฉํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์›ํ•˜๋Š” ์ปค๋ฐ‹์„ ๋ช…ํ™•ํžˆ ๋ชจ๋ฅผ ๋•Œ๋Š” Interactive Rebase ๋ฅผ ์‚ฌ์šฉํ•ด Rebase ํ•  ์ปค๋ฐ‹์„ ๊ฒ€ํ† ํ•˜๋Š” ๊ณผ์ •์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

Syntax

git rebase -i "branch_name"

-i ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด Rebase ์ฒ˜๋ฆฌ ์ „ vim ๊ณผ ๊ฐ™์€ ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ๋ฅผ ์—ด์–ด ๊ฐ ์ปค๋ฐ‹์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ํ•ด์‹œ์™€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
์ด๋•Œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•œ ๋ช…๋ น์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์ปค๋ฐ‹๋“ค์˜ ์ˆœ์„œ ๋ณ€๊ฒฝ.
  2. ์›ํ•˜๋Š” ์ปค๋ฐ‹๋งŒ ์„ ํƒ pick์„ ์ด์šฉ.
  3. ์ปค๋ฐ‹๋“ค์„ squash ์ฒ˜๋ฆฌ.


Example 1

C0(Base) โฌ…๏ธ C1 โฌ…๏ธ C2 โฌ…๏ธ C3 โฌ…๏ธ C4 โฌ…๏ธ C5(main*)

git rebase -i HEAD~4

์ด๋•Œ ์ปค๋ฐ‹์„ C2, C4, C5 ๋งŒ pick ํ•˜๊ณ  ์ˆœ์„œ๋ฅผ C4 โฌ…๏ธ C5 โฌ…๏ธ C2 ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค๋ฉด ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Interactive Rebase 1


Example 2

์ด๋ฒˆ์—๋Š” ๋ฒ„๋ฆฌ๋Š” ์ปค๋ฐ‹ ์—†์ด ๋ชจ๋‘ pick ํ•˜๊ณ  ๋Œ€์‹  C3~C5 ๋ฅผ squash ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Interactive Rebase 2


4. Use Cases ๐Ÿ‘ฉโ€๐Ÿ’ป

1. Change Old Commit - Interactive Rebase

  • ์ฃผ์–ด์ง„ ์กฐ๊ฑด

โ€˜newImageโ€™ ์™€ โ€˜captionโ€™ ๋ธŒ๋žœ์น˜์— ๊ฐ๊ฐ์˜ ๋ณ€๊ฒฝ ๋‚ด์—ญ์ด ์žˆ๊ณ , ์„œ๋กœ ์•ฝ๊ฐ„์˜ ๊ด€๋ จ์ด ์žˆ์–ด ์ €์žฅ์†Œ์ฒด ์ฐจ๋ก€๋กœ ์Œ“์—ฌ ์žˆ๋Š” ์ƒํ™ฉ

C0(Base) โฌ…๏ธ C1(main) โฌ…๏ธ C2(newImage) โฌ…๏ธ C3(caption*)

  • ๋ณ€๊ฒฝํ•  ๋Œ€์ƒ

๊นƒ ํŠธ๋ฆฌ์˜ ์•ž์ชฝ์— ์žˆ๋Š” ์ปค๋ฐ‹ ๋‚ด์šฉ์˜ ์ผ๋ถ€๋ฅผ ์‚ด์ง ๋ฐ”๊ฟ” ๋‹ฌ๋ผ๋Š” ์š”์ฒญ์ด ๋“ค์–ด์™”๋‹ค(i.e. newImage ์˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ์„ธ์š”).

  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
  1. git rebase -i ๋ช…๋ น์œผ๋กœ ๋ฐ”๊พธ๋ ค๋Š” ์ปค๋ฐ‹์„ ๊ฐ€์žฅ ์ตœ๊ทผ ์ˆœ์„œ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
  2. git commit --amend ๋ช…๋ น์œผ๋กœ ์ปค๋ฐ‹ ๋‚ด์šฉ์„ ์ •์ •ํ•œ๋‹ค.
  3. git rebase -i ๋ช…๋ น์œผ๋กœ ์›๋ž˜ ์ˆœ์„œ๋กœ ๋˜๋Œ๋ฆฐ๋‹ค.
  4. main ์„ ์œ„์—์„œ ์ˆ˜์ •์„ ์™„๋ฃŒํ•œ ํŠธ๋ฆฌ๋กœ ์ด๋™ํ•œ๋‹ค.

1 ) ์ˆœ์„œ ๋ณ€๊ฒฝ

git rebase -i C1

์ด ๋•Œ C2 ์™€ C3 ์˜ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.

Use Cases 1


2 ) ์ปค๋ฐ‹ ์ •์ •

git commit --amend

Use Cases 2


3 ) ์ˆœ์„œ ์›๋ž˜๋Œ€๋กœ ์žฌ๋ณ€๊ฒฝ

git rebase -i C1

Use Cases 3


4 ) ๊นƒ ํŠธ๋ฆฌ main ์„ ์ˆ˜์ •ํ•œ ๋ธŒ๋žœ์น˜๋กœ ์ด๋™

git branch -f main caption

Use Cases 4

2. Change Old Commit - Cherry Pick

์ด๋ฒˆ์—๋Š” ์œ„์™€ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ Cherry Pick ์„ ์ด์šฉํ•ด ํ•ด๊ฒฐํ•ด๋ณด์ž.?

  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
  1. git checkout ๋ช…๋ น์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ์ปค๋ฐ‹๋ณด๋‹ค ์ด์ „ ์ปค๋ฐ‹์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

    (Cherry Pick ํ•˜๋ ค๋Š” ์ปค๋ฐ‹์ด ํ˜„์žฌ ๋ธŒ๋žœ์น˜์— ์กด์žฌํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค)

  2. git cherry-pick ๋ช…๋ น์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๋Š” ์ปค๋ฐ‹๋งŒ Cherry Pick ํ•œ๋‹ค.
  3. git commit --amend ๋ช…๋ น์œผ๋กœ ์ปค๋ฐ‹ ๋‚ด์šฉ์„ ์ •์ •ํ•œ๋‹ค.
  4. 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

Use Cases 5


3 ) ์ปค๋ฐ‹ ์ •์ •

git commit --amend

Use Cases 6


4 ) ๋‚˜๋จธ์ง€ ์ปค๋ฐ‹ Cherry Pick

git cherry-pick C3

Use Cases 7

3. Tag

๊นƒ์˜ Tag๋Š” ํŠน์ • ์ปค๋ฐ‹๋“ค์„ ๋ธŒ๋žœ์น˜๋กœ ์ฐธ์กฐํ•˜๋“ฏ์ด ์˜๊ตฌ์ ์ธ Milestone์œผ๋กœ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•œ๋‹ค.

Syntax

# Commit Hashcode ๋ฅผ ์ƒ๋žตํ•˜๋ฉด HEAD ์— Tag ๋ฅผ ๋ถ™์ธ๋‹ค.
git tag "tag_name"
# ํŠน์ • Commit Hashcode ์— Tag ๋ฅผ ๋ถ™์ธ๋‹ค.
git tag "tag_name" "commit_hash"


Example

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊นƒ ํŠธ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

Use Cases 8

git tag v0 C1

Use Cases 9


์ด๋ฒˆ์—๋Š” HEAD ๋ฅผ ์ด๋™์‹œํ‚ค๊ณ  ํŠน์ • Commit Hashcode ๋Œ€์‹  HEAD ์— ๋ฐ”๋กœ Tag ๋ฅผ ๋ถ™์—ฌ๋ณด์ž.

git checkout C2
git tag v1

Use Cases 10

4. Describe

๊นƒ์—๋Š” ํ˜„์žฌ ๊นƒ ํŠธ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ์š”์•ฝํ•ด ์„ค๋ช…ํ•˜๋„๋ก ๋ช…๋ นํ•  ์ˆ˜ ์žˆ๋Š” Describe๋ผ๋Š” ๋ช…๋ น์–ด๊ฐ€ ์žˆ๋‹ค. ์ด๋•Œ ์ด์ •ํ‘œ ์—ญํ• ์„ ํ•ด์ฃผ๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๊ฐ€ Tag๋‹ค.

Syntax

git describe <ref>

<ref>์—๋Š” ์ปค๋ฐ‹์„ ์˜๋ฏธํ•˜๋Š” ์–ด๋–ค ๊ฒƒ์ด๋“  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ํŠน์ •์ง€์–ด์ฃผ์ง€ ์•Š์„ ๊ฒฝ์šฐ ํ˜„์žฌ HEAD ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ถœ๋ ฅ๋˜๋Š” ๊ฒฐ๊ณผ๋ฌผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค [Milestone][Commit ๊ฐœ์ˆ˜][Describe ๋Œ€์ƒ]

  • Milestone: Base or Tag
  • Commit ๊ฐœ์ˆ˜: Milestone ๊ณผ Describe ๋Œ€์ƒ ์‚ฌ์ด์˜ ์ปค๋ฐ‹ ๊ฐœ์ˆ˜
  • Describe ๋Œ€์ƒ: HEAD or ํŠน์ • ์ปค๋ฐ‹


Example

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊นƒ ํŠธ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

Use Cases 11

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

Control Tracking Branch 1

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

Control Tracking Branch 2

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

Control Tracking Branch 2

5. Push

Syntax

# Remote ์—ฐ๊ฒฐ์ด ๋˜์–ด ์žˆ๋‹ค๋ฉด ๋‹จ์ง€ git push ๋งŒ ์ž…๋ ฅํ•ด๋„ ๋œ๋‹ค.
git push
git push "remote_name" "branch_name"


Example

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊นƒ ํŠธ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

Push 1

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 ๋ฅผ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Push 2

6. Push - Destination

Syntax

git push "remote_name" "local_source":"remote_destination"

ํŠน์ • ์ปค๋ฐ‹์œผ๋กœ Checkout ํ•˜์ง€ ์•Š๊ณ ๋„ Push ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. Source ๋Š” ํŠน์ • ์ปค๋ฐ‹์ด ๋  ์ˆ˜๋„ ์žˆ๊ณ , ๋ธŒ๋žœ์น˜๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค.
๋กœ์ปฌ์˜ A ๋ฅผ Remote ์˜ B ๋กœ Push ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค.


Example

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊นƒ ํŠธ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

Push Destination 1

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด๋ณด์ž.

git push origin foo^:main

๊ทธ๋Ÿฌ๋ฉด foo๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ถ€๋ชจ ์ปค๋ฐ‹(C2) ๊ฐ€ origin/main ์— Push ๋  ๊ฒƒ์ด๋‹ค.

Push Destination 2


๋งŒ์•ฝ 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

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊นƒ ํŠธ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

Fetch Destination 1

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด๋ณด์ž.

git fetch origin foo~1:bar

๊ทธ๋Ÿฌ๋ฉด Remote ์˜ foo๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ถ€๋ชจ ์ปค๋ฐ‹ C2 ๊ฐ€ bar ๋กœ Fetch ๋  ๊ฒƒ์ด๋‹ค.

Fetch Destination 2


๋งŒ์•ฝ Local Destination ์„ ๋น„์›Œ๋‘๋ฉด ํ˜„์žฌ ์œ„์น˜ํ•œ HEAD ์— ์ƒˆ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•œ๋‹ค

์ผ๋ฐ˜์ ์ธ ๋™์ž‘์€ ์•„๋‹ˆ๋‹ค. ๋ธŒ๋žœ์น˜๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ช…๋ น์ด ๋ณ„๋„๋กœ ์กด์žฌํ•˜๋‹ˆ๊นŒโ€ฆ ๋‹จ์ง€ ๊นƒ์˜ Fetch ๊ฐ€ ์–ด๋–ค์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์•Œ์•„๋งŒ ๋‘๊ณ  ์‚ฌ์šฉํ•  ์ผ์€ ์—†๋‹ค.




Reference

  1. โ€œLearn Git Branching.โ€ Learn Git Branching. accessed Apr. 21, 2023, Learn Git Branching.