Version Control System(VCS). ์ต์ ์ฝ๋์ ๋ฌธ์ ๊ฐ ์์ด ์ด์ ์ฝ๋๋ก ๋๋ฆฌ๊ฑฐ๋, ํ ๋จ์ ๊ฐ๋ฐ์์ ์ฌ๋ฌ ์์ ์ฌํญ์ ๋ฐ์ํ์ฌ ํ๋์ ๋ฒ์ ์ผ๋ก ๊ด๋ฆฌํ๊ฒ ํด์ฃผ๋ ์์คํ ์ด๋ค.
๐ VCS์ ๊ธฐ๋ฅ
Git - ๋ถ์ฐ ๋ฒ์ ๊ด๋ฆฌ ํด. ์์ค ์ฝ๋์ ๋ณ๊ฒฝ history๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค. ์ฌ๊ธฐ์ version์ ์์ค ์ฝ๋(์ฝ๋ ํ์ผ, server.js ๊ฐ์)์ ๋ฒ์ ์ ๋ปํ๋ค.
Github - git์ ์ฌ์ฉํ๋ ํ๋ก์ ํธ๋ฅผ ์ง์ํ๋ ์นํธ์คํ ์๋น์ค. ๋ก์ปฌ์ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ๋ฅผ ๋ง๋ค ํ์ ์์ด, github๋ก ํ์ํ ์์ค ์ฝ๋๋ง ๋ค์ด ๋ฐ๋๋ค. github๋ ์ค์ ์๋ฒ ์ธ์๋ ์ฝ๋ ๋ฆฌ๋ทฐ, ๋ฌธ์ ์์ฑ ๋ฐ ๊ด๋ฆฌ, ํ๋ก์ ํธ ์ด์ ๋ฑ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
Version database๋ฅผ ๊ด๋ฆฌํ๋ ์๋ฒ. ์ค์์์ ์ ์ฅํ๋์ง, ๋ถ์ฐํด์ ์ ์ฅํ๋์ง์ ๋ค๋ฅด๋ค.
์ค์ ์๋ฒ์ ์์ ๋ ๋ด์ฉ์ ์ฌ๋ ค ํ์๊ณผ ์ ๋ณด๋ฅผ ๊ณต์ ํ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค. ๋ ์ง ๋ฑ ๋ฉํ ์ ๋ณด๋ ๋ชจ๋ ์๋ฒ์์ ๊ด๋ฆฌํ๊ณ , ์ต์ ๋ฒ์ ์ ์ฝ๋๋ค๋ง ์ค์ ์๋ฒ์์ ๋ค์ด๋ก๋ํด ์์ ํ๋ ํ์์ด๋ค.
Central VCS๋ ์๋ฒ๊ฐ ๋ค์ด๋๋ฉด ๋งค์ฐ ํฐ์ผ๋๋ค. Distributed VCS๋ฅผ ์ฐ๊ฒ ๋๋ฉด ๊ฐ ๊ฐ๋ฐ์์ ์ปดํจํฐ๋ ๋ชจ๋ ๋ฉํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ด ์ค์ ์๋ฒ์ ๋ฌธ์ ๊ฐ ์๊ฒจ๋ ๊ฐ๋ฐ์ ์ปดํจํฐ๋ฅผ ํตํด ๋ณต๊ตฌ๊ฐ ๊ฐ๋ฅํ๊ฒ ๋๋ค.
๊ฐ๋จํ๊ฒ ๋งํ๋ฉด ์ ์ฅ์์ด๋ค. ๋ก์ปฌ๊ณผ ์๊ฒฉ์ผ๋ก ๊ตฌ๋ถ๋๋ค. ๋ณดํต ๋ก์ปฌ ๋ฆฌํฌ์์ ์์ ์ ํ๋ค ๋ด ์์ค ์ฝ๋๋ฅผ ๊ณต๊ฐํ ๋ ์๊ฒฉ ๋ฆฌํฌ์ ์ ๋ก๋(push)ํ๊ฒ ๋๋ค
๋ด ์ปดํจํฐ์ ์ ์ฅ๋๋ ๊ฐ์ธ ์ ์ฉ ์ ์ฅ์์ด๋ค. ํผ์์ ์์ ํ๋ ๊ฒฝ์ฐ ์๊ฒฉ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ง ์๋ค. git์ด ๊ด๋ฆฌํ๋ ์ธ ๊ทธ๋ฃจ์ ๋๋ฌด๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
์ฌ๋ฌ ์ฌ๋์ด ๊ณต์ ํ๊ธฐ ์ํ ์ ์ฅ์๋ก, ํด๋ผ์ฐ๋์ ๋น์ทํ ๊ฐ๋ ์ด๋ค. ์๊ฒฉ์ ์ฅ์๋ ์์ค ์ฝ๋๋ฅผ ๋ฐฑ์ ํ๊ณ ๋ค๋ฅธ์ฌ๋๊ณผ ํ์ ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
ํ๋ก์ ํธ๋ฅผ git repository๋ก ๋ง๋ค๊ธฐ ์ํด์ ์ฌ์ฉํ๋ ๋ช ๋ น์ด. ์ฌ๊ธฐ์ ํ๋ก์ ํธ(project)๋ผ ํจ์ ๊ฐ๋ฐํ๊ณ ์ ํ๋ ์์ค์ฝ๋๋ค์ด ์๋ ๋๋ ํ ๋ฆฌ๋ฅผ ๋งํ๋ค. git init์ ํด์ git repo๋ก ๋ง๋ค์ด์ผ git์ผ๋ก ๋ฒ์ ๊ด๋ฆฌ๊ฐ ์์๋๋ค.
/dir $ git init
์๊ฒฉ ์ ์ฅ์๋ฅผ ๋ก์ปฌ ์ ์ฅ์์ ์ ์ฅํ๋ ๋ช ๋ น์ด
โฏ git remote add origin https://github.com/yenilee/first.git
ํ์ฌ ์๊ฒฉ ์ ์ฅ์์ ์ํ๋ฅผ ํ์ธ
โฏ git remote -v
origin https://github.com/wecode-bootcamp-korea/git4.git (fetch)
origin https://github.com/wecode-bootcamp-korea/git4.git (push)
๋ค๋ฅธ ์ฌ๋๋ค์ด ์ถ๊ฐํ ์ฝ๋๊ฐ ๋ฐ์๋ ๊ฐ์ฅ ์ต์ ๋ฒ์ ์ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ (= git fetch + git merged). fetch๋ ํ๋ก์ ํธ์ ๋ฉํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด๊ณ , pull์ ํด์ผ ์ต์ ์ผ๋ก ์ ๋ฐ์ดํธ ๋ ์ฝ๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
์ํ๋ branch๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด์๋ branch name์ ์ง์ ํด์ ์ฃผ์ด์ผ ํ๋ค.
#master branch pull ํด์ค๊ธฐ
git pull origin master
remote repo์์ local repo๋ก ์์ค ์ฝ๋๋ฅผ ๋ณต์ฌํด์ ๊ฐ์ ธ์ค๋ ๊ฒ. ๊ฐ์ด ์์ ํด์ ํฉ์น๋ ๊ธฐ๋ฅ๋ณด๋ค๋ ์ฝ๋๋ฅผ ๋ณต์ฌํ๋ ์ฉ๋์ ๊ฐ๊น์ด ๊ฒ ๊ฐ๋ค. github์ url์ ํตํด ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
git clone (github์์ ๋ณต์ฌํ ์๊ฒฉ ์ ์ฅ์์ ๋งํฌ)
remote repo์์ github ๊ณ์ ์ผ๋ก ์์ค ์ฝ๋๋ฅผ ๋ณต์ฌํ๋ ๊ฒ
๋ฒ์ ๊ด๋ฆฌ๋ฅผ ํ ๋, git์ ๋ฐ๋ ๋ถ๋ถ๋ง(diff) ์ ์ฅํ๋๊ฒ ์๋๋ผ ํ์ผ์ ์ค๋ ์ท(snapshot)์ ์๊ฐ์์ผ๋ก ์ ์ฅํ๋ค. ๊ทธ๋์ ํ์ฌ์ ์ค๋ ์ท๊ณผ ์ด์ ์ค๋ ์ท์ ๋น๊ตํ๋ฉฐ ๋ณ๊ฒฝ ์ฌํญ์ ๋ณด๋ ๊ฒ์ด๋ค. ๊ฐ๋ฐ์๊ฐ ์ค์ ์๋ฒ์์ ๋ฆฌํฌ๋ฅผ ์ฒดํฌ์์ํ๋ฉด ํด๋น ๋ฆฌํฌ์ ํน์ ํ ์์ ์ ์ค๋ ์ท์ ๋ฐ๊ฒ๋๋ค.
๐ branch์์ ์ผ์ด๋๋ ์ผ๋ค์ ๋ฏธ๋ฆฌ ์์ฝํด๋ณด๋ฉด
git branch feature/yeni # ๋ง๋ค๊ธฐ๋ง ํ๊ณ ์ด๋ํ์ง ์์
git checkout -b newfeature # ์๋ก ๋ง๋ ๋ค์ ๋ฐ๋ก ์ด๋
git checkout master
git checkout feature/yeni
๋ด๊ฐ ์ด๋ค ๋ธ๋์น์ ์๋์ง ํ์ธํ๋ ๊ฒ. master branch์์ ์์ ํ๋ฉด ์ ๋๊ณ branch์์ ์์ ํ ๋ค์ Mergeํ๋ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ค.
git branch -v
git branch -d new_feature
์ฝ๋๊ฐ ์์ ๋์์ง๋ง ์์ง ์ ์ฅ๋์ง(commited) ์์ ์ํ๋ฅผ ๋งํ๋ค. ์ฝ๋๋ฅผ ์์ ํ๊ณ ์ํ๋ฅผ ํ์ธํ๋ฉด modified: ์์ ๋ ํ์ผ
์ด๋ผ๊ณ ๋ถ์ ๊ธ์จ๊ฐ ๋ฌ๋ค. ๋ณ๊ฒฝ ์ฌํญ์ด stage๋์ง ์์๋ค๊ณ ๋์จ๋ค.
โฏ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: README.md
์ ์ํ์์ staged ๋๋ฉด modified ํ์ผ์ ๊ธ์จ๊ฐ ์ด๋ก์์ผ๋ก ๋ณํ๊ณ , ๋ด๊ฐ ์์ ํ ๊ฒ์ด commit ๋ ๊ฒ์ด๋ผ๊ณ mark
ํ ์ํ๋ก๋ณํ๋ค.
โฏ git add README.md
โฏ git status
On branch feature/yeni
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: README.md
์์ ํ ํ์ผ์ staged ์ํ๋ก ์ฎ๊ธฐ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ ๋ช ๋ น์ด. ๋ git repo์ ์๋ก์ด ์ถ๊ฐ๋ ํ์ผ๋ค์ staged ์ํ๋ก ์ฎ๊ธธ๋๋ ์ฌ์ฉ๋๋ค. ์๋ก์ด ์ถ๊ฐ๋ ํ์ผ๋ค์ "untracked" ํ์ผ ์ด๋ผ๊ณ ํ๋๋ฐ, git์์๋ ์ด๋ค๋ ์์ ์ฌํญ์ผ๋ก ๋ณธ๋ค.
$ git add newfile # newfile์ index์ ๋ฑ๋กํ๊ธฐ
$ git add . # ๋ชจ๋ ํ์ผ์ index์ ๋ฑ๋กํ๊ธฐ
unstage ํด์ ๋ค์ ์์ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ๋ช ๋ น์ด. ๊ณ์ ๋งํ์ง๋ง commit ํ๋ฉด ๋๋๋ฆฌ๋๊ฒ ๋ฒ๊ฑฐ๋กญ๊ธฐ ๋๋ฌธ์ ํ์ ์ด ์๋๋ผ๋ฉด stage - unstage ํ๋ฉด์ ๊ณ์ ์์ ํด์ผ ํ๋ค!
์์ ์ฌํญ๋ค์ด ๋ฉ์์ง์ ํจ๊ป local git์ ์ ์ฅ๋ ์ํ. commitํ๊ฒ ๋๋ฉด ํ์คํ ๋ฆฌ์ ๋จ๊ณ , ์ถ๊ฐ ์์ ์ฌํญ์ด ์์ ๋ ๋๋๋ฆฌ๋๊ฒ ๊น๋ค๋ก์ธ ์ ์์ด(๋ก๊ทธ๋ฅผ ํ์ธํด์ ์๊ฐ ์ฌํ์ ํด์ผ ํ๋...) staged ๋จ๊ณ๊ฐ ํ์ํ ๊ฒ์ด๋ค.
โฏ git commit -m "problem solved"
[feature/yeni a17c25c] problem solved
์์ ์ฌํญ์ local์ ๋ฉ์์ง์ ํจ๊ป ์ ์ฅํ๋ค. remote repo์ ์๋ ๋ง์คํฐ์ mergeํ๊ธฐ ์ ์ํ.
mergeํ๊ธฐ ์ํด branch๋ฅผ remote repo์ ๋ฑ๋กํ ์ํ. github์ ๊ฐ๋ณด๋ฉด ๋์ branch์์ ์ ์ฅ๋ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ธํ ์ ์๊ณ , master์ ์ ์ฉ์ํค๊ธฐ ์ํด์๋ pull request๋ฅผ ํด์ผ ํ๋ค.
โฏ git push origin feature/yeni
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 281 bytes | 281.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/wecode-bootcamp-korea/git4.git
90d9e7c..119bb30 feature/yeni -> feature/yeni
์ git push origin feature/yeni ์์ origin์ remote์์ ์ค์ ํ ์ ์ฅ์๋ก ์ด๋ํ๊ฒ ํ๋ค. feature๋ ๋ณดํต master์์ branch๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉํ๋ ์ด๋ฆ์ด๋ค.
ํ์ ์๋ผ๋ฆฌ ๊ฐ์ ์ฝ๋๋ฅผ ๋ค๋ฅด๊ฒ ๊ณ ์ณค์ ๊ฒฝ์ฐ ๋ฐ์ํ๋ค. ์ Merge ํ pull-request๋ฅผ ํ๊ฒ ๋๋ฉด, ํฉ์ณค์ ๋ conflict๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ์ฌ์ ์ ์ ์ ์์ด ์ด๋ค ์ฝ๋๋ฅผ ๋จ๊ธธ์ง ์ ํ๊ณ ๋จ๊ธธ ์ฝ๋๋ฅผ ์ ํด commitํ๋ฉด ๋๋ค.
๋ง์ฝ ๋ด๊ฐ ์ฌ๋ฆฐ pull request๊ฐ conflict ๋๋ ์ํฉ์ด๋ฉด, branch๋ฅผ pullํ๋ ค๊ณ ํ์ ๋ ์๋์ ๊ฐ์ด merge๊ฐ failํ๋ค๊ณ ๋ฌ๋ค.
โฏ git checkout feature/yeni
โฏ git pull origin master
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (1/1), done.
From https://github.com/wecode-bootcamp-korea/git4
* branch master -> FETCH_HEAD
6dc29c7..bf5008d master -> origin/master
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.