{"id":33,"date":"2025-07-16T13:44:55","date_gmt":"2025-07-16T04:44:55","guid":{"rendered":"https:\/\/34.64.61.65\/?p=33"},"modified":"2025-07-16T14:32:59","modified_gmt":"2025-07-16T05:32:59","slug":"git%ea%b3%bc_github_%ed%98%91%ec%97%85_%ec%8b%a4%ec%a0%84_%ed%8c%81","status":"publish","type":"post","link":"https:\/\/hed-g.me\/?p=33","title":{"rendered":"Git\uacfc GitHub \ud611\uc5c5 \uc2e4\uc804 \ud301: \uac1c\ubc1c\ud300\uc5d0\uc11c \uc0b4\uc544\ub0a8\ub294 \ubc84\uc804 \uad00\ub9ac \uc644\uc804 \uac00\uc774\ub4dc"},"content":{"rendered":"\n<p>\uc548\ub155\ud558\uc138\uc694, \uc131\uc7a5\ud558\ub294 \uac1c\ubc1c\uc790 \uc5ec\ub7ec\ubd84!<\/p>\n\n\n\n<p>&#8220;\uac1c\ubc1c\uc740 \ud63c\uc790 \ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub2e4&#8221; \ud83e\udd1d<\/p>\n\n\n\n<p>\ucc98\uc74c \ud68c\uc0ac\uc5d0 \uc785\uc0ac\ud588\uc744 \ub54c, \uc800\ub294 Git\uc744 \ub2e8\uc21c\ud788 &#8220;\ucf54\ub4dc \ubc31\uc5c5 \ub3c4\uad6c&#8221; \uc815\ub3c4\ub85c\ub9cc \uc0dd\uac01\ud588\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc2e4\uc81c \ud300 \ud504\ub85c\uc81d\ud2b8\uc5d0 \ucc38\uc5ec\ud558\uba74\uc11c \uae68\ub2ec\uc558\uc8e0. Git\uacfc GitHub\ub294 \ub2e8\uc21c\ud55c \ub3c4\uad6c\uac00 \uc544\ub2c8\ub77c <strong>\ud300\uc6cc\ud06c\uc758 \ud575\uc2ec<\/strong>\uc774\ub77c\ub294 \uac83\uc744!<\/p>\n\n\n\n<p>\uc624\ub298\uc740 \uc81c\uac00 \uc2e4\ubb34\uc5d0\uc11c \uacaa\uc740 \ub2e4\uc591\ud55c \uc0c1\ud669\ub4e4\uc744 \ud1b5\ud574 \ubc30\uc6b4 <strong>Git\uacfc GitHub \ud611\uc5c5\uc758 \ubaa8\ub4e0 \uac83<\/strong>\uc744 \uc815\ub9ac\ud574 \ub4dc\ub9ac\uaca0\uc2b5\ub2c8\ub2e4. \ub354 \uc774\uc0c1 &#8220;merge conflict\uac00 \ubb34\uc11c\uc6cc\uc11c push\ub97c \ubabb\ud558\uaca0\uc5b4\uc694&#8221; \ub77c\ub294 \ub9d0\uc740 \ud558\uc9c0 \ub9c8\uc138\uc694! \ud83d\ude05<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Git\uc758 \uc9c4\uc9dc \uc874\uc7ac \uc774\uc720: \ud63c\uc790\uac00 \uc544\ub2cc \ud568\uaed8<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uc65c Git\uc744 \ubc30\uc6cc\uc57c \ud560\uae4c?<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \uac1c\ubc1c\uc790\uc758 \ud558\ub8e8 \uc77c\uacfc\n09:00 - \uc5b4\uc81c \uc791\uc5c5\ud55c \ucf54\ub4dc \ud655\uc778\n09:30 - \ub3d9\ub8cc\uac00 \uc218\uc815\ud55c \ucf54\ub4dc\uc640 \ud569\uce58\uae30\n10:00 - \uc0c8\ub85c\uc6b4 \uae30\ub2a5 \uac1c\ubc1c \uc2dc\uc791\n12:00 - \uc810\uc2ec \uc804 \uc784\uc2dc \uc800\uc7a5\n14:00 - \ubc84\uadf8 \ubc1c\uacac! \uc774\uc804 \ubc84\uc804\uc73c\ub85c \ub418\ub3cc\ub9ac\uae30\n16:00 - \ud300\uc6d0\uacfc \ucf54\ub4dc \ub9ac\ubdf0\ud558\uae30\n18:00 - \ucd5c\uc885 \ubc84\uc804 \ubc30\ud3ec \uc900\ube44\n\n# \uc774 \ubaa8\ub4e0 \uacfc\uc815\uc5d0\uc11c Git\uc774 \ud544\uc694\ud569\ub2c8\ub2e4!<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Git vs \ub2e4\ub978 \ubc31\uc5c5 \ubc29\ubc95\ub4e4<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \ud83d\ude31 \ub054\ucc0d\ud55c \uacfc\uac70\uc758 \ubc29\ubc95\ub4e4\n\ud504\ub85c\uc81d\ud2b8_\ucd5c\uc885.zip\n\ud504\ub85c\uc81d\ud2b8_\ucd5c\uc885_\uc9c4\uc9dc\ucd5c\uc885.zip\n\ud504\ub85c\uc81d\ud2b8_\ucd5c\uc885_\uc9c4\uc9dc\ucd5c\uc885_\uc218\uc815.zip\n\ud504\ub85c\uc81d\ud2b8_\ucd5c\uc885_\uc9c4\uc9dc\ucd5c\uc885_\uc218\uc815_220714.zip\n\n# \ud83d\ude0e Git\uc73c\ub85c \uae54\ub054\ud558\uac8c\ngit log --oneline\na1b2c3d \ubc84\uadf8 \uc218\uc815\ne4f5g6h \uc0c8\ub85c\uc6b4 \uae30\ub2a5 \ucd94\uac00\ni7j8k9l \ucf54\ub4dc \ub9ac\ud329\ud1a0\ub9c1\nm0n1o2p \ud504\ub85c\uc81d\ud2b8 \ucd08\uae30 \uc124\uc815<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">2. Git \uae30\ubcf8 \uba85\ub839\uc5b4: \uc2e4\ubb34\uc5d0\uc11c \uc790\uc8fc \uc4f0\ub294 \uac83\ub9cc \uace8\ub77c\uc11c<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ud504\ub85c\uc81d\ud2b8 \uc2dc\uc791\ud558\uae30<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \uc0c8 \ud504\ub85c\uc81d\ud2b8 \uc2dc\uc791\ngit init\ngit add README.md\ngit commit -m \"Initial commit\"  # \uad00\ub840\uc801\uc73c\ub85c \uccab \ucee4\ubc0b \uba54\uc2dc\uc9c0\n\n# \uae30\uc874 \ud504\ub85c\uc81d\ud2b8 \uac00\uc838\uc624\uae30\ngit clone https:\/\/github.com\/company\/awesome-project.git\ncd awesome-project<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\uc77c\uc0c1\uc801\uc778 \uc791\uc5c5 \ud750\ub984<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># 1. \ud604\uc7ac \uc0c1\ud0dc \ud655\uc778 (\ud558\ub8e8\uc5d0 \uc218\uc2ed \ubc88 \uc0ac\uc6a9)\ngit status\n\n# 2. \ubcc0\uacbd\uc0ac\ud56d \ud655\uc778\ngit diff                    # \uc544\uc9c1 add \uc548 \ud55c \ubcc0\uacbd\uc0ac\ud56d\ngit diff --staged          # add \ud55c \ubcc0\uacbd\uc0ac\ud56d\ngit diff HEAD~1            # \uc774\uc804 \ucee4\ubc0b\uacfc \ube44\uad50\n\n# 3. \ud30c\uc77c \ucd94\uac00 (\uc120\ud0dd\uc801\uc73c\ub85c)\ngit add src\/components\/Button.js    # \ud2b9\uc815 \ud30c\uc77c\ub9cc\ngit add src\/components\/            # \ud2b9\uc815 \ud3f4\ub354\ub9cc\ngit add .                          # \ubaa8\ub4e0 \ubcc0\uacbd\uc0ac\ud56d (\uc2e0\uc911\ud558\uac8c!)\n\n# 4. \ucee4\ubc0b\ud558\uae30\ngit commit -m \"Add user authentication feature\"\n\n# 5. \ud55c \ubc88\uc5d0 add + commit (\uc774\ubbf8 \ucd94\uc801 \uc911\uc778 \ud30c\uc77c\ub9cc)\ngit commit -am \"Fix typo in user profile\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\uc2e4\uc218\ud588\uc744 \ub54c \ub418\ub3cc\ub9ac\uae30<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \uc544\uc9c1 \ucee4\ubc0b \uc548 \ud55c \ubcc0\uacbd\uc0ac\ud56d \ub418\ub3cc\ub9ac\uae30\ngit checkout -- filename.js        # \ud2b9\uc815 \ud30c\uc77c\ngit checkout -- .                  # \ubaa8\ub4e0 \ud30c\uc77c\n\n# \ucee4\ubc0b \uba54\uc2dc\uc9c0 \uc218\uc815 (\ub9c8\uc9c0\ub9c9 \ucee4\ubc0b\ub9cc)\ngit commit --amend -m \"\uc815\uc815\ub41c \ucee4\ubc0b \uba54\uc2dc\uc9c0\"\n\n# \ucee4\ubc0b \ub418\ub3cc\ub9ac\uae30 (3\uac00\uc9c0 \ubc29\ubc95)\ngit reset --soft HEAD~1    # \ucee4\ubc0b\ub9cc \ucde8\uc18c, \ud30c\uc77c\uc740 staged \uc0c1\ud0dc \uc720\uc9c0\ngit reset --mixed HEAD~1   # \ucee4\ubc0b \ucde8\uc18c, \ud30c\uc77c\uc740 unstaged \uc0c1\ud0dc (\uae30\ubcf8\uac12)\ngit reset --hard HEAD~1    # \ucee4\ubc0b \ucde8\uc18c, \ud30c\uc77c \ubcc0\uacbd\uc0ac\ud56d\ub3c4 \ubaa8\ub450 \uc0ad\uc81c (\uc8fc\uc758!)\n\n# \uc548\uc804\ud55c \ub418\ub3cc\ub9ac\uae30 (\uc774\ub825 \ub0a8\uae40)\ngit revert a1b2c3d        # \ud2b9\uc815 \ucee4\ubc0b\uc758 \ubcc0\uacbd\uc0ac\ud56d\uc744 \ub418\ub3cc\ub9ac\ub294 \uc0c8 \ucee4\ubc0b \uc0dd\uc131<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">.gitignore \ud65c\uc6a9\ubc95<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># .gitignore \ud30c\uc77c \uc608\uc2dc\n\n# \uc6b4\uc601\uccb4\uc81c \ud30c\uc77c\n.DS_Store\nThumbs.db\n\n# IDE \uc124\uc815 \ud30c\uc77c\n.vscode\/\n.idea\/\n*.swp\n*.swo\n\n# \uc758\uc874\uc131 \ud30c\uc77c\nnode_modules\/\n__pycache__\/\n*.pyc\n\n# \ube4c\ub4dc \uacb0\uacfc\ubb3c\ndist\/\nbuild\/\n*.min.js\n\n# \ud658\uacbd \uc124\uc815 \ud30c\uc77c (\ubcf4\uc548 \uc911\uc694!)\n.env\n.env.local\nconfig\/database.yml\n\n# \ub85c\uadf8 \ud30c\uc77c\n*.log\nlogs\/\n\n# \uc784\uc2dc \ud30c\uc77c\ntmp\/\ntemp\/<\/code><\/pre>\n\n\n\n<p><strong>\uc911\uc694\ud55c \ud301<\/strong>: <code>.gitignore<\/code>\ub294 \uc544\uc9c1 Git\uc774 \ucd94\uc801\ud558\uc9c0 \uc54a\ub294 \ud30c\uc77c\uc5d0\ub9cc \uc801\uc6a9\ub429\ub2c8\ub2e4!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \uc774\ubbf8 \ucee4\ubc0b\ub41c \ud30c\uc77c\uc744 .gitignore\uc5d0 \ucd94\uac00\ud588\ub2e4\uba74\ngit rm --cached \ud30c\uc77c\uba85        # Git \ucd94\uc801\uc5d0\uc11c\ub9cc \uc81c\uac70 (\ud30c\uc77c\uc740 \uc720\uc9c0)\ngit rm -r --cached \ud3f4\ub354\uba85     # \ud3f4\ub354 \uc804\uccb4 \ucd94\uc801 \uc81c\uac70\ngit commit -m \"Remove tracked files from .gitignore\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">3. \ube0c\ub79c\uce58 \uc804\ub7b5: \ud63c\uc790\uc11c\ub3c4 \uc4f0\uace0, \ud300\uc5d0\uc11c\ub3c4 \uc4f0\ub294<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ube0c\ub79c\uce58\uc758 \uae30\ubcf8 \uac1c\ub150<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \ube0c\ub79c\uce58 \ud655\uc778\ngit branch                  # \ub85c\uceec \ube0c\ub79c\uce58 \ubaa9\ub85d\ngit branch -r              # \uc6d0\uaca9 \ube0c\ub79c\uce58 \ubaa9\ub85d\ngit branch -a              # \ubaa8\ub4e0 \ube0c\ub79c\uce58 \ubaa9\ub85d\n\n# \ube0c\ub79c\uce58 \uc0dd\uc131 \ubc0f \uc774\ub3d9\ngit branch feature\/user-auth           # \ube0c\ub79c\uce58 \uc0dd\uc131\ngit checkout feature\/user-auth         # \ube0c\ub79c\uce58 \uc774\ub3d9\ngit checkout -b feature\/user-auth      # \uc0dd\uc131\uacfc \uc774\ub3d9\uc744 \ud55c \ubc88\uc5d0\n\n# \ucd5c\uc2e0 Git\uc5d0\uc11c\ub294 switch \uc0ac\uc6a9 \uad8c\uc7a5\ngit switch feature\/user-auth           # \ube0c\ub79c\uce58 \uc774\ub3d9\ngit switch -c feature\/user-auth        # \uc0dd\uc131\uacfc \uc774\ub3d9\uc744 \ud55c \ubc88\uc5d0<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Git Flow \ube0c\ub79c\uce58 \uc804\ub7b5 (\ub300\ubd80\ubd84\uc758 \ud68c\uc0ac\uc5d0\uc11c \uc0ac\uc6a9)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \ube0c\ub79c\uce58 \uad6c\uc870\nmain (master)     \u2190 \ubc30\ud3ec\uc6a9 (\ud56d\uc0c1 \uc548\uc815\uc801)\n  \u2193\ndevelop          \u2190 \uac1c\ubc1c \uba54\uc778 \ube0c\ub79c\uce58\n  \u2193\nfeature\/*        \u2190 \uc0c8 \uae30\ub2a5 \uac1c\ubc1c\nhotfix\/*         \u2190 \uae34\uae09 \ubc84\uadf8 \uc218\uc815\nrelease\/*        \u2190 \ubc30\ud3ec \uc900\ube44\n\n# \uc2e4\uc81c \uc791\uc5c5 \ud750\ub984\n# 1. \uc0c8 \uae30\ub2a5 \uac1c\ubc1c \uc2dc\uc791\ngit checkout develop\ngit pull origin develop\ngit checkout -b feature\/user-login\n\n# 2. \uac1c\ubc1c \uc644\ub8cc \ud6c4 develop\uc5d0 \ud569\uce58\uae30\ngit checkout develop\ngit pull origin develop  # \ucd5c\uc2e0 \uc0c1\ud0dc\ub85c \uc5c5\ub370\uc774\ud2b8\ngit merge feature\/user-login\ngit push origin develop\ngit branch -d feature\/user-login  # \ub85c\uceec \ube0c\ub79c\uce58 \uc0ad\uc81c<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">GitHub Flow (\uac04\ub2e8\ud55c \ud504\ub85c\uc81d\ud2b8\uc6a9)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \ub354 \uac04\ub2e8\ud55c \uc804\ub7b5\nmain             \u2190 \ubc30\ud3ec\uc6a9\nfeature\/*        \u2190 \ubaa8\ub4e0 \uc791\uc5c5\uc6a9 \ube0c\ub79c\uce58\n\n# \uc791\uc5c5 \ud750\ub984\ngit checkout main\ngit pull origin main\ngit checkout -b fix\/payment-bug\n# ... \uc791\uc5c5 ...\ngit push origin fix\/payment-bug\n# GitHub\uc5d0\uc11c Pull Request \uc0dd\uc131<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">4. \uc6d0\uaca9 \uc800\uc7a5\uc18c \uad00\ub9ac: GitHub\uacfc \uce5c\ud574\uc9c0\uae30<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uc6d0\uaca9 \uc800\uc7a5\uc18c \uc5f0\uacb0<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \uc6d0\uaca9 \uc800\uc7a5\uc18c \ucd94\uac00\ngit remote add origin https:\/\/github.com\/username\/project.git\n\n# \uc5ec\ub7ec \uc6d0\uaca9 \uc800\uc7a5\uc18c \uad00\ub9ac\ngit remote add origin https:\/\/github.com\/company\/project.git\ngit remote add fork https:\/\/github.com\/myname\/project.git\n\n# \uc6d0\uaca9 \uc800\uc7a5\uc18c \ud655\uc778\ngit remote -v\n\n# \uc6d0\uaca9 \uc800\uc7a5\uc18c URL \ubcc0\uacbd\ngit remote set-url origin https:\/\/github.com\/newurl\/project.git<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">push\uc640 pull\uc758 \uc2e4\uc804 \ud65c\uc6a9<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \uae30\ubcf8\uc801\uc778 push\/pull\ngit push origin main\ngit pull origin main\n\n# \uc0c8 \ube0c\ub79c\uce58 \uccab push (upstream \uc124\uc815)\ngit push -u origin feature\/new-feature\n# \uc774\ud6c4\ub85c\ub294 git push\ub9cc \ud574\ub3c4 \ub428\n\n# force push (\uc870\uc2ec\ud574\uc11c \uc0ac\uc6a9!)\ngit push --force-with-lease origin main  # \ub354 \uc548\uc804\ud55c \ubc29\ubc95\ngit push -f origin main                  # \uc704\ud5d8\ud55c \ubc29\ubc95\n\n# fetch vs pull\ngit fetch origin          # \uc6d0\uaca9 \ubcc0\uacbd\uc0ac\ud56d\ub9cc \uac00\uc838\uc624\uae30 (\ub85c\uceec \ud30c\uc77c \uc548 \uac74\ub4dc\ub9bc)\ngit pull origin main      # fetch + merge\ub97c \ud55c \ubc88\uc5d0<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ucda9\ub3cc \ud574\uacb0\ud558\uae30 (Conflict Resolution)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># merge \uc911 \ucda9\ub3cc \ubc1c\uc0dd \uc2dc\ngit merge feature\/user-auth\n# Auto-merging src\/auth.js\n# CONFLICT (content): Merge conflict in src\/auth.js\n# Automatic merge failed; fix conflicts and then commit the result.\n\n# \ucda9\ub3cc \ud30c\uc77c \ud655\uc778\ngit status\n# Unmerged paths:\n#   both modified:   src\/auth.js\n\n# \ucda9\ub3cc \ud574\uacb0 \ud6c4\ngit add src\/auth.js\ngit commit -m \"Resolve merge conflict in auth.js\"<\/code><\/pre>\n\n\n\n<p>\ucda9\ub3cc\uc774 \ubc1c\uc0dd\ud55c \ud30c\uc77c\uc744 \uc5f4\uba74 \uc774\ub7f0 \uc2dd\uc73c\ub85c \ud45c\uc2dc\ub429\ub2c8\ub2e4:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function authenticateUser(username, password) {\n&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD\n    \/\/ \ud604\uc7ac \ube0c\ub79c\uce58\uc758 \ucf54\ub4dc\n    return bcrypt.compare(password, user.hashedPassword);\n=======\n    \/\/ \ud569\uce58\ub824\ub294 \ube0c\ub79c\uce58\uc758 \ucf54\ub4dc\n    return crypto.compare(password, user.encryptedPassword);\n&gt;&gt;&gt;&gt;&gt;&gt;&gt; feature\/user-auth\n}<\/code><\/pre>\n\n\n\n<p>\uc218\ub3d9\uc73c\ub85c \ud3b8\uc9d1\ud574\uc11c \uc62c\ubc14\ub978 \ucf54\ub4dc\ub97c \ub0a8\uae30\uace0 <code>&lt;&lt;&lt;&lt;&lt;&lt;&lt;<\/code>, <code>=======<\/code>, <code>&gt;&gt;&gt;&gt;&gt;&gt;&gt;<\/code> \ud45c\uc2dc\ub97c \uc0ad\uc81c\ud569\ub2c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. GitHub \ud611\uc5c5 \uc6cc\ud06c\ud50c\ub85c\uc6b0: Pull Request\ubd80\ud130 Code Review\uae4c\uc9c0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Pull Request (PR) \ub9cc\ub4e4\uae30<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># 1. \ube0c\ub79c\uce58\uc5d0\uc11c \uc791\uc5c5 \uc644\ub8cc\ngit checkout -b feature\/add-shopping-cart\n# ... \uac1c\ubc1c \uc791\uc5c5 ...\ngit add .\ngit commit -m \"Add shopping cart functionality\"\ngit push origin feature\/add-shopping-cart\n\n# 2. GitHub\uc5d0\uc11c Pull Request \uc0dd\uc131\n# - base: main, compare: feature\/add-shopping-cart\n# - \uc81c\ubaa9: Add shopping cart functionality\n# - \uc124\uba85: \uc7a5\ubc14\uad6c\ub2c8 \uae30\ub2a5\uc744 \ucd94\uac00\ud588\uc2b5\ub2c8\ub2e4. \uc0c1\ud488 \ucd94\uac00\/\uc0ad\uc81c\/\uc218\ub7c9 \ubcc0\uacbd\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\uc88b\uc740 PR \ub9cc\ub4e4\uae30<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>## PR \ud15c\ud50c\ub9bf \uc608\uc2dc\n\n### \ud83c\udfaf \uc791\uc5c5 \ub0b4\uc6a9\n\n- &#91; ] \uc7a5\ubc14\uad6c\ub2c8 \uc0c1\ud488 \ucd94\uac00 \uae30\ub2a5\n- &#91; ] \uc7a5\ubc14\uad6c\ub2c8 \uc0c1\ud488 \uc0ad\uc81c \uae30\ub2a5\n- &#91; ] \uc0c1\ud488 \uc218\ub7c9 \ubcc0\uacbd \uae30\ub2a5\n- &#91; ] \uc7a5\ubc14\uad6c\ub2c8 \ucd1d\uc561 \uacc4\uc0b0\n\n### \ud83e\uddea \ud14c\uc2a4\ud2b8\n\n- &#91; ] \ub2e8\uc704 \ud14c\uc2a4\ud2b8 \ucd94\uac00\n- &#91; ] \ud1b5\ud569 \ud14c\uc2a4\ud2b8 \ud655\uc778\n- &#91; ] \uc218\ub3d9 \ud14c\uc2a4\ud2b8 \uc644\ub8cc\n\n### \ud83d\udcf8 \uc2a4\ud06c\ub9b0\uc0f7\n\n(UI \ubcc0\uacbd\uc0ac\ud56d\uc774 \uc788\ub2e4\uba74 \uc2a4\ud06c\ub9b0\uc0f7 \ucca8\ubd80)\n\n### \ud83d\udd17 \uad00\ub828 \uc774\uc288\n\nCloses #123\n\n### \ud83d\udcdd \ub9ac\ubdf0\uc5b4\uc5d0\uac8c\n\n\uc7a5\ubc14\uad6c\ub2c8 \uc131\ub2a5 \ucd5c\uc801\ud654 \ubd80\ubd84\uc744 \ud2b9\ud788 \uac80\ud1a0\ud574 \uc8fc\uc138\uc694.<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Code Review \ubc1b\uace0 \uc8fc\uae30<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \ub9ac\ubdf0 \ubc18\uc601 \ud6c4 \ucd94\uac00 \ucee4\ubc0b\ngit add .\ngit commit -m \"Apply code review suggestions\"\ngit push origin feature\/add-shopping-cart\n\n# PR\uc774 \uc2b9\uc778\ub418\uace0 merge \ud6c4 \uc815\ub9ac\ngit checkout main\ngit pull origin main\ngit branch -d feature\/add-shopping-cart  # \ub85c\uceec \ube0c\ub79c\uce58 \uc0ad\uc81c<\/code><\/pre>\n\n\n\n<p><strong>\ub9ac\ubdf0 \ubc1b\uc744 \ub54c\uc758 \ub9c8\uc74c\uac00\uc9d0<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ube44\ud310\uc774 \uc544\ub2cc \uc131\uc7a5\uc758 \uae30\ud68c\ub85c \ubc1b\uc544\ub4e4\uc774\uae30<\/li>\n\n\n\n<li>\uc9c8\ubb38\ud558\uae30\ub97c \ub450\ub824\uc6cc\ud558\uc9c0 \ub9d0\uae30<\/li>\n\n\n\n<li>&#8220;\uc65c \uc774\ub807\uac8c \ud588\ub098\uc694?&#8221;\uc5d0 \ub2f9\ud669\ud558\uc9c0 \ub9d0\uace0 \uc124\uba85\ud558\uae30<\/li>\n<\/ul>\n\n\n\n<p><strong>\ub9ac\ubdf0 \uc904 \ub54c\uc758 \uc6d0\uce59<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ucf54\ub4dc\uc5d0 \ub300\ud55c \uc758\uacac, \uc0ac\ub78c\uc5d0 \ub300\ud55c \uacf5\uaca9 \uae08\uc9c0<\/li>\n\n\n\n<li>&#8220;\uc774\ub807\uac8c \ud558\uba74 \uc5b4\ub5a8\uae4c\uc694?&#8221; \uc2dd\uc758 \uc81c\uc548<\/li>\n\n\n\n<li>\uce6d\ucc2c\ub3c4 \uc801\uadf9\uc801\uc73c\ub85c \ud574\uc8fc\uae30<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">6. \uc2e4\ubb34\uc5d0\uc11c \uc790\uc8fc \ub9c8\uc8fc\uce58\ub294 \uc0c1\ud669\ub4e4\uacfc \ud574\uacb0\ubc95<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uc0c1\ud669 1: &#8220;\uc5b4? \ub0b4 \ucf54\ub4dc\uac00 \uc0ac\ub77c\uc84c\uc5b4\uc694!&#8221;<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \uc6d0\uc778: \uc798\ubabb\ub41c merge\ub098 reset\n# \ud574\uacb0: reflog \ud65c\uc6a9\ngit reflog                    # \ubaa8\ub4e0 \uc791\uc5c5 \uc774\ub825 \ud655\uc778\ngit checkout HEAD@{3}         # 3\ub2e8\uacc4 \uc804\uc73c\ub85c \ub418\ub3cc\uc544\uac00\uae30\ngit checkout -b recovery      # \ubcf5\uad6c\uc6a9 \ube0c\ub79c\uce58 \uc0dd\uc131<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\uc0c1\ud669 2: &#8220;\ucee4\ubc0b \uba54\uc2dc\uc9c0\ub97c \uc798\ubabb \uc801\uc5c8\uc5b4\uc694!&#8221;<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \ub9c8\uc9c0\ub9c9 \ucee4\ubc0b \uba54\uc2dc\uc9c0 \uc218\uc815\ngit commit --amend -m \"\uc62c\ubc14\ub978 \ucee4\ubc0b \uba54\uc2dc\uc9c0\"\n\n# \uc774\ubbf8 push\ud55c \uacbd\uc6b0 (\ud300\uc6d0\uacfc \uc0c1\uc758 \ud6c4)\ngit push --force-with-lease origin feature-branch<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\uc0c1\ud669 3: &#8220;\uc798\ubabb\ub41c \ube0c\ub79c\uce58\uc5d0 \ucee4\ubc0b\ud588\uc5b4\uc694!&#8221;<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \ud604\uc7ac \ube0c\ub79c\uce58\uc5d0\uc11c \ucee4\ubc0b\uc744 \ub2e4\ub978 \ube0c\ub79c\uce58\ub85c \uc62e\uae30\uae30\ngit checkout correct-branch\ngit cherry-pick a1b2c3d      # \ud2b9\uc815 \ucee4\ubc0b\ub9cc \uac00\uc838\uc624\uae30\n\n# \uc6d0\ub798 \ube0c\ub79c\uce58\uc5d0\uc11c \ucee4\ubc0b \uc81c\uac70\ngit checkout wrong-branch\ngit reset --hard HEAD~1<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\uc0c1\ud669 4: &#8220;\ud070 \ud30c\uc77c\uc744 \uc2e4\uc218\ub85c \ucee4\ubc0b\ud588\uc5b4\uc694!&#8221;<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># Git\uc5d0\uc11c \ud30c\uc77c \uc774\ub825\uae4c\uc9c0 \uc644\uc804 \uc0ad\uc81c\ngit filter-branch --force --index-filter \n'git rm --cached --ignore-unmatch path\/to\/large-file' \n--prune-empty --tag-name-filter cat -- --all\n\n# \ub354 \uc26c\uc6b4 \ubc29\ubc95: BFG Repo-Cleaner \uc0ac\uc6a9\njava -jar bfg.jar --delete-files large-file.zip\ngit reflog expire --expire=now --all &amp;&amp; git gc --prune=now --aggressive<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\uc0c1\ud669 5: &#8220;\ub3d9\ub8cc\uc640 \uac19\uc740 \ud30c\uc77c\uc744 \uc218\uc815\ud588\uc5b4\uc694!&#8221;<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \ucda9\ub3cc \ucd5c\uc18c\ud654 \uc804\ub7b5\n# 1. \uc790\uc8fc pull \ubc1b\uae30\ngit pull origin develop\n\n# 2. \uc791\uc740 \ub2e8\uc704\ub85c \ucee4\ubc0b\ud558\uae30\ngit add specific-file.js\ngit commit -m \"Add validation for email field\"\n\n# 3. rebase \uc0ac\uc6a9\ud558\uae30 (\ud788\uc2a4\ud1a0\ub9ac\ub97c \uae54\ub054\ud558\uac8c)\ngit pull --rebase origin develop<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">7. \uace0\uae09 Git \uae30\ub2a5: \uc2e4\ubb34\uc5d0\uc11c \ube5b\ub098\ub294 \ub3c4\uad6c\ub4e4<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Stash: \uc784\uc2dc \uc800\uc7a5\uc758 \ub9c8\ubc95<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \uc791\uc5c5 \uc911 \uae09\ud55c \ubc84\uadf8 \uc218\uc815 \uc694\uccad\uc774 \ub4e4\uc5b4\uc654\uc744 \ub54c\ngit stash                              # \ud604\uc7ac \uc791\uc5c5 \uc784\uc2dc \uc800\uc7a5\ngit stash save \"WIP: user profile UI\"  # \uba54\uc2dc\uc9c0\uc640 \ud568\uaed8 \uc800\uc7a5\n\ngit checkout hotfix\/critical-bug\n# ... \ubc84\uadf8 \uc218\uc815 ...\ngit checkout feature\/user-profile\n\ngit stash list                         # \uc800\uc7a5\ub41c stash \ubaa9\ub85d\ngit stash pop                          # \uac00\uc7a5 \ucd5c\uadfc stash \uc801\uc6a9 \ud6c4 \uc0ad\uc81c\ngit stash apply stash@{1}              # \ud2b9\uc815 stash \uc801\uc6a9 (\uc720\uc9c0)\ngit stash drop stash@{1}               # \ud2b9\uc815 stash \uc0ad\uc81c<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Cherry-pick: \uc120\ud0dd\uc801 \ucee4\ubc0b \uac00\uc838\uc624\uae30<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \ub2e4\ub978 \ube0c\ub79c\uce58\uc758 \ud2b9\uc815 \ucee4\ubc0b\ub9cc \uac00\uc838\uc624\uae30\ngit log --oneline feature\/payment     # \ucee4\ubc0b \ud574\uc2dc \ud655\uc778\ngit cherry-pick e4f5g6h               # \ud2b9\uc815 \ucee4\ubc0b\ub9cc \ud604\uc7ac \ube0c\ub79c\uce58\uc5d0 \uc801\uc6a9\n\n# \uc5ec\ub7ec \ucee4\ubc0b\uc744 \ud55c \ubc88\uc5d0\ngit cherry-pick e4f5g6h i7j8k9l m0n1o2p<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Interactive Rebase: \ucee4\ubc0b \uc774\ub825 \uc815\ub9ac<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \ucd5c\uadfc 3\uac1c \ucee4\ubc0b \uc218\uc815\ngit rebase -i HEAD~3\n\n# \uc5d0\ub514\ud130\uc5d0\uc11c \uc218\ud589\ud560 \uc218 \uc788\ub294 \uc791\uc5c5\ub4e4:\n# pick: \ucee4\ubc0b \uadf8\ub300\ub85c \uc720\uc9c0\n# edit: \ucee4\ubc0b \uba54\uc2dc\uc9c0\ub098 \ub0b4\uc6a9 \uc218\uc815\n# squash: \uc774\uc804 \ucee4\ubc0b\uacfc \ud569\uce58\uae30\n# drop: \ucee4\ubc0b \uc0ad\uc81c\n# reorder: \uc21c\uc11c \ubc14\uafb8\uae30 (\uc904 \uc21c\uc11c \ubcc0\uacbd)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Bisect: \ubc84\uadf8 \ucc3e\uae30<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \uc5b8\uc81c\ubd80\ud130 \ubc84\uadf8\uac00 \uc2dc\uc791\ub410\ub294\uc9c0 \uc774\uc9c4 \uac80\uc0c9\uc73c\ub85c \ucc3e\uae30\ngit bisect start\ngit bisect bad                    # \ud604\uc7ac \ubc84\uc804\uc740 \ubc84\uadf8 \uc788\uc74c\ngit bisect good v1.0.0           # v1.0.0\uc740 \uc815\uc0c1 \uc791\ub3d9\n\n# Git\uc774 \uc911\uac04 \uc9c0\uc810\uc73c\ub85c \uc774\ub3d9\uc2dc\ucf1c \uc90c\n# \ud14c\uc2a4\ud2b8 \ud6c4 \uacb0\uacfc \uc785\ub825\ngit bisect good                   # \uc774 \ubc84\uc804\uc740 \uc815\uc0c1\n# \ub610\ub294\ngit bisect bad                    # \uc774 \ubc84\uc804\ub3c4 \ubc84\uadf8 \uc788\uc74c\n\n# \ubc18\ubcf5\ud558\uba74 \ubc84\uadf8\uac00 \uc2dc\uc791\ub41c \ucee4\ubc0b\uc744 \ucc3e\uc544\uc90c\ngit bisect reset                  # \uc6d0\ub798 \uc704\uce58\ub85c \ub3cc\uc544\uac00\uae30<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">8. GitHub \uace0\uae09 \uae30\ub2a5: \ud504\ub85c\uc81d\ud2b8 \uad00\ub9ac\ubd80\ud130 \uc790\ub3d9\ud654\uae4c\uc9c0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Issues\uc640 Project \uad00\ub9ac<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>## Issue \ud15c\ud50c\ub9bf \uc608\uc2dc\n\n### \ud83d\udc1b \ubc84\uadf8 \ub9ac\ud3ec\ud2b8\n\n**\uc99d\uc0c1**\n\ub85c\uadf8\uc778 \ud6c4 \ud504\ub85c\ud544 \ud398\uc774\uc9c0\uac00 \ub85c\ub529\ub418\uc9c0 \uc54a\uc74c\n\n**\uc7ac\ud604 \ubc29\ubc95**\n\n1. \uba54\uc778 \ud398\uc774\uc9c0\uc5d0\uc11c \ub85c\uadf8\uc778\n2. \ud504\ub85c\ud544 \uba54\ub274 \ud074\ub9ad\n3. \ube48 \ud654\uba74 \ud45c\uc2dc\n\n**\uc608\uc0c1 \uacb0\uacfc**\n\uc0ac\uc6a9\uc790 \ud504\ub85c\ud544 \uc815\ubcf4\uac00 \ud45c\uc2dc\ub418\uc5b4\uc57c \ud568\n\n**\uc2e4\uc81c \uacb0\uacfc**\n\ube48 \ud654\uba74\uc774 \ud45c\uc2dc\ub428\n\n**\ud658\uacbd**\n\n- OS: macOS Monterey\n- Browser: Chrome 103.0.5060.134\n- Device: MacBook Pro 2021\n\n**\ucd94\uac00 \uc815\ubcf4**\n\ube0c\ub77c\uc6b0\uc800 \ucf58\uc194\uc5d0 API \uc624\ub958 \uba54\uc2dc\uc9c0 \ucd9c\ub825<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">GitHub Actions\ub85c \uc790\ub3d9\ud654<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># .github\/workflows\/ci.yml\nname: CI\n\non:\n  push:\n    branches: &#91;main, develop]\n  pull_request:\n    branches: &#91;main, develop]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions\/checkout@v3\n\n      - name: Setup Node.js\n        uses: actions\/setup-node@v3\n        with:\n          node-version: \"18\"\n          cache: \"npm\"\n\n      - name: Install dependencies\n        run: npm ci\n\n      - name: Run tests\n        run: npm test\n\n      - name: Run linting\n        run: npm run lint\n\n      - name: Build project\n        run: npm run build<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Security \uae30\ub2a5 \ud65c\uc6a9<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \uc758\uc874\uc131 \ubcf4\uc548 \ucde8\uc57d\uc810 \ud655\uc778\nnpm audit\nnpm audit fix\n\n# GitHub\uc5d0\uc11c \uc790\ub3d9\uc73c\ub85c \ubcf4\uc548 \ucde8\uc57d\uc810 \uc54c\ub9bc\n# Settings &gt; Security &amp; analysis \uc5d0\uc11c \uc124\uc815\n# - Dependency graph\n# - Dependabot alerts\n# - Dependabot security updates<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">9. \ud300 \ud611\uc5c5\uc744 \uc704\ud55c Git \ucee8\ubca4\uc158<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ucee4\ubc0b \uba54\uc2dc\uc9c0 \ucee8\ubca4\uc158<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># Conventional Commits \ud615\uc2dd\n&lt;type>&#91;optional scope]: &lt;description>\n\n&#91;optional body]\n\n&#91;optional footer(s)]\n\n# \uc608\uc2dc\ub4e4\nfeat: add user authentication\nfix: resolve login redirect issue\ndocs: update API documentation\nstyle: fix code formatting\nrefactor: improve database query performance\ntest: add unit tests for user service\nchore: update dependency versions\n\n# \ub354 \uad6c\uccb4\uc801\uc778 \uc608\uc2dc\nfeat(auth): implement OAuth 2.0 login\nfix(payment): handle null pointer in payment processing \ndocs(readme): add installation instructions<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ube0c\ub79c\uce58 \ub124\uc774\ubc0d \ucee8\ubca4\uc158<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \uae30\ub2a5 \uac1c\ubc1c\nfeature\/user-authentication\nfeature\/shopping-cart\nfeature\/payment-integration\n\n# \ubc84\uadf8 \uc218\uc815\nfix\/login-redirect-issue\nfix\/payment-validation-error\nhotfix\/critical-security-patch\n\n# \uac1c\uc120 \uc791\uc5c5\nimprove\/database-performance\nrefactor\/user-service\nchore\/update-dependencies\n\n# \uc2e4\ud5d8\uc801 \uae30\ub2a5\nexperiment\/new-ui-design\nspike\/graphql-integration<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ucf54\ub4dc \ub9ac\ubdf0 \uac00\uc774\ub4dc\ub77c\uc778<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>## \ub9ac\ubdf0 \uccb4\ud06c\ub9ac\uc2a4\ud2b8\n\n### \uae30\ub2a5\uc131\n\n- &#91; ] \uc694\uad6c\uc0ac\ud56d\uc744 \ucda9\uc871\ud558\ub294\uac00?\n- &#91; ] \uc5e3\uc9c0 \ucf00\uc774\uc2a4\uac00 \ucc98\ub9ac\ub418\uc5c8\ub294\uac00?\n- &#91; ] \uc5d0\ub7ec \ud578\ub4e4\ub9c1\uc774 \uc801\uc808\ud55c\uac00?\n\n### \ucf54\ub4dc \ud488\uc9c8\n\n- &#91; ] \ucf54\ub4dc\uac00 \uc77d\uae30 \uc26c\uc6b4\uac00?\n- &#91; ] \ub124\uc774\ubc0d\uc774 \uba85\ud655\ud55c\uac00?\n- &#91; ] \uc911\ubcf5 \ucf54\ub4dc\uac00 \uc5c6\ub294\uac00?\n- &#91; ] \ud568\uc218\uac00 \ud55c \uac00\uc9c0 \uc5ed\ud560\ub9cc \ud558\ub294\uac00?\n\n### \uc131\ub2a5\n\n- &#91; ] \ubd88\ud544\uc694\ud55c \ub9ac\ub80c\ub354\ub9c1\uc774 \uc5c6\ub294\uac00?\n- &#91; ] \uba54\ubaa8\ub9ac \ub204\uc218 \uac00\ub2a5\uc131\uc740 \uc5c6\ub294\uac00?\n- &#91; ] \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ucffc\ub9ac\uac00 \ud6a8\uc728\uc801\uc778\uac00?\n\n### \ubcf4\uc548\n\n- &#91; ] \uc0ac\uc6a9\uc790 \uc785\ub825 \uac80\uc99d\uc774 \ub418\uc5b4\uc788\ub294\uac00?\n- &#91; ] \ubbfc\uac10\ud55c \uc815\ubcf4\uac00 \ub178\ucd9c\ub418\uc9c0 \uc54a\ub294\uac00?\n- &#91; ] \uc778\uc99d\/\uc778\uac00\uac00 \uc801\uc808\ud788 \uad6c\ud604\ub418\uc5c8\ub294\uac00?<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">10. \uc2e4\ubb34 \uc2dc\ub098\ub9ac\uc624: \ud558\ub8e8 \uc77c\uacfc\ub85c \ubcf4\ub294 Git \ud65c\uc6a9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uc624\uc804 9\uc2dc: \ucd9c\uadfc \ud6c4 \uc0c1\ud669 \ud30c\uc545<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># 1. \ucd5c\uc2e0 \uc0c1\ud0dc \ud655\uc778\ngit status\ngit pull origin develop\n\n# 2. \uc5b4\uc81c \uc791\uc5c5 \ub0b4\uc6a9 \ud655\uc778\ngit log --oneline -10\ngit diff HEAD~1\n\n# 3. \uc624\ub298 \ud560 \uc77c \ud655\uc778\ngit branch -a\ngit checkout feature\/user-dashboard<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\uc624\uc804 10\uc2dc: \uc0c8\ub85c\uc6b4 \uae30\ub2a5 \uac1c\ubc1c \uc2dc\uc791<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># 1. \uc0c8 \ube0c\ub79c\uce58 \uc0dd\uc131\ngit checkout develop\ngit pull origin develop\ngit checkout -b feature\/email-notifications\n\n# 2. \uccab \ubc88\uc9f8 \uc791\uc5c5 \ucee4\ubc0b\n# ... \ucf54\ub529 ...\ngit add src\/services\/email.js\ngit commit -m \"feat: add email service basic structure\"\n\n# 3. \uc911\uac04 \uc800\uc7a5 (\uc810\uc2ec \uc804)\ngit add .\ngit commit -m \"wip: implement email template system\"\ngit push origin feature\/email-notifications<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\uc624\ud6c4 2\uc2dc: \ucf54\ub4dc \ub9ac\ubdf0 \uc694\uccad \ub4e4\uc5b4\uc634<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># 1. \ud604\uc7ac \uc791\uc5c5 \uc784\uc2dc \uc800\uc7a5\ngit stash save \"WIP: email notification templates\"\n\n# 2. \ub9ac\ubdf0\ud560 \ube0c\ub79c\uce58\ub85c \uc774\ub3d9\ngit checkout feature\/user-profile-update\ngit pull origin feature\/user-profile-update\n\n# 3. \ucf54\ub4dc \ud655\uc778\ngit log --oneline -5\ngit diff develop..feature\/user-profile-update\n\n# 4. \ub85c\uceec\uc5d0\uc11c \ud14c\uc2a4\ud2b8\nnpm test\nnpm run lint\n\n# 5. GitHub\uc5d0\uc11c \ub9ac\ubdf0 \uc791\uc131 \ud6c4 \uc6d0\ub798 \uc791\uc5c5\uc73c\ub85c \ubcf5\uadc0\ngit checkout feature\/email-notifications\ngit stash pop<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\uc624\ud6c4 4\uc2dc: \uae34\uae09 \ubc84\uadf8 \uc218\uc815 \uc694\uccad<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># 1. \ud604\uc7ac \uc791\uc5c5 \uc800\uc7a5\ngit add .\ngit commit -m \"wip: email notification progress save\"\n\n# 2. \ud56b\ud53d\uc2a4 \ube0c\ub79c\uce58 \uc0dd\uc131\ngit checkout main\ngit pull origin main\ngit checkout -b hotfix\/payment-error\n\n# 3. \ubc84\uadf8 \uc218\uc815\n# ... \ucf54\ub529 ...\ngit add .\ngit commit -m \"fix: resolve payment processing timeout issue\"\n\n# 4. \ud14c\uc2a4\ud2b8 \ud6c4 push\nnpm test\ngit push origin hotfix\/payment-error\n\n# 5. \uc989\uc2dc PR \uc0dd\uc131 \ubc0f \ube60\ub978 \ub9ac\ubdf0 \uc694\uccad<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\uc624\ud6c4 6\uc2dc: \ud558\ub8e8 \ub9c8\ubb34\ub9ac<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># 1. \uc791\uc5c5 \ub0b4\uc6a9 \uc815\ub9ac\ngit add .\ngit commit -m \"feat: complete email notification system\n\n- Add email template engine\n- Implement notification queue\n- Add email delivery tracking\n- Add unit tests\"\n\n# 2. \uc6d0\uaca9\uc5d0 push\ngit push origin feature\/email-notifications\n\n# 3. PR \uc0dd\uc131 \uc900\ube44\ngit log --oneline feature\/email-notifications ^develop\n\n# 4. \ub0b4\uc77c\uc744 \uc704\ud55c \uba54\ubaa8\necho \"TODO: Add integration tests for email system\" &gt; TODO.md\ngit add TODO.md\ngit commit -m \"docs: add TODO for tomorrow\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">11. \uc790\uc8fc \ud558\ub294 \uc2e4\uc218\uc640 \uc608\ubc29\ubc95<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uc2e4\uc218 1: &#8220;git add .&#8221; \ub0a8\uc6a9<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \u274c \ub098\uc05c \uc2b5\uad00\ngit add .\ngit commit -m \"fix stuff\"\n\n# \u2705 \uc88b\uc740 \uc2b5\uad00\ngit add src\/components\/Button.js\ngit add tests\/button.test.js\ngit commit -m \"fix: resolve button click event handler\"\n\ngit add README.md\ngit commit -m \"docs: update installation instructions\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\uc2e4\uc218 2: \uc758\ubbf8 \uc5c6\ub294 \ucee4\ubc0b \uba54\uc2dc\uc9c0<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \u274c \ub098\uc05c \uc608\uc2dc\ub4e4\ngit commit -m \"fix\"\ngit commit -m \"update\"\ngit commit -m \"changes\"\ngit commit -m \"asdf\"\ngit commit -m \"work in progress\"\n\n# \u2705 \uc88b\uc740 \uc608\uc2dc\ub4e4\ngit commit -m \"fix: resolve null pointer exception in user service\"\ngit commit -m \"feat: add password strength validation\"\ngit commit -m \"refactor: extract common utility functions\"\ngit commit -m \"test: add integration tests for payment flow\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\uc2e4\uc218 3: merge vs rebase \ud63c\ub3d9<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># merge: \ube0c\ub79c\uce58 \ud788\uc2a4\ud1a0\ub9ac \ubcf4\uc874 (\ud611\uc5c5 \uc2dc \uc548\uc804)\ngit checkout main\ngit merge feature\/user-auth\n\n# rebase: \uae54\ub054\ud55c \ud788\uc2a4\ud1a0\ub9ac (\uac1c\uc778 \ube0c\ub79c\uce58\uc5d0\uc11c\ub9cc)\ngit checkout feature\/user-auth\ngit rebase main\n\n# \u26a0\ufe0f \uc8fc\uc758: \uc774\ubbf8 push\ud55c \ube0c\ub79c\uce58\ub294 rebase \uae08\uc9c0!<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\uc2e4\uc218 4: \ud070 \ud30c\uc77c \ucee4\ubc0b<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \uc608\ubc29: .gitignore\uc5d0 \ubbf8\ub9ac \ucd94\uac00\n*.log\n*.tmp\nnode_modules\/\n.env\ndist\/\nbuild\/\n\n# Git LFS \uc0ac\uc6a9 (\ud070 \ubc14\uc774\ub108\ub9ac \ud30c\uc77c\uc6a9)\ngit lfs track \"*.psd\"\ngit add .gitattributes\ngit add design.psd\ngit commit -m \"add design file with LFS\"<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">12. \ub3c4\uad6c\uc640 \uc124\uc815\uc73c\ub85c \uc0dd\uc0b0\uc131 \ub192\uc774\uae30<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Git \uc124\uc815 \ucd5c\uc801\ud654<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \uae30\ubcf8 \uc124\uc815\ngit config --global user.name \"\uae40\uac1c\ubc1c\"\ngit config --global user.email \"dev@company.com\"\n\n# \ud3b8\uc758 \uc124\uc815\ngit config --global init.defaultBranch main\ngit config --global core.autocrlf input  # Windows\uc5d0\uc11c\ub294 true\ngit config --global core.editor \"code --wait\"  # VS Code \uc0ac\uc6a9\n\n# \uc720\uc6a9\ud55c \ubcc4\uce6d\ub4e4\ngit config --global alias.st status\ngit config --global alias.co checkout\ngit config --global alias.br branch\ngit config --global alias.ci commit\ngit config --global alias.unstage 'reset HEAD --'\ngit config --global alias.last 'log -1 HEAD'\ngit config --global alias.visual '!gitk'\n\n# \ub85c\uadf8 \uc608\uc058\uac8c \ubcf4\uae30\ngit config --global alias.lg \"log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)&lt;%an&gt;%Creset' --abbrev-commit\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">VS Code\uc640 Git \uc5f0\ub3d9<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ settings.json\n{\n  \"git.autofetch\": true,\n  \"git.confirmSync\": false,\n  \"git.enableSmartCommit\": true,\n  \"diffEditor.ignoreTrimWhitespace\": false,\n  \"merge-conflict.autoNavigateNextConflict.enabled\": true\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\uc720\uc6a9\ud55c Git GUI \ub3c4\uad6c\ub4e4<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \ud130\ubbf8\ub110\uc5d0\uc11c \uc2dc\uac01\uc801\uc73c\ub85c\ngit log --graph --oneline --all\ngit log --graph --pretty=format:'%h -%d %s (%cr) &lt;%an&gt;' --abbrev-commit --all\n\n# GUI \ub3c4\uad6c\ub4e4\n- GitHub Desktop (\ucd08\ubcf4\uc790 \ucd94\ucc9c)\n- SourceTree (\ubb34\ub8cc, \uac15\ub825\ud55c \uae30\ub2a5)\n- GitKraken (\uc720\ub8cc, \uc608\uc05c UI)\n- VS Code Git Graph \ud655\uc7a5 (\uac1c\ubc1c \uc911 \ud3b8\ub9ac)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\ub9c8\uce58\uba70: Git \ub9c8\uc2a4\ud130\uac00 \ub418\ub294 \uc5ec\uc815<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ub2e8\uacc4\ubcc4 \ud559\uc2b5 \ub85c\ub4dc\ub9f5<\/h3>\n\n\n\n<p><strong>\ucd08\uae09 (1-2\uac1c\uc6d4)<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[x] \uae30\ubcf8 \uba85\ub839\uc5b4 (add, commit, push, pull)<\/li>\n\n\n\n<li>[x] \ube0c\ub79c\uce58 \uc0dd\uc131\uacfc \uc774\ub3d9<\/li>\n\n\n\n<li>[x] GitHub \uae30\ubcf8 \uc0ac\uc6a9\ubc95<\/li>\n\n\n\n<li>[x] .gitignore \uc791\uc131<\/li>\n<\/ul>\n\n\n\n<p><strong>\uc911\uae09 (3-6\uac1c\uc6d4)<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[x] merge\uc640 rebase \ucc28\uc774\uc810 \uc774\ud574<\/li>\n\n\n\n<li>[x] \ucda9\ub3cc \ud574\uacb0\ud558\uae30<\/li>\n\n\n\n<li>[x] Pull Request \uc6cc\ud06c\ud50c\ub85c\uc6b0<\/li>\n\n\n\n<li>[x] stash, cherry-pick \ud65c\uc6a9<\/li>\n<\/ul>\n\n\n\n<p><strong>\uace0\uae09 (6\uac1c\uc6d4+)<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[x] interactive rebase\ub85c \ud788\uc2a4\ud1a0\ub9ac \uc815\ub9ac<\/li>\n\n\n\n<li>[x] GitHub Actions\uc73c\ub85c \uc790\ub3d9\ud654<\/li>\n\n\n\n<li>[x] Git hooks \ud65c\uc6a9<\/li>\n\n\n\n<li>[x] \ubcf5\uc7a1\ud55c \ube0c\ub79c\uce58 \uc804\ub7b5 \uc124\uacc4<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ub9e4\uc77c \uc5f0\uc2b5\ud560 \uc218 \uc788\ub294 \uac83\ub4e4<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code># \ub9e4\uc77c \uc544\uce68 \ub8e8\ud2f4\ngit status\ngit pull origin develop\ngit log --oneline -5\n\n# \uc791\uc5c5 \uc911 \uc2b5\uad00\ud654\ud560 \uac83\ub4e4\n1. \uc791\uc740 \ub2e8\uc704\ub85c \uc790\uc8fc \ucee4\ubc0b\n2. \uc758\ubbf8 \uc788\ub294 \ucee4\ubc0b \uba54\uc2dc\uc9c0 \uc791\uc131\n3. \ud478\uc2dc \uc804\uc5d0 \ud55c \ubc88 \ub354 \ud655\uc778\n4. \ub3d9\ub8cc \ucf54\ub4dc \uc801\uadf9\uc801\uc73c\ub85c \ub9ac\ubdf0\ud558\uae30\n\n# \uc8fc\uac04 \uc815\ub9ac\ngit log --since=\"1 week ago\" --oneline\ngit branch -d &lt;merged-branches&gt;  # \uc815\ub9ac<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ub9c8\uc9c0\ub9c9 \uc870\uc5b8<\/h3>\n\n\n\n<p><strong>Git\uc740 \ub3c4\uad6c\uc77c \ubfd0, \ud611\uc5c5\uc774 \ubaa9\uc801\uc785\ub2c8\ub2e4.<\/strong> \uc644\ubcbd\ud55c Git \uc0ac\uc6a9\ubc95\ubcf4\ub2e4\ub294 <strong>\ud300\uc6d0\ub4e4\uacfc \uc6d0\ud65c\ud558\uac8c \uc18c\ud1b5\ud558\uace0 \ud611\uc5c5\ud558\ub294 \uac83<\/strong>\uc774 \ub354 \uc911\uc694\ud574\uc694.<\/p>\n\n\n\n<p>\uc2e4\uc218\ub97c \ub450\ub824\uc6cc\ud558\uc9c0 \ub9c8\uc138\uc694! Git\uc758 \uac00\uc7a5 \ud070 \uc7a5\uc810\uc740 <strong>\uac70\uc758 \ubaa8\ub4e0 \uac83\uc744 \ub418\ub3cc\ub9b4 \uc218 \uc788\ub2e4<\/strong>\ub294 \uac83\uc785\ub2c8\ub2e4. \ub9ce\uc774 \uc2dc\ub3c4\ud574\ubcf4\uace0, \ub9ce\uc774 \uc2e4\uc218\ud574\ubcf4\uba74\uc11c \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc775\uc219\ud574\uc9c8 \uac70\uc608\uc694.<\/p>\n\n\n\n<p>\uadf8\ub9ac\uace0 \ubb34\uc5c7\ubcf4\ub2e4, <strong>\ub3d9\ub8cc\uc5d0\uac8c \ub3c4\uc6c0\uc744 \uc694\uccad\ud558\ub294 \uac83\uc744 \ubd80\ub044\ub7ec\uc6cc\ud558\uc9c0 \ub9c8\uc138\uc694.<\/strong> &#8220;\uc774 \uc0c1\ud669\uc5d0\uc11c \uc5b4\ub5bb\uac8c \ud574\uc57c \ud560\uc9c0 \ubaa8\ub974\uaca0\uc5b4\uc694&#8221;\ub77c\uace0 \ub9d0\ud558\ub294 \uac83\uc774 \ud63c\uc790 \ub059\ub059\ub300\ub294 \uac83\ubcf4\ub2e4 \ud6e8\uc52c \ud6a8\uc728\uc801\uc785\ub2c8\ub2e4! \ud83e\udd1d<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><em>\ub2e4\uc74c\uc5d0\ub294 &#8220;CI\/CD\uc640 \uc790\ub3d9\ud654 \ubc30\ud3ec \uc2e4\uc804 \uac00\uc774\ub4dc&#8221;\ub85c \uac1c\ubc1c \ud504\ub85c\uc138\uc2a4\uc758 \ub9c8\uc9c0\ub9c9 \ud37c\uc990\uc744 \ub9de\ucdb0\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uae30\ub300\ud574 \uc8fc\uc138\uc694!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc548\ub155\ud558\uc138\uc694, \uc131\uc7a5\ud558\ub294 \uac1c\ubc1c\uc790 \uc5ec\ub7ec\ubd84! &#8220;\uac1c\ubc1c\uc740 \ud63c\uc790 \ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub2e4&#8221; \ud83e\udd1d \ucc98\uc74c \ud68c\uc0ac\uc5d0 \uc785\uc0ac\ud588\uc744 \ub54c, \uc800\ub294 Git\uc744 \ub2e8\uc21c\ud788 &#8220;\ucf54\ub4dc \ubc31\uc5c5 \ub3c4\uad6c&#8221; \uc815\ub3c4\ub85c\ub9cc \uc0dd\uac01\ud588\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc2e4\uc81c \ud300 \ud504\ub85c\uc81d\ud2b8\uc5d0 \ucc38\uc5ec\ud558\uba74\uc11c \uae68\ub2ec\uc558\uc8e0. Git\uacfc GitHub\ub294 \ub2e8\uc21c\ud55c \ub3c4\uad6c\uac00 \uc544\ub2c8\ub77c \ud300\uc6cc\ud06c\uc758 \ud575\uc2ec\uc774\ub77c\ub294 \uac83\uc744! \uc624\ub298\uc740 \uc81c\uac00 \uc2e4\ubb34\uc5d0\uc11c \uacaa\uc740 \ub2e4\uc591\ud55c \uc0c1\ud669\ub4e4\uc744 \ud1b5\ud574 \ubc30\uc6b4 Git\uacfc GitHub \ud611\uc5c5\uc758 \ubaa8\ub4e0 \uac83\uc744 \uc815\ub9ac\ud574 \ub4dc\ub9ac\uaca0\uc2b5\ub2c8\ub2e4. \ub354 \uc774\uc0c1 &#8220;merge conflict\uac00 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[45],"tags":[84,85,86,87],"class_list":["post-33","post","type-post","status-publish","format-standard","hentry","category-git","tag-git","tag-github","tag-86","tag-87"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/hed-g.me\/index.php?rest_route=\/wp\/v2\/posts\/33","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hed-g.me\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hed-g.me\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hed-g.me\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hed-g.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=33"}],"version-history":[{"count":2,"href":"https:\/\/hed-g.me\/index.php?rest_route=\/wp\/v2\/posts\/33\/revisions"}],"predecessor-version":[{"id":57,"href":"https:\/\/hed-g.me\/index.php?rest_route=\/wp\/v2\/posts\/33\/revisions\/57"}],"wp:attachment":[{"href":"https:\/\/hed-g.me\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=33"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hed-g.me\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=33"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hed-g.me\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=33"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}