๐ English โ Espaรฑol โ ะ ัััะบะธะน โ ็ฎไฝไธญๆโ ํ๊ตญ์ด โ Tiแบฟng Viแปt โ Franรงais
๋ญ๊ฐ ์๋ชป ๋์ ๋ ๋ญ ํด์ผํ ์ง์ ๋ํ ์ฐ์ฃผ๋นํ์ฌ๋ฅผ ์ํ ๊ฐ์ด๋ (์ฌ๊ธฐ์ ๊น์ ์ฐ๋ ๊ฐ๋ฐ์๋ฅผ ์ํ)
Flight Rules ๋ ์ด๋ค ๋ฌธ์ X๊ฐ ๋ฐ์ํ ์ด์ ์ ๊ทธ ๋จ๊ณ์ ๋งค๋ด์ผ์์ ์ด๋ ต์ฌ๋ฆฌ ์ป์ ์ง์์ด์์. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ ์๋๋ฆฌ์ค์ ๋งค์ฐ ์์ธํ๊ณ ๊ตฌ์ฒด์ ์ธ ์ด์ ์ ์ฐจ๋๋๋ค. [...]
NASA๋ ์์ฑ(Mercury) ์๋ ๋ ์ง์ํ์์ ์ฒ์์ผ๋ก "lessons learned" ์ด๋ ๊ฒ์ ๋ชจ์๋๋ฐ ์์ฒ๊ฐ์ ๋ฌธ์ ์ ์ํฉ๋ค, ๋ถ์์ง ํด์น ์์ก์ด๋ก ์ธํ ์์ง ๊ณ ์ฅ๋ถํฐ ์ปดํจํฐ ๋ฌธ์ ๊ทธ๋ฆฌ๊ณ ๊ทธ ํด๋ต๊น์ง, 1960๋ ๋ ์ด๋ถํฐ ์ฐ๋ฆฌ์ ์ค์๋ค, ์ฌ์๋ค, ํด๊ฒฐ์ฑ ๋ฑ์ด ๋ชฉ๋กํ ๋ผ์์ด์.
โ Chris Hadfield, ์ธ์์ ์ํ ์ฐ์ฃผ๋นํ์ฌ์ ๊ฐ์ด๋.
๋ช ํํ๊ฒ ํ๊ธฐ ์ํด ์ด ๋ฌธ์์ ๋ชจ๋ ์์ ๋ ํ์ฌ ๋ธ๋์น๋ฅผ ํ์ํ๊ณ ์คํ ์ด์ง์ ๋ณ๊ฒฝ์ด ์๋์ง๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ์ปค์คํ ๋ ๋ฐฐ์ ํ๋กฌํํธ๋ฅผ ์จ์. ๋ธ๋์น๋ ๊ดํธ ์์ ์๊ณ , ๋ธ๋์น ๋ค์์ *๋ ์คํ ์ด์ง์ ๋ณ๊ฒฝ๋ ๊ฒ์ ๋ํ๋ด์.
Table of Contents generated with DocToc
- ๋ ํ์งํ ๋ฆฌ
- ์ปค๋ฐ ์์
- ๋ด๊ฐ ๋ฐฉ๊ธ ์ด๋ค ์ปค๋ฐ์ ๋จ๊ฒผ์ง?
- ์ปค๋ฐ ๋ฉ์ธ์ง๋ฅผ ์๋ชป ์ผ์ด
- ์ปค๋ฐ์ ๋ค๋ฅธ ์ด๋ฆ๊ณผ ์ด๋ฉ์ผ ์ค์ ์ผ๋ก ํด๋ฒ๋ ธ์ด
- ์ง๋ ์ปค๋ฐ์์ ํ์ผ ํ๋๋ฅผ ์ง์ฐ๊ณ ์ถ์ด
- ๋ง์ง๋ง ์ปค๋ฐ์ ์ง์ฐ๊ณ ์ถ์ด
- ์์์ ์ธ ์ปค๋ฐ ์ง์ฐ๊ธฐ
- ์์ ๋ ์ปค๋ฐ์ ํธ์ํ๋๋ฐ, ์๋ฌ ๋ฉ์ธ์ง๊ฐ ๋
- ํ๋ ๋ฆฌ์ ์ ํด๋ฒ๋ ธ๋๋ฐ ๋๋๋ฆฌ๊ณ ์ถ์ด
- ๋จธ์ง๋ฅผ ์ค์๋ก ์ปค๋ฐ, ํธ์ํด๋ฒ๋ ธ์ด
- ์คํ
์ด์ง
- ์ง๋ ์ปค๋ฐ์ ์คํ ์ด์ง ๋ณ๊ฒฝ์ ์ ์ถ๊ฐํ๊ณ ์ถ์ด
- ์ ์ฒด๊ฐ ์๋ ์ ํ์ผ๋ง ์คํ ์ด์ง์ ์ฌ๋ฆฌ๊ณ ์ถ์ด
- ํ๋์ ํ์ผ ๋ณ๊ฒฝ์ ์ ๋๊ฐ์ ๋ค๋ฅธ ์ปค๋ฐ์ ๋จ๊ธฐ๊ณ ์ถ์ด
- ์์ง ์คํ ์ด์ง์ ์ ์ฌ๋ผ๊ฐ ๋ณ๊ฒฝ์ ์ ์คํ ์ด์ง์ ์ถ๊ฐํ๊ณ , ์คํ ์ด์ง์ ์๋ ๋ณ๊ฒฝ์ ์ ๋ค์ ๋นผ๊ณ ์ถ์ด
- ์คํ
์ด์ง ์ ์ ๋ณ๊ฒฝ์
- ์คํ ์ด์ง ์ ์ ๋ณ๊ฒฝ์ ์ ์ ๋ธ๋์น๋ก ์ฎ๊ธฐ๊ณ ์ถ์ด
- ์คํ ์ด์ง์ ๋ณ๊ฒฝ์ ์ ๋ง๋ค์ด๋ ๋ค๋ฅธ ๋ธ๋์น๋ก ์ฎ๊ธฐ๊ณ ์ถ์ด
- ๋ด ๋ก์ปฌ์ ์๋ ์ปค๋ฐ ์๋ ๋ณ๊ฒฝ์ ์ ๋ค ๋ฌด์ํ๊ณ ์ถ์ด (์คํ ์ด์ง ๋๋ ์๋๋)
- ์คํ ์ด์ง ์๋ ํน์ ๋ณ๊ฒฝ์ ์ ์ง์ฐ๊ณ ์ถ์ด
- ์คํ ์ด์ง ์๋ ํน์ ํ์ผ์ ์ง์ฐ๊ณ ์ถ์ด
- ๋ก์ปฌ์ ์๋ ์คํ ์ด์ง ์๋ ๋ณ๊ฒฝ์ ๋ง ์ง์ฐ๊ณ ์ถ์ด
- ํธ๋ํน ์๋ ํ์ผ๋ค ๋ค ์ง์ฐ๊ณ ์ถ์ด
- ๋ธ๋์น
- ๋ชจ๋ ๋ธ๋์น ๋ฆฌ์คํธ๋ฅผ ๋ณด๊ณ ์ถ์ด
- ์ปค๋ฐ์์ ๋ธ๋์น ๋ง๋ค๊ธฐ
- ๋ค๋ฅธ ๋ธ๋์น์์ ํ์ ๋ฐ์์๋ฒ๋ ธ์ด
- ๋ก์ปฌ์ ์ปค๋ฐ์ ์ง์์ ์๋ฒ์ ์๋ ๋ด ๋ธ๋์น์ ๋ง์ถ๊ณ ์ถ์ด
- ์ ๋ธ๋์น ๋์ ์ ๋ง์คํฐ์ ์ปค๋ฐ์ ํด๋ฒ๋ ธ์ด
- ๋ค๋ฅธ ๋ ํผ๋ฐ์ค ๊ฐ์ ๊ณณ์์ ๋ชจ๋ ํ์ผ์ ์ ์งํ๊ณ ์ถ์ด
- ํ ๋ธ๋์น์ ๋ค๋ฅธ ๋ธ๋์น์ ๋จ๊ฒผ์ด์ผ ํ๋ ์ปค๋ฐ์ ์ฌ๋ฌ๊ฐ ๋จ๊ฒผ์ด
- ์ ์คํธ๋ฆผ์์ ์ง์์ง ๋ก์ปฌ ๋ธ๋์น๋ฅผ ์ง์ฐ๊ณ ์ถ์ด
- ๋ธ๋์น๋ฅผ ์ง์๋ฒ๋ ธ์ด
- ๋ธ๋์น๋ฅผ ์ง์ฐ๊ณ ์ถ์ด
- ์ฌ๋ฌ๊ฐ์ ๋ธ๋์น๋ฅผ ์ง์ฐ๊ณ ์ถ์ด
- ๋ธ๋์น ์ด๋ฆ์ ๋ฐ๊พธ๊ณ ์ถ์ด
- ๋ค๋ฅธ ์ฌ๋์ด ์์ ์ค์ธ ๋ฆฌ๋ชจํธ ๋ธ๋์น๋ก ์ฒดํฌ์์ ํ๊ณ ์ถ์ด
- ํ์ฌ ๋ก์ปฌ ๋ธ๋์น๋ก ์๋ก์ด ๋ฆฌ๋ชจํธ ๋ธ๋์น๋ฅผ ๋ง๋ค๊ณ ์ถ์ด
- ๋ฆฌ๋ชจํธ ๋ธ๋์น๋ฅผ ๋ก์ปฌ ๋ธ๋์น๋ฅผ ์ํ ์ ์คํธ๋ฆผ์ผ๋ก ์ค์ ํ๊ณ ์ถ์ด
- HEAD๋ฅผ ๊ธฐ๋ณธ ๋ฆฌ๋ชจํธ ๋ธ๋์น๋ก ํธ๋ํนํ๋๋ก ์ค์ ํ๊ณ ์ถ์ด
- ๋ค๋ฅธ ๋ธ๋์น์ ๋ณ๊ฒฝ์ ์ ์๋ชป ๋จ๊ฒผ์ด
- ๋ฆฌ๋ฒ ์ด์ค์ ๋จธ์ง
- ์คํ ์ด์
- ์ฐพ์๋ณด๊ธฐ
- ์๋ธ๋ชจ๋
- ๊ธฐํ ํญ๋ชฉ๋ค
- ํ์ผ ์ถ์ ํ๊ธฐ
- ํ์ผ ๋ด์ฉ์ ๋ณ๊ฒฝ์ด ์์ด ํ์ผ ์ด๋ฆ์ ์๊ธ์๋ง ๋๋ฌธ์๋ก ๋ฐ๊พธ๊ณ ์ถ์ด
- ๊น ํ ๋ฐ์๋ ๋ก์ปฌ ํ์ผ์ ๋ฎ์ด์์ฐ๊ณ ์ถ์ด
- ํ์ผ์ ๋ก์ปฌ์๋ ๋ณด๊ดํ๊ณ ๊น์์ ์ง์ฐ๊ณ ์ถ์ด
- ํน์ ํ ๋ฒ์ ๋๋ก ํ์ผ์ ๋ณต๊ตฌํ๊ณ ์ถ์ด
- ์ปค๋ฐ๊ณผ ๋ธ๋์น ๊ฐ์ ํน์ ํ์ผ ๋ณ๊ฒฝ ์ด๋ ฅ์ด ํ์ํด
- ์ค์
- ๊น ๋ช ๋ น์ด ๋ช ๊ฐ๋ฅผ ์จ๋ฆฌ์ด์ค ๋ฑ๋กํ๊ณ ์ถ์ด
- ๋ ํ์งํ ๋ฆฌ์ ๋น ๋๋ ํ ๋ฆฌ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ด
- ๋ ํ์งํ ๋ฆฌ ์ ์ ๋ช ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์บ์ํด๋๊ณ ์ถ์ด
- ๊น์ด ๊ถํ๊ณผ ํ์ผ๋ชจ๋ ๋ณ๊ฒฝ์ ๋ฌด์ํ๊ฒ ๋ง๋ค๊ณ ์ถ์ด
- ๊ธ๋ก๋ฒ ์ ์ ๋ก ์ค์ ํด๋๊ณ ์ถ์ด
- ๊น์ ๋ช ๋ น์ด ์์์ ๋ฃ๊ณ ์ถ์ด
- ๋ญ ์๋ชปํ๋์ง ๋ชจ๋ฅด๊ฒ ์ด
- ๋ค๋ฅธ ๋ฆฌ์์ค
์ด๋ฏธ ์กด์ฌํ๋ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ๋ฅผ ๊น ๋ ํ์งํ ๋ฆฌ๋ก ์ต์ ํํด ์ฐ๋ ค๋ฉด:
(my-folder) $ git init
๋ฆฌ๋ชจํธ ๋ ํ์งํ ๋ฆฌ๋ฅผ ํด๋ก ํ๋ ค๋ฉด, ๋ ํ์งํ ๋ฆฌ URL์ ๋ณต์ฌํด์์ ์คํํด์.
$ git clone [url]
ํด๋ ์ด๋ฆ์ด ๋ฆฌ๋ชจํธ ๋ ํ์งํ ๋ฆฌ ์ด๋ฆ๊ณผ ๊ฐ์ด ์ ์ฅ๋ ๊ฑฐ์์.
๋ณต์ ํ ๋ฆฌ๋ชจํธ ์๋ฒ์ ์ฐ๊ฒฐ์ ํ์ธํ์ธ์.(๋๋ถ๋ถ ์ธํฐ๋ท ์ฐ๊ฒฐ์ ํ์ธํ๋ ๋ป์ด์์)
๋ค๋ฅธ ๋ ํ์งํ ๋ฆฌ ์ด๋ฆ์ผ๋ก ๋ณต์ ๋ฅผ ํด์ค๊ณ ์ถ๋ค๋ฉด
$ git clone [url] name-of-new-folder
git commit -a
๋ก ๋ง ์ปค๋ฐ์ ๋จ๊ธฐ๊ณ ๋ด๊ฐ ๋ญ๋ผ๊ณ ์์ ์ ์๋๋ผ? ํ๋ค๊ณ ํ๊ณ . ์ต๊ทผ์ ์ปค๋ฐ์ ํ์ฌ HEAD์์ ๋ณผ ์ ์์ด์.
(master)$ git show
๋๋
$ git log -n1 -p
๋ง์ฝ ํน์ ์ปค๋ฐ์ ํ์ผ์ ๋ณด๊ณ ์ถ๋ค๋ฉด, ์ด๋ ๊ฒ ํ ์๋ ์์ด์. (commitID๋ ๋ฐ๋ก ๋น์ ์ด ๊ด์ฌ์๋ ๊ทธ commit์ด์์)
$ git show <commitid>:filename
๋ง์ฝ ๋ฉ์์ง๋ฅผ ์๋ชป ์ผ๊ณ ์์ง ํธ์๋ฅผ ์ํ๋ค๋ฉด, ์ปค๋ฐ ๋ฉ์์ง ๋ฐ๊พธ๊ธฐ๋ฅผ ๋ฐ๋ผํด ๋ณผ ์ ์์ด์.
$ git commit --amend --only
์ด ๋ฐฉ๋ฒ์ ํธ์ง ๊ฐ๋ฅํ ๊ธฐ๋ณธ ํ ์คํธ ์๋ํฐ๊ฐ ์ด๋ฆดํ ๋ฐ์, ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ํ์ค์ ์ธ ์๋ ์์ด์.
$ git commit --amend --only -m 'xxxxxxx'
๋ง์ฝ ํธ์๋ฅผ ์ด๋ฏธ ํ๋ค๋ฉด, ์ปค๋ฐ์ ์์ ํด์ ๊ฐ์ ํธ์๋ฅผ ํ ์ ์๊ธดํ๋ ๋ณ๋ก ์ถ์ฒํ์ง ์์์.
ํ๋์ ์ปค๋ฐ์ด๋ผ๋ฉด ์ด๋ ๊ฒ ์์ ํด์.
$ git commit --amend --no-edit --author "New Authorname <[email protected]>"
๋์์ผ๋ก๋ git config --global author.(name|email)
์์ ์ค์ ์ ๋ค์ ๋ง์ถ ๋ค์
$ git commit --amend --reset-author --no-edit
๋ง์ฝ ์ ์ฒด ์ด๋ ฅ ๋ณ๊ฒฝ์ด ํ์ํ๋ค๋ฉด, git filter-branch
์ ์ค๋ช
ํ์ด์ง๋ฅผ ๋ด์.
์ง๋ ์ปค๋ฐ์์ ํ์ผ ๋ณ๊ฒฝ๋ด์ญ์ ์ง์ฐ๋ ค๋ฉด, ์ด๋ ๊ฒ ํด๋ด์:
$ git checkout HEAD^ myfile
$ git add myfile
$ git commit --amend --no-edit
๊ทธ ํ์ผ์ด ์๋กญ๊ฒ ์ปค๋ฐ์ผ๋ก ์ถ๊ฐ๋๊ณ ๊ทธ ํ์ผ๋ง ์ง์ฐ๊ณ (git ์์๋ง) ์ถ์ ๊ฒฝ์ฐ์,
$ git rm --cached myfile
$ git commit --amend --no-edit
์ด ๋ฐฉ๋ฒ์ ์ด๋ฆฐ ํจ์น๊ฐ ์๊ณ ๋ถํ์ํ ํ์ผ์ ์ปค๋ฐ ํ๊ฑฐ๋ ๋ฆฌ๋ชจํธ์ ๊ฐ์ ํธ์๋ก ํจ์น๋ฅผ ์
๋ฐ์ดํธ ํด์ผํ ๋ ํนํ ์ ์ฉํด์. --no-edit
์ต์
์ ๊ธฐ์กด ์ปค๋ฐ ๋ฉ์ธ์ง๋ฅผ ์ ์งํ๋๋ฐ ์ฌ์ฉ๋ผ์.
ํธ์๋ ์ปค๋ฐ์ ์ง์ฐ๊ณ ์ถ๋ค๋ฉด ์ด๊ฑธ ๋ฐ๋ผํ๋ฉด ๋๋๋ฐ, ์ด๋ ฅ์ ๋์ดํฌ ์ ์๊ฒ ๋๊ณ ๋ ํ์งํ ๋ฆฌ์์ ์ด๋ฏธ ํ์ ๋ฐ์๊ฐ ๋ค๋ฅธ ์ฌ๋์ ์ด๋ ฅ๋ ์๋ง์ด ๋์. ๊ฐ๋จํ ๋งํ์๋ฉด, ์ ๋ชจ๋ฅด๊ฒ ์ผ๋ฉด ์ ๋ ํ์ง๋ง์.
$ git reset HEAD^ --hard
$ git push --force-with-lease [remote] [branch]
์์ง ํธ์ ์ํ์ผ๋ฉด, ๋ฆฌ์ ์ผ๋ก ๋ง์ง๋ง ์ปค๋ฐ ์ ์ํ๋ก ๋์๊ฐ์. (๋ณ๊ฒฝ์ ์ ์คํ ์ด์ง์ ๋๊ณ ์)
(my-branch*)$ git reset --soft HEAD@{1}
์ด ๋ฐฉ๋ฒ์ ํธ์๋ฅผ ์ ํ์ ๋๋ง ๋์ํด์. ํธ์๋ฅผ ํ์ผ๋ฉด, ์์ ํ ๋ฐฉ๋ฒ์ git revert SHAofBadCommit
ํ๊ฐ์ง ๋ฐ์ด์์.
์ด ๋ฐฉ๋ฒ์ ๋ชจ๋ ์ง๋ ์ปค๋ฐ ๋ณ๊ฒฝ์ ์ผ๋ก ๋๋์๊ฐ ์ ์ปค๋ฐ์ ๋ง๋ค ๊ฑฐ์์. ๋๋, ๋ง์ฝ ํธ์ํ ๋ธ๋์น๊ฐ ๋ฆฌ๋ฒ ์ด์ค์ ์์ ํ๋ค๋ฉด (๋ง์ฝ ๋ค๋ฅธ ์ฌ๋์ด ํ ๋ฐ์ง ์๋๋ค๋ฉด), git push --force-with-lease
๋ช
๋ น์ด๋ฅผ ์ธ์ ์์ด์.
๋ ์๊ณ ์ถ๋ค๋ฉด, ์ด ์น์
์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
์ด์ ๊ณผ ๋์ผํ ๊ฒฝ๊ณ ์์. ๊ฐ๋ฅํ ์ด ๋ฐฉ๋ฒ์ ์ฐ์ง ๋ง์ธ์.
$ git rebase --onto SHA1_OF_BAD_COMMIT^ SHA1_OF_BAD_COMMIT
$ git push --force-with-lease [remote] [branch]
์๋๋ฉด ๋ํํ ๋ฆฌ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ณ ์ง์ฐ๊ณ ์ถ์ ์ปค๋ฐ ๋ผ์ธ์ ์ง์๋ ๋ผ์.
To https://github.com/yourusername/repo.git
! [rejected] mybranch -> mybranch (non-fast-forward)
error: failed to push some refs to 'https://github.com/tanay1337/webmaker.org.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
์์๋์ธ์, ๋ฆฌ๋ฒ ์ด์ค(์๋๋ฅผ ๋ณด์ธ์)๋ ์ด๋ฉ๋๋ ๊ธฐ์กด ์ปค๋ฐ์ ์๊ฑธ๋ก ๋ฐ๊ฟ์, ๊ทธ๋์ ์ด๋ฏธ ๋จผ์ ์์ ๋ ์ปค๋ฐ์ด ํธ์๋๋ค๋ฉด ๊ฐ์ ํธ์๋ฅผ ํด์ผ ํด์. ์ด ๋ฐฉ๋ฒ์ ์ธ๋ ์กฐ์ฌํ์ธ์; ํญ์ ์์ ๋๋ ๋ธ๋์น๊ฐ ๋ง๋ ํ์ธํด์!
(my-branch)$ git push origin mybranch --force-with-lease
์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ ํธ์๋ฅผ ์ฐ์ง ๋ง์ธ์.
์ ์ปค๋ฐ์ ๋ง๋ค์ด์ ํธ์ํ๋๊ฒ ์์ ๋ ์ปค๋ฐ์ ๊ฐ์ ๋ก ํธ์ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋์์. ๊ทธ๋ฐ ์์ ๋ ์ปค๋ฐ์ ๊ทธ ๋ธ๋์น๋ ๋ค๋ฅธ ์์ ๋ธ๋์น๋ฅผ ์ฐ๋ ๋ค๋ฅธ ๊ฐ๋ฐ์์ ์์ค ์ด๋ ฅ๊ณผ ์ถฉ๋์ ์์ธ์ด ๋ ๊ฑฐ์์.
--force-with-lease
๋ ์ฌ์ ํ ์คํจํ ํ
๋ฐ, ๋๊ตฐ๊ฐ๊ฐ ๊ฐ์ ๋ธ๋์น๋ฅผ ์ด๋ค๋ฉด ๋ณ๊ฒฝ์ ์ ๋ฎ์ด์ฐ๋ ํธ์๋ฅผ ํ ์๋ ์์ด์.
์ ๋๋ก ์๋ฌด๋ ๊ฐ์ ๋ธ๋์น๋ฅผ ์ ์ฐ๊ฑฐ๋, ์ ๋๋ก ๋ธ๋์น์ ์
๋ฐ์ดํธ๋ฅผ ํด์ผํ ๋ --force
(-f
) ์ต์
์ ์ธ ์ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ํผํ๋๊ฒ ์ข์์.
๋ง์ฝ ํ๋ ๋ฆฌ์ ์ ํ๋ค๊ณ ํด๋ ์ปค๋ฐ์ ๋๋ฆด ์ ์์ด์. ๊น์ ๋ฉฐ์น ๊ฐ์ ๋ก๊ทธ๋ฅผ ๊ฐ์ง๊ณ ์๊ฑฐ๋ ์.
์์๋๊ธฐ : ์ด๊ฑด ์ปค๋ฐ์ ๋จ๊ฒผ๊ฑฐ๋ ์คํ
์ด์๊ฐ์ด ๋ฐฑ์
์ ํ์ ๋๋ง ์ ํจํด์. git reset --hard
์ ์ปค๋ฐ๋์ง ์์ ์์ ์ฌํญ์ ๋ค ์ง์ธ ๊ฑฐ์์, ๊ทธ๋ฌ๋ ์กฐ์ฌํด์ ์จ์ผํด์. (์์ ํ ๋ฐฉ๋ฒ์ผ๋ก git reset --keep
์ด ์์ด์)
(master)$ git reflog
์ง๋ ์ปค๋ฐ๊ณผ ๋ฆฌ์ ์ ์ํ ์ปค๋ฐ์ ๋ณผ ์ ์์ ๊ฑฐ์์. ๋์๊ฐ๊ณ ์ถ์ ์ปค๋ฐ์ SHA ์ฝ๋๋ฅผ ๊ณจ๋ผ์, ๋ฆฌ์ ์ ํด์:
(master)$ git reset --hard SHA1234
๊ณ์ ํ ์ ์์๊ฑฐ์์.
๋ง์ฝ ์ค์๋ก ๋จธ์งํ ์ค๋น๊ฐ ์๋ ํผ์ณ ๋ธ๋์น๋ฅผ ๋ฉ์ธ ๋ธ๋์น์ ๋จธ์งํ์ด๋ ๋๋๋ฆด ์ ์์ด์. ํ์ง๋ง ๋ฌธ์ ๋ ์์ด์: ๋จธ์ง ์ปค๋ฐ์ ํ๊ฐ ์ด์์ ๋ถ๋ชจ(๋ณดํต์ ๋ ๊ฐ)๋ฅผ ๊ฐ์ง๊ฒ ๋ผ์.
์ฌ์ฉํ๋ ค๋ฉด
(feature-branch)$ git revert -m 1 <commit>
์ฌ๊ธฐ์ -m 1 ์ต์ ์ ๋ถ๋ชจ ๋ฒํธ 1(๋จธ์ง๊ฐ ๋ง๋ค์ด์ง ๋ธ๋์น)์ ๋๋๋ฆด ์์ ํญ๋ชฉ์ผ๋ก ์ ํํ๋ผ๊ณ ํด์.
์์๋๊ธฐ : ๋ถ๋ชจ ๋ฒํธ๋ ์ปค๋ฐ ์๋ณ์๊ฐ ์๋๊ณ , ์คํ๋ ค ๋จธ์ง๋ ์ปค๋ฐ์ด Merge: 8e2ce2d 86ac2e7
์ด๋ผ๋ ๋ผ์ธ์ ๊ฐ์ง๊ณ ์์ด์.
๋ถ๋ชจ ๋ฒํธ๋ ์ด ๋ผ์ธ์์ ์ํ๋ ๋ถ๋ชจ์ 1 ๊ธฐ๋ฐ ์ธ๋ฑ์ค์ด๊ณ , ์ฒซ๋ฒ์งธ ์๋ณ์๋ 1, ๋ค์์ 2 ์ด๋ ๊ฒ ์ด์ด์ ธ์.
(my-branch*)$ git commit --amend
๋ณดํต์ ๋ถ๋ถ์ ์ผ๋ก ํ์ผ์ ์คํ ์ด์งํ๋ ค๋ฉด ์ด๋ ๊ฒ ํด์:
$ git add --patch filename.x
-p
๋ ์ถ์ฝ๋ ์ต์
์ด์์. ์ด ๋ฐฉ์์ ๋ํํ ๋ชจ๋๋ฅผ ์ดํ
๋ฐ์. s
์ต์
์ ์ฐ๋ฉด ์ปค๋ฐ์ ๋๋ ์ ์์ด์. ํ์ง๋ง ์ ํ์ผ์ด๋ผ๋ฉด ๊ทธ๋ฐ ์ต์
์ด ์์๊ฑฐ์์. ์ ํ์ผ์ ์ถ๊ฐํ๋ ค๋ฉด:
$ git add -N filename.x
๊ทธ ๋ค์ ์์์ ์ผ๋ก ๋ผ์ธ๋ค์ ๊ณจ๋ผ ์ถ๊ฐํด์ฃผ๋ ค๋ฉด e
์ต์
์ด ํ์ํ ๊ฑฐ์์. git diff --cached
๋ git diff --staged
๋ ๋ก์ปฌ์ ์ ์ฅ๋ ๋ถ๋ถ๊ณผ ์คํ
์ด์ง์ ์๋ ๋ผ์ธ๋ค์ ๋น๊ตํด์ ๋ณด์ฌ์ค ๊ฑฐ์์.
git add
๋ ์ ์ฒด ํ์ผ๋ค์ ์ปค๋ฐ์ ์ถ๊ฐํด์. git add -p
๋ ๋ํํ์ผ๋ก ์ถ๊ฐํ๊ณ ํ ๋ณ๊ฒฝ์ ๋ค์ ๊ณ ๋ฅผ ์ ์์ด์.
์์ง ์คํ ์ด์ง์ ์ ์ฌ๋ผ๊ฐ ๋ณ๊ฒฝ์ ์ ์คํ ์ด์ง์ ์ถ๊ฐํ๊ณ , ์คํ ์ด์ง์ ์๋ ๋ณ๊ฒฝ์ ์ ๋ค์ ๋นผ๊ณ ์ถ์ด
์ด๊ฑด ์ข ๊ผผ์์ธ๋ฐ์, ์คํ ์ด์ง ์ ์ธ ํ์ผ๋ค์ ์คํ ์ด์ํด์ ๋นผ๋๊ณ ์ ๋ฆฌ์ ํ ์ ์์๊ฑฐ์์. ๊ทธ ๋ค์ ์คํ ์ด์๋ฅผ ๋ค์ ๋ถ๋ฌ์ ์ถ๊ฐ๋ฅผ ํด์.
$ git stash -k
$ git reset --hard
$ git stash pop
$ git add -A
$ git checkout -b my-branch
$ git stash
$ git checkout my-branch
$ git stash pop
๋ด ๋ก์ปฌ์ ์๋ ์ปค๋ฐ ์๋ ๋ณ๊ฒฝ์ ์ ๋ค ๋ฌด์ํ๊ณ ์ถ์ด (์คํ ์ด์ง ๋๋ ์๋๋)
๋ง์ฝ ๋ชจ๋ ์คํ ์ด์ง ๋๊ฑฐ๋ ์ ๋ ๋ณ๊ฒฝ์ ์ ๋ฒ๋ฆฌ๊ณ ์ถ๋ค๋ฉด ์ด๋ ๊ฒ ํด์:
(my-branch)$ git reset --hard
# or
(master)$ git checkout -f
์ด ๋ฐฉ๋ฒ์ git add
๋ก ์คํ
์ด์ง๋ ๋ชจ๋ ํ์ผ์ด ๋น ์ง๊ฒ ๋ผ์.
$ git reset
์ด ๋ฐฉ๋ฒ์ ์ปค๋ฐ๋์ง ์์ ๋ชจ๋ ๋ก์ปฌ ๋ณ๊ฒฝ์ ์ด ๋๋๋ ค ์ ธ์. (๋ ํ์งํ ๋ฆฌ ์ต์๋จ ๋ฃจํธ์์ ์คํํด์ผ ํ ๊ฑฐ์์)
$ git checkout .
๋ ์ปค๋ฐ๋์ง ์์ ๋ณ๊ฒฝ์ ๋ค ์ค ๋ช๊ฐ์ง ํ์ผ์ด๋ ๋๋ ํ ๋ฆฌ๋ง ๋๋๋ฆด ์ ์์ด์.
$ git checkout [some_dir|file.txt]
๊ฑฐ๊ธฐ์ ๋ ๋ค๋ฅธ ๋๋๋ฆฌ๋ ๋ฐฉ๋ฒ์ผ๋ก (ํ์ดํ ์น ๊ฒ ๋ง์ง๋ง ์ด๋ค ํ์ ๋๋ ํ ๋ฆฌ์์๋ ๋ผ์):
$ git reset --hard HEAD
์ด ๋ฐฉ๋ฒ์ ๋ชจ๋ ํธ๋ํน๋์ง ์์ ํ์ผ๋ค์ ์ง์์, ๊ทธ๋์ ๊น์์ ํธ๋ํน๋๋ ํ์ผ๋ค๋ง ๋จ์์:
$ git clean -fd
-x
์ต ๋ํ ๋ฌด์๋ ํ์ผ๋ค์ ๋ค ์ง์์.
์์ ์ค์ธ ์์ญ์์ ์ ์ฒด๊ฐ ์๋ ํน์ ๋ถ๋ถ์ ์ง์ฐ๊ณ ์ถ์๋ ์์น์๋ ๋ณ๊ฒฝ์ ์ ํ์ธํ๊ณ , ๋ณ๊ฒฝ์ ์ ์ ๋ณด๊ดํ์ธ์.
$ git checkout -p
# ๋ ๋ฆฌ๊ณ ์ถ์ ์ฌํญ์ y๋ฅผ ์ ์ผ์ธ์
๋๋ค๋ฅธ ์ ๋ต์ stash
์ ๊ฐ์ด ์ฐ๋๊ฑฐ์์. ์ฑ๊ฒจ์ผ ํ๋ ๋ณ๊ฒฝ์ ์ ์คํ
์ด์ ํ๊ณ , ์์
์ค์ธ ์์ญ์ ๋ฆฌ์
ํ๊ณ , ๋ค์ ์ฌ๋ฐ๋ฅธ ๋ณ๊ฒฝ์ ์ผ๋ก ์ฌ์ ์ฉํด์.
$ git stash -p
# ์ ์ฅํ๊ณ ์ถ์ ์ฌํญ๋ค์ ๋ค ์ ํํ์ธ์
$ git reset --hard
$ git stash pop
๋์์ผ๋ก, ์์น์๋ ๋ณ๊ฒฝ์ ์ ์คํ ์ด์ํด์ ๊ทธ๊ฑธ ๋ ๋ฆฌ๋ ๋ฐฉ๋ฒ๋ ์์ด์.
$ git stash -p
# ์ ์ฅํ๊ณ ์ถ์ง ์์ ์ฌํญ๋ค์ ๋ค ์ ํํ์ธ์
$ git stash drop
์์ ์์ญ์์ ํน์ ํ์ผ์ ์ง์ฐ๊ณ ์ถ์ ๋.
$ git checkout myFile
๋์์ผ๋ก, ์์ ์์ญ ๋ด ์ฌ๋ฌ ํ์ผ๋ค์ ์ง์ฐ๊ณ ์ถ์๋ ๋ชจ๋ ๋์ดํด์ ์ ์ด์.
$ git checkout myFirstFile mySecondFile
๋ชจ๋ ์คํ ์ด์ง ์๋ ์ปค๋ฐ ์ ์ธ ๋ณ๊ฒฝ์ ์ ์ง์ฐ๊ณ ์ถ์ ๋
$ git checkout .
ํธ๋ํน ์๋ ํ์ผ๋ค ๋ค ์ง์ฐ๊ณ ์ถ์ ๋
$ git clean -f
๋ก์ปฌ ๋ธ๋์น ๋ค ๋ณด๊ธฐ
$ git branch
๋ฆฌ๋ชจํธ ๋ธ๋์น ๋ค ๋ณด๊ธฐ
$ git branch -r
๋ก์ปฌ๊ณผ ๋ฆฌ๋ชจํธ ๋ธ๋์น ๋ชจ๋ ๋ณด๊ธฐ
$ git branch -a
$ git checkout -b <branch> <SHA1_OF_COMMIT>
์ด๊ฑด ์๋ชป๋ ํ์ ๋ฐ๊ธฐ์ HEAD๊ฐ ์ด๋ ๊ฐ๋ฅดํค๊ณ ์์๋์ง ๋ณผ ์ ์๋ git reflog
๋ฅผ ์จ๋ณผ ์ ์๋ ๊ธฐํ์์.
(master)$ git reflog
ab7555f HEAD@{0}: pull origin wrong-branch: Fast-forward
c5bc55a HEAD@{1}: checkout: checkout message goes here
๊ฐ๋จํ ์ํ๋ ์ปค๋ฐ์ผ๋ก ๋ธ๋์น๋ฅผ ๋๋๋ฆด ์ ์์ด์:
$ git reset --hard c5bc55a
๋!
์๋ฒ์ ๋ณ๊ฒฝ์ ์ ํธ์ ์ํ๋์ง๋ถํฐ ํ์ธํด์.
git status
๊ฐ ์ค๋ฆฌ์ง๋ณด๋ค ๋ช๊ฐ์ ์ปค๋ฐ๋ค์ด ์์ ์๋์ง ๋ณด์ฌ์ค๊ฑฐ์์:
(my-branch)$ git status
# On branch my-branch
# Your branch is ahead of 'origin/my-branch' by 2 commits.
# (use "git push" to publish your local commits)
#
์ค๋ฆฌ์ง(๋ฆฌ๋ชจํธ๊ณผ ๊ฐ์ ์ํ์)๋ก ๋ง์ถ๋ ๋ฆฌ์ ์ ํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋:
(master)$ git reset --hard origin/my-branch
๋ง์คํฐ์ ์์ผ๋ฉด์ ์ ๋ธ๋์น๋ฅผ ๋ง๋ค์ด์:
(master)$ git branch my-branch
๋ง์คํฐ ๋ธ๋์น๋ฅผ ๊ธฐ์กด ์ปค๋ฐ์ผ๋ก ๋ฆฌ์ ํด์:
(master)$ git reset --hard HEAD^
HEAD^
๋ HEAD^1
์ ์ถ์ฝ์ธ๋ฐ์. HEAD^
์ ์ฒซ๋ฒ์งธ ๋ถ๋ชจ๋ฅผ ์๋ฏธํ๊ณ , ๋น์ทํ HEAD^2
๋ ๋๋ฒ์งธ ๋ถ๋ชจ๋ฅผ ์๋ฏธํด์. (๋จธ์ง๋ ๋ ๋ถ๋ชจ๋ฅผ ๊ฐ์ง ์ ์์ฃ )
์์๋์ธ์ HEAD^2
๋ HEAD~2
๊ณผ ๊ฐ์๊ฒ ์๋์์. (๋ ์์ธํ ์ ๋ณด๋ ์ด ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ )
๋์์ผ๋ก, HEAD^
๋ฅผ ์ฐ๊ณ ์ถ์ง ์๋ค๋ฉด, ๋ง์คํฐ ๋ธ๋์น๋ก ์ฎ๊ธธ ์ปค๋ฐ ํด์๋ฅผ ์์๋ฌ์ (git log
๊ฐ ํธ๋ฆญ์ ๋ถ๋ฆด ๊ฑฐ์์) ๊ทธ๋ฆฌ๊ณ ๊ทธ ํด์ฌ๋ก ๋ฆฌ์
์ ํด์. git push
๊ฐ ๋ฆฌ๋ชจํธ๋ ๋ณ๊ฒฝ์ ์ด ๋๊ฐ์๊ฑธ ํ์ธํด์ค๊ฑฐ์์.
์๋ฅผ ๋ค์๋ฉด, ๊ทธ ๋ง์คํฐ์ ์ปค๋ฐ์ ํด์ฌ๊ฐ a13b85e
๋ผ๋ฉด:
(master)$ git reset --hard a13b85e
HEAD is now at a13b85e
์ ๋ธ๋์น๋ก ์ฒดํฌ์์ ํด์ ๊ณ์ ์์ ์ ํด์:
(master)$ git checkout my-branch
์๋ฐฑ๋ฒ์ ๋ณ๊ฒฝ์ ์ ๊ฐ์ง ์คํ์ดํฌ(์๋ ์์๋๊ธฐ ์ฐธ๊ณ ) ์์ ์ ํ๋ค๊ณ ๊ฐ์ ํด๋ณด์ฃ . ๋ชจ๋ ๊ฑด ๋์ํ๊ณ ์๊ณ ,๊ทธ ์์ ์ ์ ์ฅํด๋๊ธฐ ์ํด ๋ค๋ฅธ ๋ธ๋์น๋ก ์ปค๋ฐ์ ํด์:
(solution)$ git add -A && git commit -m "Adding all changes from this spike into one big commit."
๊ทธ ์ปค๋ฐ์ ๋ธ๋์น(์๋ง feature์ผ์๋ ์๊ณ , develop
์ผ์๋ ์๊ฒ ์ฃ )์ ๋ฃ๊ณ ์ถ์ ๋, ๋ชจ๋ ํ์ผ์ ์งํค๋๋ฐ ๊ด์ฌ์ด ์์๊ฑฐ์์. ํฐ ์ปค๋ฐ์ ์๊ฒ ๋๋๊ณ ์ถ์๊ฑฐ์์.
ํ์ฌ ๊ฐ์ง๊ณ ์๋๊ฑด:
- ์คํ์ดํฌ๋ฅผ ์ํ ์๋ฃจ์
๊ณผ ํจ๊ป์ธ
solution
๋ธ๋์น.develop
๋ธ๋์น์ 1๋จ๊ณ ์์ ์ํ. - ๋ณ๊ฒฝ์ ์ ์ถ๊ฐํ๊ณ ์ถ์
develop
๋ธ๋์น
๋ธ๋์น๋ก ๋ด์ฉ๋ค์ ๋ถ๋ฌ์ค๋ ๊ฒ์ผ๋ก ํด๊ฒฐํ ์ ์์ด์:
(develop)$ git checkout solution -- file1.txt
develop
๋ธ๋์น์์ solution
๋ธ๋์น์ ์ ํ์ผ์ ๋ด์ฉ๋ค์ ์ป์ ์ ์์ด์.
# On branch develop
# Your branch is up-to-date with 'origin/develop'.
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: file1.txt
๊ทธ ๋ค์, ํ์์ฒ๋ผ ์ปค๋ฐํด์.
์์๋๊ธฐ : ์คํ์ดํฌ ์๋ฃจ์ ์ ๋ฌธ์ ๋ฅผ ๋ถ์ํ๊ฑฐ๋ ํ๊ธฐ์ํด ๋ง๋ค์ด์ก์ด์. ์ด ์๋ฃจ์ ๋ค์ ๋ชจ๋๊ฐ ๋ฌธ์ ์ ํ์คํ ์๊ฐํ๋ฅผ ์ป๊ณ ์ ํ๊ฐ๋๊ณ ์ ๊ฑฐ๋ผ์.~ ์ํคํผ๋์.
๋ง์คํฐ ๋ธ๋์น์ ์๋ค๊ณ ๊ฐ์ ํ๊ณ git log
ํด๋ณด๋ฉด ์ปค๋ฐ ๋๊ฐ ๋ณผ ์ ์์๊ฑฐ์์:
(master)$ git log
commit e3851e817c451cc36f2e6f3049db528415e3c114
Author: Alex Lee <[email protected]>
Date: Tue Jul 22 15:39:27 2014 -0400
Bug #21 - Added CSRF protection
commit 5ea51731d150f7ddc4a365437931cd8be3bf3131
Author: Alex Lee <[email protected]>
Date: Tue Jul 22 15:39:12 2014 -0400
Bug #14 - Fixed spacing on title
commit a13b85e984171c6e2a1729bb061994525f626d14
Author: Aki Rose <[email protected]>
Date: Tue Jul 21 01:12:48 2014 -0400
First commit
๊ฐ ๋ฒ๊ทธ์ปค๋ฐ์ ํด์ฌ๋ฅผ ๊ฐ์ ธ์์. (21๋ฒ์ e3851e8
, 14๋ฒ์ 5ea5173
)
์ฐ์ , ๋ง์คํฐ ๋ธ๋์น์ ์ ํํ ์ปค๋ฐ (a13b85e
)์ผ๋ก ๋ฆฌ์
ํด์:
(master)$ git reset --hard a13b85e
HEAD is now at a13b85e
๊ทธ๋ฆฌ๊ณ , 21๋ฒ ๋ฒ๊ทธ ์์ ์ ์ํ ์๋ก์ด ๋ธ๋์น๋ฅผ ๋ง๋ค์ ์์ด์:
(master)$ git checkout -b 21
(21)$
๊ทธ๋ฆฌ๊ณ 21๋ฒ ๋ฒ๊ทธ ์ปค๋ฐ์ ์ฒด๋ฆฌํฝ ํด์ ๋ธ๋์น ์ต์๋จ์ ์ฌ๋ ค์. ๊ทธ ์ปค๋ฐ์ ์ ์ฉํ ๊ฑด๋ฐ, ์ค์ง ๊ทธ ์ปค๋ฐ๋ง์ ํค๋์ ๋ญ๊ฐ ์๋ ์ต์๋จ์ผ๋ก ์ ์ฉํ ๊ฑฐ๋ ์๋ฏธ์์.
(21)$ git cherry-pick e3851e8
์ด ์ง์ ์์ ์ถฉ๋์ด ์์ ์๋ ์์ด์. ์ด๋ป๊ฒ ์ถฉ๋์ ํด๊ฒฐํ ์ง ๋ํํ ๋ฆฌ๋ฒ ์ด์ค ์น์ ์์ ์๋ ์ถฉ๋์ด ์์ด ๋ถ๋ถ์ ์ฐธ๊ณ ํ์ธ์.
์ ์ด์ 14๋ฒ ๋ฒ๊ทธ ์์ ์ ์ํด ๋ง์คํฐ๋ก ๊ฐ์ ์ ๋ธ๋์น๋ฅผ ๋ง๋ค์ด์.
(21)$ git checkout master
(master)$ git checkout -b 14
(14)$
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก, 14๋ฒ ๋ฒ๊ทธ์์ ์ ์ํ ์ปค๋ฐ์ ์ฒด๋ฆฌํฝํด์.
(14)$ git cherry-pick 5ea5173
๊นํ์ ํ๋ฆฌํ์คํธ๋ก ๋จธ์ง๋ฅผ ํ๋ฉด, ํฌํฌ ๋ฌ ๋จธ์ง ๋ธ๋์น๋ฅผ ์ง์ธ๊ป์ง ์ ํํ ์ ์๋ ์ต์ ์ ์ค์. ํด๋น ๋ธ๋์น์ ๊ณ์ ์์ ํ ์์ ์ด ์๋ค๋ฉด, ๋ค๋์ ์ค๋๋ ๋ธ๋์น๋ค๋ก ๋ค๋ฎ์ด์ง ์๊ฒ ๋ก์ปฌ ์์ ์ ์ง์์ฃผ๋๊ฒ ๋ ๊น๋ํด์.
$ git fetch -p upstream
์ฌ๊ธฐ์, upstream
์ ํจ์น๋ก ๊ฐ์ ธ์ค๋ ค๋ ๋ฆฌ๋ชจํธ ๋ ํ์งํ ๋ฆฌ์์.
์ฃผ๊ธฐ์ ์ผ๋ก ๋ฆฌ๋ชจํธ์ผ๋ก ํธ์ํ๋ค๋ฉด, ๋๋ถ๋ถ์ ์์ ํด์ผ ํด์. ๊ทธ์น๋ง ๊ฐ๋์ ๋ธ๋์น๋ฅผ ์ง์ธ ์ ์์ด์. ์ ๋ธ๋์น๋ฅผ ๋ง๋ค๊ณ ํ์ผ์ ํ๋ ๋ง๋ค์๋ค๊ณ ํด๋ณด์ฃ :
(master)$ git checkout -b my-branch
(my-branch)$ git branch
(my-branch)$ touch foo.txt
(my-branch)$ ls
README.md foo.txt
์ถ๊ฐํ๊ณ ์ปค๋ฐํด์.
(my-branch)$ git add .
(my-branch)$ git commit -m 'foo.txt added'
(my-branch)$ foo.txt added
1 files changed, 1 insertions(+)
create mode 100644 foo.txt
(my-branch)$ git log
commit 4e3cd85a670ced7cc17a2b5d8d3d809ac88d5012
Author: siemiatj <[email protected]>
Date: Wed Jul 30 00:34:10 2014 +0200
foo.txt added
commit 69204cdf0acbab201619d95ad8295928e7f411d5
Author: Kate Hudson <[email protected]>
Date: Tue Jul 29 13:14:46 2014 -0400
Fixes #6: Force pushing after amending commits
์ด์ ๋ค์ ๋ง์คํฐ๋ก ๋์๊ฐ '์ค์๋ก' ๋ธ๋์น๋ฅผ ์ง์๋ณด์ฃ .
(my-branch)$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
(master)$ git branch -D my-branch
Deleted branch my-branch (was 4e3cd85).
(master)$ echo oh noes, deleted my branch!
oh noes, deleted my branch!
์ฌ๊ธฐ์์ ์ ๊ทธ๋ ์ด๋๋ ๋ก๊ทธ ๋๊ตฌ์ธ '๋ฆฌํ๋ก๊ทธ'์ ์ต์ํด์ ธ์ผ ํด์. ๋ฆฌํ๋ก๊ทธ๋ ๋ ํ์งํ ๋ฆฌ์ ๋ชจ๋ ํ๋์ ์ด๋ ฅ์ ๋ค ๋ณด๊ดํด์.
(master)$ git reflog
69204cd HEAD@{0}: checkout: moving from my-branch to master
4e3cd85 HEAD@{1}: commit: foo.txt added
69204cd HEAD@{2}: checkout: moving from master to my-branch
๋ณด์๋ค์ํผ ์ง์์ง ๋ธ๋์น์ ์ปค๋ฐ ํด์ฌ๋ ๋ณผ ์ ์์ด์. ์ง์ ๋ ๋ธ๋์น๋ฅผ ์ด๋ฆด ์ ์๋ ์ง ํ๋ฒ ํด๋ณด์ฃ .
(master)$ git checkout -b my-branch-help
Switched to a new branch 'my-branch-help'
(my-branch-help)$ git reset --hard 4e3cd85
HEAD is now at 4e3cd85 foo.txt added
(my-branch-help)$ ls
README.md foo.txt
์ง์! ์ง์์ง ํ์ผ๋ค์ ๋๋๋ ค ๋จ์ด์. git reflog
๋ ๋ฆฌ๋ฒ ์ด์ค๊ฐ ๋์ฐํ๊ฒ ์๋ชป ๋์๋ ์์ฃผ ์ ์ฉํด์.
๋ฆฌ๋ชจํธ ๋ธ๋์น๋ฅผ ์ญ์ ํ๋ ค๋ฉด:
(master)$ git push origin --delete my-branch
์ด๋ ๊ฒ๋:
(master)$ git push origin :my-branch
๋ก์ปฌ ๋ธ๋์น๋ฅผ ์ญ์ ํ๋ ค๋ฉด:
(master)$ git branch -d my-branch
ํ์ฌ ๋ธ๋์น๋ ์ ์คํธ๋ฆผ์ ๋จธ์ง๋์ง ์์ ๋ก์ปฌ ๋ธ๋์น๋ฅผ ์ง์ฐ๋ ค๋ฉด:
(master)$ git branch -D my-branch
fix/
๋ก ์์ํ๋ ๋ชจ๋ ๋ธ๋์น๋ค์ ์ง์ฐ๊ณ ์ถ๋ค๋ฉด:
(master)$ git branch | grep 'fix/' | xargs git branch -d
ํ์ฌ (๋ก์ปฌ) ๋ธ๋์น ์ด๋ฆ์ ๋ฐ๊พธ๋ ค๋ฉด:
(master)$ git branch -m new-name
๋ค๋ฅธ (๋ก์ปฌ) ๋ธ๋์น ์ด๋ฆ์ ๋ฐ๊พธ๋ ค๋ฉด
(master)$ git branch -m old-name new-name
์ฐ์ , ๋ฆฌ๋ชจํธ ๋ ํ์งํ ๋ฆฌ์์ ๋ชจ๋ ๋ธ๋์น๋ฅผ ํจ์น ๋ฐ์์:
(master)$ git fetch --all
๋ฆฌ๋ชจํธ์ daves
๋ก ์ฒดํฌ์์ ํ๊ณ ์ถ๋ค๊ณ ํ๋ฉด.
(master)$ git checkout --track origin/daves
Branch daves set up to track remote branch daves from origin.
Switched to a new branch 'daves'
(--track
์ git checkout -b [branch] [remotename]/[branch]
์ ์ถ์ฝ์ด์์)
daves
๋ธ๋์น์ ๋ก์ปฌ ์นดํผ๋ฅผ ์ค๊ฑฐ์์. ๊ทธ๋ฆฌ๊ณ ํธ์๋ ์
๋ฐ์ดํธ๋ค๋ ๋ฆฌ๋ชจํธ๋ก ํ์๋ผ์.
$ git push <remote> HEAD
๋ํ ๋ฆฌ๋ชจํธ ๋ธ๋์น๋ฅผ ํ์ฌ ๋ธ๋์น๋ฅผ ์ํ ์ ์คํธ๋ฆผ์ผ๋ก ์ค์ ํ๊ณ ์ถ๋ค๋ฉด, ๋์ ์๋ ๋ฐฉ๋ฒ์ ์จ๋ด์:
$ git push -u <remote> HEAD
push.default
์ค์ ์ upstream
๋ชจ๋์ simple
๋ชจ๋ (2.0 ๋ฒ์ ์ ๊น์ ๊ธฐ๋ณธ)์ ํจ๊ป,
์๋ ์ปค๋งจ๋๋ ์ด์ ์ -u
์ต์
์ผ๋ก ๋ฑ๋ก๋ ๋ฆฌ๋ชจํธ ๋ธ๋์น์ ๊ด๋ จ๋ ํ์ฌ ๋ธ๋์น๋ฅผ ํธ์ํ ๊ฑฐ์์:
$ git push
git push
์ ๋ค๋ฅธ ๋ชจ๋์ ๋์์ push.default
๋ฌธ์์ ์ค๋ช
๋ผ ์์ด์.
๋ฆฌ๋ชจํธ ๋ธ๋์น๋ฅผ ํ์ฌ ์ฐ๊ณ ์๋ ๋ก์ปฌ ๋ธ๋์น๋ฅผ ์ํ ์ ์คํธ๋ฆผ์ผ๋ก ์ค์ ํ ์ ์์ด์:
$ git branch --set-upstream-to [remotename]/[branch]
# ์๋๋ฉด ์งง๊ฒ:
$ git branch -u [remotename]/[branch]
๋ค๋ฅธ ๋ก์ปฌ ๋ธ๋์น๋ฅผ ์ํ ์ ์คํธ๋ฆผ ๋ฆฌ๋ชจํธ ๋ธ๋์น๋ฅผ ์ค์ ํ๋ ค๋ฉด:
$ git branch -u [remotename]/[branch] [local-branch]
๋ฆฌ๋ชจํธ ๋ธ๋์น๋ฅผ ํ์ธํด๋ณด๋ ๊ฒ์ผ๋ก, HEAD๊ฐ ํธ๋ํน ์ค์ธ ๋ฆฌ๋ชจํธ ๋ธ๋์น๋ฅผ ๋ณผ ์ ์์ด์. ๋ช๋ช ๊ฒฝ์ฐ์๋, ์ํ๋ ๋ธ๋์น๊ฐ ์๋๊ฑฐ์์.
$ git branch -r
origin/HEAD -> origin/gh-pages
origin/master
origin/HEAD
๋ฅผ origin/master
๋ฅผ ํธ๋ํนํ๋ ๊ฒ์ผ๋ก ๋ณ๊ฒฝํ๋ ค๋ฉด, ์ด ์ปค๋งจ๋๋ก ์คํํ ์ ์์ด์:
$ git remote set-head origin --auto
origin/HEAD set to master
์ปค๋ฐ ๋์ง ์์ ๋ณ๊ฒฝ์ , ๊ฑฐ๊ธฐ๋ค ์๋ชป๋ ๋ธ๋์น์ ํ๊ณ ์์๋ค๋ฉด ๋ณ๊ฒฝ์ ์ ์คํ ์ด์ ํ๊ณ ์ํ๋ ๋ธ๋์น๋ก ๊ฐ ์คํ ์ด์ ์ดํ๋ผ์ด ํด์:
(wrong_branch)$ git stash
(wrong_branch)$ git checkout <correct_branch>
(correct_branch)$ git stash apply
ํ์ฌ ๋ธ๋์น๋ฅผ ์๋ํ์ง ์๋ ๋ธ๋์น๋ก ๋จธ์ง ๋๋ ๋ฆฌ๋ฒ ์ด์ค ํ๊ฑฐ๋, ๋ฆฌ๋ฒ ์ด์ค/๋จธ์ง ๋์ค์ ์๋ฃํ๊ฑฐ๋ ๋๋ด์ง ๋ชปํ์๊ฑฐ์์. ๊น์ ์ํํ ๊ณผ์ ์ ์ ์๋์ HEAD ํฌ์ธํธ๋ฅผ ORIG_HEAD๋ผ ๋ถ๋ฆฌ๋ ๋ณ์์ ๋ณด๊ดํด์, ๊ทธ๋ฌ๋ ๋ฆฌ๋ฒ ์ด์ค/๋จธ์ง ์ ์ํ๋ก ๋ธ๋์น๋ฅผ ๋ณต๊ตฌํ๊ธฐ ๊ฐ๋จํด์.
(my-branch)$ git reset --hard ORIG_HEAD
์์ฝ๊ฒ๋ ๊ทธ๋ฐ ๋ณ๊ฒฝ์ ์ ๋ฆฌ๋ชจํธ ๋ธ๋์น์ ๋ฐ์ํ๋ ค๋ฉด ๊ฐ์ ํธ์๋ฐ์ ๋ฐฉ๋ฒ์ด ์์ด์. ์ด๋ ฅ์ ๋ณ๊ฒฝํด์๊ธฐ ๋๋ฌธ์ด์ฃ . ๋ฆฌ๋ชจํธ ๋ธ๋์น๋ ๊ฐ์ ํธ์ ์ธ์ ์ ์ฉ ํด์ฃผ์ง ์์๊ฑฐ์์. ๋ง์ ๋ถ๋ค์ด ๋จธ์ง ์ํฌํ๋ก์ฐ๋ฅผ ๋ฆฌ๋ฒ ์ด์ค ์ํฌํ๋ก์ฐ๋ณด๋ค ์ ํธํ๋ ๋ง์ด ์ด์ ์ค ํ๋์ฃ - ํฐ ํ์์ ๊ฐ๋ฐ์์ ๊ฐ์ ํธ์๋ก ๊ณค๋ํด์ง ์ ์์ด์. ์ฃผ์ํด์ ์ฐ์ธ์. ๋ฆฌ๋ฒ ์ด์ค๋ฅผ ๊ทธ๋๋ง ์์ ํ๊ฒ ์ฐ๋ ๋ฐฉ๋ฒ์ ๋ฆฌ๋ชจํธ ๋ธ๋์น์ ๋ชจ๋ ๋ณ๊ฒฝ์ ๊ณผ ๋๊ฐ์ด ๋ฐ์ํ๋๊ฒ ์๋๋ผ ๋์ ์ ์ด๋ ๊ฒ ํด๋ด์:
(master)$ git checkout my-branch
(my-branch)$ git rebase -i master
(my-branch)$ git checkout master
(master)$ git merge --ff-only my-branch
๋ ํ์ธ์ด ํ์ํ๋ค๋ฉด, ์ด ์คํ์ค๋ฒํ๋ก์ฐ์ ์ฐ๋ ๋๋ฅผ ์ฐธ๊ณ ํด์.
master
์ ํ ๋ฆฌํ์คํธ๊ฐ ๋ ๋ธ๋์น์์ ์์
ํ๊ณ ์๋ค๊ณ ๊ฐ์ ํด๋ด์.
๊ฐ์ฅ ๊ฐ๋จํ ๊ฒฝ์ฐ๋ ์ํ๋๊ฒ ๋ชจ๋ ์ปค๋ฐ์ ํ๋์ ์ปค๋ฐ์ผ๋ก ํฉ์น๊ณ ๋ณ๊ฒฝ์ ์ ์๊ฐ์ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋๋ ๊ฒ์ผ ๋, ๋ฆฌ์
ํ๊ณ ์ปค๋ฐ ๋ค์ํ๋ฉด ๋ผ์.
๋ง์คํฐ ๋ธ๋์น๊ฐ ์ต์ ์ด๊ณ ๋ชจ๋ ๋ณ๊ฒฝ์ ์ด ์ปค๋ฐ๋ ๊ฒ๋ง ํ์ธํ ๋ค์:
(my-branch)$ git reset --soft master
(my-branch)$ git commit -am "New awesome feature"
์ข๋ ์กฐ์ ํ๊ณ , ์๊ฐ๊ธฐ๋ก๊น์ง ๋ณด๊ดํ๊ณ ์ถ๋ค๋ฉด, ๋ํํ ๋ฆฌ๋ฒ ์ด์ค๊ฐ ํ์ํ ๊ฑฐ์์.
(my-branch)$ git rebase -i master
๋ง์ฝ ๋ค๋ฅธ ๋ธ๋์น๋ก ๋ถ๋ ์์
์ ํ๋๊ฒ ์๋๋ผ๋ฉด, HEAD
์ ๊ธฐ์ค์ผ๋ก ๋ฆฌ๋ฒ ์ด์ค ํด์ผํด์.
์๋ก ๋ง์ง๋ง 2๊ฐ์ ์ปค๋ฐ์ ์ค์ฟผ์(๊ธฐ์กด ์ปค๋ฐ์ ๋ฐ์ํด๋ฃ๋)ํ๊ณ ์ถ๋ค๋ฉด HEAD~2
๋ก ๋ฆฌ๋ฒ ์ด์ค ํด์. 3๊ฐ๋ผ๋ฉด HEAD~3
์ผ๋ก ํ๊ตฌ์.
(master)$ git rebase -i HEAD~2
๋ํํ ๋ฆฌ๋ฒ ์ด์ค๋ฅผ ์คํํ๋ฉด ํ ์คํธ ์๋ํฐ๋ก ์ด๋ฐ ๊ฒ๋ค์ ๋ณผ ์ ์์๊ฑฐ์์.
pick a9c8a1d Some refactoring
pick 01b2fd8 New awesome feature
pick b729ad5 fixup
pick e3851e8 another fix
# Rebase 8074d12..b729ad5 onto 8074d12
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
๋ชจ๋ #
์ผ๋ก ์์ํ๋ ์ฃผ์์ค์ ๋ฆฌ๋ฒ ์ด์ค์ ์ํฅ์ ์ฃผ์ง ์์์.
๋ค์์ผ๋ก pick
๋ถ๋ถ์ ๋ค๋ฅธ ๋ช
๋ น์ด๋ก ๋ฐ๊พธ๊ฑฐ๋, ํด๋นํ๋ ๋ผ์ธ์ ์ง์์ ์ปค๋ฐ์ ์ง์ธ ์๋ ์์ด์.
์๋ฅผ ๋ค์๋ฉด ์ค๋๋ (์ฒซ๋ฒ์งธ) ์ปค๋ฐ๋ง ๋๊ณ ๋๋ฒ์งธ ์ค๋๋ ์ปค๋ฐ๊ณผ ๋๋จธ์ง๋ฅผ ๋ค ํฉ์น๊ณ ์ถ์๋, ์ฒซ๋ฒ์งธ์ ๋๋ฒ์งธ ์ปค๋ฐ ์ ์ธํ ๋๋จธ์ง ์ปค๋งจ๋๋ค์ f
๋ก ๋ฐ๊ฟ์ผ ํ ๊ฑฐ์์:
pick a9c8a1d Some refactoring
pick 01b2fd8 New awesome feature
f b729ad5 fixup
f e3851e8 another fix
์ด ์ปค๋ฐ๋ค์ ํฉ์น๊ณ ์ปค๋ฐ ์ด๋ฆ์ ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด, ์ถ๊ฐ๋ก ์ ์ด์ค์ผ ํด์ ๋๋ฒ์งธ ์ปค๋ฐ ๋ค์์ r
๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ฐ๋จํ f
๋์ s
๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋ ๊ฑฐ์์:
pick a9c8a1d Some refactoring
pick 01b2fd8 New awesome feature
s b729ad5 fixup
s e3851e8 another fix
๊ทธ๋ฐ ๋ค์์ ํ๋ฒ ๋ ๋จ๋ ํ ์คํธ ์๋ํฐ๋ก ์ปค๋ฐ ์ด๋ฆ์ ๋ฐ๊ฟ ์ ์์ด์.
Newer, awesomer features
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# rebase in progress; onto 8074d12
# You are currently editing a commit while rebasing branch 'master' on '8074d12'.
#
# Changes to be committed:
# modified: README.md
#
์ ๋ถ ๋ค ์ฑ๊ณตํ๋ฉด, ์ด๋ฐ ๋ฉ์ธ์ง๋ฅผ ๋ณผ๊ฑฐ์์:
(master)$ Successfully rebased and updated refs/heads/master.
--no-commit
๋ ๋จธ์ง๋ ํ์ง๋ง ์คํจํ๊ณ ์๋ ์ปค๋ฐ์ด ์๋๊ฒ์ฒ๋ผ ๋ณด์ด๋๋ฐ, ์ปค๋ฐํ๊ธฐ์ ์ ๋จธ์ง ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ์ถ๊ฐ๋ก ์กฐ์ ํ ์ ์๊ฒ ํด์ค์.
no-ff
๋ ํผ์ณ ๋ธ๋์น๊ฐ ์์๋ค๋ ์ฆ๊ฑฐ๋ฅผ ๋จ๊ธฐ๊ณ , ์ด๋ ฅ์ ์ผ๊ด๋๊ฒ ๊ฐ์ง๊ฒ ํด์.
(master)$ git merge --no-ff --no-commit my-branch
(master)$ git merge --squash my-branch
๊ฐ๋ ์ฌ๋ฌ๊ฐ์ง ์์ ๋์ค์ธ ์ปค๋ฐ์ ํธ์ํ๊ธฐ ์ ์ ํฉ์น๊ณ ์ถ์๊ฑฐ์์. ๋ค๋ฅธ ๋๊ตฐ๊ฐ๊ฐ ๋ฒ์จ ์ฐธ๊ณ ํด์ ์ปค๋ฐ์ ๋ง๋ค๊ณ ์์ํ ๋ ์ด๋ฏธ ํธ์๋ ์ปค๋ฐ์ ์๋ชป ํฉ์น๊ธธ ๋ฐ๋ผ์ง ์์๊ฑฐ์์.
(master)$ git rebase -i @{u}
์ด ๋ช ๋ น์ ์์ง ํธ์ํ์ง ์์ ์ปค๋ฐ๋ง์ผ๋ก ๋ํํ ๋ฆฌ๋ฒ ์ด์ค๋ฅผ ์คํํด์. ๊ทธ๋ฌ๋ ๋ชฉ๋ก ๋ด์ ์๋ ์ด๋ค ์ปค๋ฐ์ด๋ ์ฌ์ ๋ ฌ/์์ /ํฉ์น๊ธฐ ์์ ํด์.
๋๋๋ก ๋จธ์ง๋ ์ด๋ค ํ์ผ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์๋ ์์ด์, ์ด ๊ฒฝ์ฐ ์ต์
abort
์ผ๋ก ํ์ฌ ์ถฉ๋ ํด๊ฒฐ ํ๋ก์ธ์ค๋ฅผ ์ค๋จํ๊ณ ๋ณํฉํ๊ธฐ ์ ์ํ๋ก ๋ค์ ๊ตฌ์ฑํ ์ ์์ด์.
(my-branch)$ git merge --abort
์ด ๋ช ๋ น์ 1.7.4 ๋ฒ์ ๋ถํฐ ์ธ ์ ์์ด์.
๋ธ๋์น ๋ด ๋ชจ๋ ์ปค๋ฐ์ด ๋ค๋ฅธ ๋ธ๋์น๋ก ๋จธ์ง๋๋์ง ํ์ธํ๋ ค๋ฉด, ๊ทธ ๋ธ๋์น๋ค HEAD (๋๋ ํน์ ์ปค๋ฐ)๋ฅผ ๋น๊ตํด์ผํด์:
(master)$ git log --graph --left-right --cherry-pick --oneline HEAD...feature/120-on-scroll
์ด ๋ช ๋ น์ ์ด๋์๋ ์๊ณ ๋ค๋ฅธ๋ด ์๋ ์ปค๋ฐ์ด ์๋๋ฅผ ์๋ ค์ค๊ฑฐ์์ ๊ทธ๋ฆฌ๊ณ ๋ธ๋์น๋ค ์ฌ์ด์ ๊ณต์ ๋์ง ์์๊ฒ ๋ชฉ๋ก์ ๋ณด์ฌ์ค ๊ฑฐ๊ตฌ์. ๋ค๋ฅธ ์ต์ ์ ์ด๋ ๊ฒ:
(master)$ git log master ^feature/120-on-scroll --no-merges
์ด๋ฐ ๊ฑธ ๋ณธ๋ค๋ฉด:
noop
๋์ผํ ์ปค๋ฐ์ ์๊ฑฐ๋ ํ์ฌ ๋ธ๋์น๋ณด๋ค ์์ ์๋ ๋ธ๋์น์ ๋ํด ๋ฆฌ๋ฒ ์ด์ค๋ฅผ ์๋ํ๋ค๋ ์๋ฏธ์์. ์ด๋ ๊ฒ ํด๋ณผ ์ ์์ด์:
- ๋ง์คํฐ ๋ธ๋์น๊ฐ ์์ด์ผ ํ ๊ณณ์ ์๋ ํ์ธ
- ๋์ ํด์
HEAD~2
๋๋ ๋ ๊ธฐ์กด ํญ๋ชฉ์ ๋ฆฌ๋ฒ ์ด์ค
๋ฆฌ๋ฒ ์ด์ค๋ฅผ ๋๋ฐ๋ก ๋๋ด์ง ๋ชปํ๋ค๋ฉด, ์ถฉ๋์ ํด๊ฒฐํด์ผ ํ ๊ฑฐ์์.
์ด๋ค ํ์ผ์ด ์ถฉ๋๋ฌ๋์ง git status
๋ฅผ ๋จผ์ ์คํํด๋ด์:
(my-branch)$ git status
On branch my-branch
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
both modified: README.md
์ด ์์์์ , README.md
๊ฐ ์ถฉ๋๋ฌ๋ค์. ํ์ผ์ ์ด์ด์ ์๋์ ๊ฐ์ ๋ถ๋ถ์ ์ฐพ์๋ด์:
<<<<<<< HEAD
some code
=========
some code
>>>>>>> new-commit
์๋ก์ด ์ปค๋ฐ์ผ๋ก ์ถ๊ฐ๋ ์ฝ๋(์์์์ , ์ค๊ฐ ์ ๋ถํฐ new-commit
๊น์ง์)์ HEAD
์ฌ์ด์์ ์ฐจ์ด์ ์ ํด๊ฒฐํด์ผ ํ ๊ฑฐ์์.
์ด๋ ํ์ชฝ ๋ธ๋์น์ ์ฝ๋๋ฅผ ๋จ๊ธฐ๊ณ ์ถ๋ค๋ฉด, --ours
๋๋ --theirs
๋ฅผ ์ฐ๋ฉด ๋ผ์:
(master*)$ git checkout --ours README.md
- ๋จธ์งํ ๋,
--ours
๋ฅผ ์ฐ๋ฉด ๋ก์ปฌ ๋ธ๋์น์ ๋ณ๊ฒฝ์ ์ ์งํ๊ณ ,--theirs
๋ ๋ค๋ฅธ ๋ธ๋์น์ ๋ณ๊ฒฝ์ ๋ฅผ ์ ์งํด์. - ๋ฆฌ๋ฒ ์ด์คํ ๋,
--theirs
๊ฐ ๋ก์ปฌ ๋ธ๋์น์ ๋ณ๊ฒฝ์ ์ ์ ์งํ๊ณ--ours
๋ ๋ค๋ฅธ ๋ธ๋์น์ ๋ณ๊ฒฝ์ ์ ์ ์งํด์. ์ด๋ฐ ์ฐจ์ด์ ๊ดํ ์ค๋ช ์ Git ์ ์ ๋ฌธ์ ์ค ์ด ๋ฌธ์๋ฅผ ๋ณด์ธ์.
๋ง์ฝ ๋จธ์ง๊ฐ ๋ ๋ณต์กํ๋ฉด, ๋น์ฃผ์ผ ๋ํ ์๋ํฐ๋ฅผ ์ธ ์๋ ์์ด์:
(master*)$ git mergetool -t opendiff
์ฝ๋์ ์ถฉ๋์ ํด๊ฒฐํ๊ณ ํ
์คํธ๊ฐ ํด๊ฒฐ๋๊ณ ๋๋ฉด, ๋ฐ๋ ํ์ผ ๋ด์ฉ์ git add
ํด์ฃผ๊ณ , git rebase --continue
๋ก ๋ฆฌ๋ฒ ์ด์ค๋ฅผ ์ด์ด์ ํด์.
(my-branch)$ git add README.md
(my-branch)$ git rebase --continue
๋ง์ฝ ๋ชจ๋ ์ถฉ๋์ ๊ฐ์ ํ ๋ด์ฉ์ด ์ปค๋ฐ ์ ๊ณผ ๋์ผํ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค๋ฉด, ๋์ ์ git rebase --skip
๋ฅผ ํด์ผ ํด์.
๋ฆฌ๋ฒ ์ด์ค ์ค ๋ฉ์ถ๊ณ ์ถ์ ์ด๋ค ์์ ์ด๊ฑฐ๋ ์๋ ์ํ์ ๋ธ๋์น๋ก ๋์๊ฐ๊ณ ์ถ๋ค๋ฉด, ์ด๋ ๊ฒ ํ ์ ์์ด์:
(my-branch)$ git rebase --abort
์์ ์ค์ธ ๋๋ ํ ๋ฆฌ์์์ ๋ณ๊ฒฝํ ๋ด์ฉ ์ ๋ถ๋ฅผ ์คํ ์ด์ ํ๋ ค๋ฉด
$ git stash
ํธ๋ํน ๋์ง ์์ ํ์ผ๊น์ง๋ ํฌํจํ๋ ค๋ฉด, -u
์ต์
์ ์จ์.
$ git stash -u
์์ ์ค์ธ ๋๋ ํ ๋ฆฌ์์ ํ ํ์ผ๋ง ์คํ ์ด์ ํ๊ธฐ
$ git stash push working-directory-path/filename.ext
์์ ์ค์ธ ๋๋ ํ ๋ฆฌ์์ ์ฌ๋ฌ ํ์ผ ์คํ ์ด์ ํ๊ธฐ
$ git stash push working-directory-path/filename1.ext working-directory-path/filename2.ext
$ git stash save <message>
๋ฉ์ธ์ง ์์ฑ๋ ์คํ ์ด์ ๋ฆฌ์คํธ ๋จผ์ ํ์ธํ์ธ์
$ git stash list
๊ทธ๋ฐ ๋ค์ ๋ฆฌ์คํธ ๋ด ํน์ ์คํ ์ด์๋ฅผ ์ ์ฉํด์
$ git stash apply "stash@{n}"
์ฌ๊ธฐ์์, 'n' ์ ์คํ ์์์ ์คํ ์ด์์ ์์น๋ฅผ ๋ํ๋ด์. ์ ค ์์ ์๋ ์คํ ์ด์๊ฐ 0 ์ผ๊ฑฐ์์.
ํน์ ํ ๋ฌธ์์ด์ด ํฌํจ๋ ์ด๋ค ์ปค๋ฐ์ ์ฐพ์ผ๋ ค๋ฉด, ์ด๋ฐ ๊ตฌ์กฐ๋ก ์ธ ์ ์์ด์:
$ git log -S "string to find"
์ผ๋ฐ์ ์ธ ํ๋ผ๋ฏธํฐ๋ค์:
-
--source
๊ฐ ์ปค๋ฐ์ ๋๋ฌํ ๋ช ๋ น์ด์ ์ง์ ๋ ์ฐธ์กฐ ์ด๋ฆ์ ๋ณด์ฌ์ฃผ๋๊ฑธ ์๋ฏธํด์. -
--all
๋ ๋ชจ๋ ๋ธ๋์น์์ ์์ํ๋๊ฑธ ์๋ฏธํด์. -
--reverse
๋ฐ๋์ ์์๋ก ์ถ๋ ฅํด์, ๋ณ๊ฒฝ์ ์ ์ฒซ๋ฒ์งธ ์ปค๋ฐ์ด ๋ณด์ผ๊บผ๋ ๊ฑฐ์ฃ .
์์ฑ์๋ ์ปค๋ฏธํฐ์ ๋ชจ๋ ์ปค๋ฐ์ ์ฐพ์ผ๋ ค๋ฉด ์ด๋ ๊ฒ ์ธ ์ ์์ด์:
$ git log --author=<name or email>
$ git log --committer=<name or email>
์์ฑ์์ ์ปค๋ฏธํฐ๊ฐ ๊ฐ์ง ์๋ค๋ ๊ฒ๋ง ์ผ๋ํด๋์ธ์.
--author
๋ ์ฝ๋๋ฅผ ์ค์ ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ฌ๋์ด๊ณ
๋ฐ๋ฉด์ --committer
๋ ์ค์ ์์ฑ์๋ฅผ ๋์ ํด ์ปค๋ฐ์ ํ ์ฌ๋์ด์์.
ํน์ ํ์ผ์ด ๋ ๋ชจ๋ ์ปค๋ฐ์ ์ฐพ์ผ๋ ค๋ฉด ์ด๋ ๊ฒ ํด์:
$ git log -- <path to file>
๋ณดํต์ ์ ํํ ๊ฒฝ๋ก๋ฅผ ์ธํ ์ง๋ง ์์ผ๋ ์นด๋๋ก ๊ฒฝ๋ก๋ ํ์ผ๋ช ์ ์ธ์๋ ์์ด์:
$ git log -- **/*.js
์์ผ๋ ์นด๋๋ฅผ ์ธ ๋, ์ปค๋ฐ๋ ํ์ผ์ ๋ชฉ๋ก์ ๋ณผ ์ ์๋ --name-status
๋ก ํ์ธํ๋๊ฒ ์ ์ฉํ ๊ฑฐ์์:
$ git log --name-status -- **/*.js
ํน์ ์ปค๋ฐ์ด ํฌํจ๋ ๋ชจ๋ ํ๊ทธ๋ฅผ ์ฐพ์ผ๋ ค๋ฉด:
$ git tag --contains <commitid>
$ git clone --recursive git://github.com/foo/bar.git
๋ฒ์จ ํด๋ก ํ๋ค๋ฉด:
$ git submodule update --init --recursive
์๋ธ๋ชจ๋์ ๋ง๋๋๊ฑด ์์ฃผ ๊ฐ๋จํ์ง๋ง ์ง์ฐ๋๊ฑด ๊ทธ๋ ์ง ์์์. ํ์ํ ๋ช ๋ น์ด๋:
$ git submodule deinit submodulename
$ git rm submodulename
$ git rm --cached submodulename
$ rm -rf .git/modules/submodulename
์ฐ์ ๊ทธ ํ์ผ์ด ๋ง์ง๋ง์ผ๋ก ์์๋ ์ปค๋ฐ์ ์ฐพ๊ณ :
$ git rev-list -n 1 HEAD -- filename
๊ทธ๋ฐ ๋ค์ ๊ทธ ํ์ผ์ ์ฒดํฌ์์ํด์
git checkout deletingcommitid^ -- filename
$ git tag -d <tag_name>
$ git push <remote> :refs/tags/<tag_name>
์ด๋ฏธ ์ง์ด ํ๊ทธ๋ฅผ ๋ณต๊ตฌํ๊ณ ์ถ๋ค๋ฉด, ์ด๋ฐ ๋จ๊ณ๋ฅผ ๋ฐ๋ผํด ๋ณผ ์ ์์ด์: ์ฐ์ , ์ฐ๊ฒฐํ ์ ์๋ ํ๊ทธ๋ฅผ ์ฐพ๊ณ :
$ git fsck --unreachable | grep tag
ํ๊ทธ์ ํด์ฌ๋ฅผ ๋ฉ๋ชจํด๋์ธ์.
๊ทธ๋ฐ ๋ค์ git update-ref
์ ์จ์ ์ง์์ง ํ๊ทธ๋ฅผ ๋ณต๊ตฌํด์:
$ git update-ref refs/tags/<tag_name> <hash>
์ด์ ํ๊ทธ๊ฐ ๋ณต๊ตฌ๋ผ์์๊ฑฐ์์.
๋ง์ฝ ๊นํ์์ ๋๊ตฐ๊ฐ๊ฐ ํ๋ฆฌํ์คํธ๋ฅผ ๋ณด๋๋๋ฐ ์ด๋ฏธ ์๋์ ํฌํฌ๊ฐ ์ง์์ก๋ค๋ฉด,
url์ ์ธ ์ ์๊ฒ ๋ผ ๋ ํ์งํ ๋ฆฌ๋ฅผ ํด๋ก ํ ์ ์๊ฑฐ๋ .diff, .patch์ ๊ฐ์ git am
๋ฅผ ์ธ ์ ์์ ๊ฑฐ์์.
ํ์ง๋ง ๊นํ์ ํน๋ณํ ์ฐธ์กฐ์ ์ด์ฉํด์ ํ ๋ฆฌํ์คํธ ์์ฒด๋ฅผ ํ์ธํ ์ ์์ด์.
PR#1์ ๋ด์ฉ์ pr_1์ด๋ ์ ๋ธ๋์น๋ก ํจ์น ๋ฐ์ผ๋ ค๋ฉด:
$ git fetch origin refs/pull/1/head:pr_1
From github.com:foo/bar
* [new ref] refs/pull/1/head -> pr_1
$ git archive --format zip --output /full/path/to/zipfile.zip master
(master)$ git mv --force myfile MyFile
(master)$ git fetch --all
(master)$ git reset --hard origin/master
(master)$ git rm --cached log.txt
๋ณต๊ตฌํ๊ณ ์ถ์ ํด์๊ฐ c5f567 ์ด๋ผ๊ณ ๊ฐ์ ํ๋ฉด:
(master)$ git checkout c5f567 -- file1/to/restore file2/to/restore
c5f567 ํ ๋จ๊ณ์ ์ผ๋ก ๋ณต๊ตฌํ๊ณ ์ถ๋ค๋ฉด, c5f567~1๋ก ์ ์ด์ค์:
(master)$ git checkout c5f567~1 -- file1/to/restore file2/to/restore
๋ง์ง๋ง ์ปค๋ฐ๊ณผ c5f567์ผ๋ก ๋ถํฐ์ ์ฐจ์ด๋ฅผ ๋น๊ตํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํ๋ฉด:
$ git diff HEAD:path_to_file/file c5f567:path_to_file/file
๋ธ๋์น๋ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก:
$ git diff master:path_to_file/file staging:path_to_file/file
๋งฅOS๋ ๋ฆฌ๋
์ค์๋, ๊น ์ค์ ํ์ผ์ด ~/.gitconfig
์ ์์ด์. ๋จ์ถ์ฉ์ผ๋ก (๋ช๊ฐ๋ ํ์ ์ฐ๋ ์ฉ๋๋ก) ์จ๋ฆฌ์ด์ค ๋ช๊ฐ๋ฅผ ์๋์ ๊ฐ์ด ๊ณ์ ์ถ๊ฐํด์ค๊ณ ์์ด์.
[alias]
a = add
amend = commit --amend
c = commit
ca = commit --amend
ci = commit -a
co = checkout
d = diff
dc = diff --changed
ds = diff --staged
f = fetch
loll = log --graph --decorate --pretty=oneline --abbrev-commit
m = merge
one = log --pretty=oneline
outstanding = rebase -i @{u}
s = status
unpushed = log @{u}
wc = whatchanged
wip = rebase -i @{u}
zap = fetch -p
๋ชปํด์! ๊น์ ์ง์ํ์ง ์๊ฑฐ๋ ์, ๊ทผ๋ฐ ๊ผผ์๊ฐ ์์ด์. ๋๋ ํ ๋ฆฌ์์ .gitignore ํ์ผ์ ์๋ ๋ด์ฉ์ผ๋ก ๋ง๋ค์ด์:
# Ignore everything in this directory
*
# Except this file
!.gitignore
๋ค๋ฅธ ์ผ๋ฐ์ ์ธ ์ปจ๋ฒค์ ์ ๊ทธ ํด๋ ์์ .gitkeep์ด๋ผ๋ ์ด๋ฆ์ ๋น ํ์ผ์ ๋ง๋๋ ๊ฑฐ์์.
$ mkdir mydir
$ touch mydir/.gitkeep
.keep์ด๋ ์ด๋ฆ์ผ๋ก๋ ์ธ ์ ์๋๋ฐ์, ๋๋ฒ์งธ ๋ผ์ธ์ด touch mydir/.keep
๊ฐ ๋์ด์ผ๊ฒ ์ฃ .
์ธ์ฆ์ด ํ์ํ ๋ ํ์งํ ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์์ ํ ๋ฐ์. ์ด๋ฐ ๊ฒฝ์ฐ ์ ์ ๋ช ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์บ์ํ ์ ์์ํ ๋ ๋งค๋ฒ ํธ์/ํ ํ ๋๋ง๋ค ์ ๋ ฅํ ํ์ ์์ด์. ํฌ๋ฆฌ๋ด์ ํฌํผ๊ฐ ํด์ค๊ฑฐ์์.
$ git config --global credential.helper cache
# Set git to use the credential memory cache
$ git config --global credential.helper 'cache --timeout=3600'
# Set the cache to timeout after 1 hour (setting is in seconds)
$ git config core.fileMode false
์ด ๊ฒ์ ๋ก๊ทธ์ธ๋ ์ ์ ์ ๊ธฐ๋ณธ ํ์๋ก ์ค์ ์ผ๋ก ํด๋๋ ค๋ฉด, ์ด๋ ๊ฒ ์จ์:
$ git config --global core.fileMode false
๋ชจ๋ ๋ก์ปฌ ๋ ํ์งํ ๋ฆฌ์ ์ฌ์ฉ๋๋ ์ ์ ์ ๋ณด๋ฅผ ์ค์ ํ๋ ค๋ฉด, ๊ทธ๋ฆฌ๊ณ ๋ฒ์ ์ด๋ ฅ์ ๋ฆฌ๋ทฐํ ๋ ์์๋ณด๊ธฐ ์ฌ์ด ์ด๋ฆ์ผ๋ก ์ค์ ํ๋ ค๋ฉด:
$ git config --global user.name โ[firstname lastname]โ
๊ฐ ์ด๋ ฅ ์์ฐ์์๊ฒ ์ฐ๊ดํด์ ์ด๋ฉ์ผ ์ค์ ์ ํด์ฃผ๋ ค๋ฉด:
git config --global user.email โ[valid-email]โ
์ ์ฌ์ด ๋ฆฌ๋ทฐ๋ฅผ ์ํ ๊น ๋ช ๋ น์ค ์๋ ์์์ ์ค์ ํ๋ ค๋ฉด:
$ git config --global color.ui auto
์, ๋งํ๊ตฐ์. ๋ญ๊ฐ๋ฅผ reset
ํ๊ฑฐ๋, ๋ค๋ฅธ ๋ธ๋์น๋ก ๋จธ์งํ๊ฑฐ๋, ์ง๊ธ์ ์ฐพ์ง ๋ชปํ๋ ์ปค๋ฐ์ผ๋ก ๊ฐ์ ํธ์๋ฅผ ํด๋ฒ๋ ธ๊ตฐ์.
์๋ค์ํผ, ์ด๋ค ์์ ์์ , ์ ํ๊ณ ์์๊ณ ๊ฑฐ๊ธฐ๋ก ๋์๊ฐ๊ณ ์ถ๊ฒ ์ฃ .
์ด๊ฒ ๋ฐ๋ก git reflog
์ ์กด์ฌ์ด์ ์์. reflog
๋ ๋ธ๋์น ๋์ ์ด๋ค ๋ณ๊ฒฝ์ ์ด๋ ๋ธ๋์น๋ ํ๊ทธ์ ์ํด ์ฐธ์กฐ๋์ง ์๋๋ผ๋ ๋ค ๋ณด๊ดํด์.
๊ธฐ๋ณธ์ ์ผ๋ก, HEAD๊ฐ ๋ณ๊ฒฝ๋๋ ๋ชจ๋ ๊ฒฝ์ฐ, ๋ฆฌํ๋ก๊ทธ์ ์๋ก์ด ์
๋ ฅ์ด ์ถ๊ฐ๋ผ์. ์์ฝ๊ฒ๋ ์ด ๊ธฐ๋ฅ์ ๋ก์ปฌ ๋ ํ์งํ ๋ฆฌ์์๋ง ๋์ํด๊ณ , ์ค์ง ์์ง์๋ง์ ํธ๋ํนํด์ (์๋ฅผ ๋ค์๋ฉด ์ด๋์๋ ๊ธฐ๋ก๋์ง ์์๋ ํ์ผ์ ๋ณ๊ฒฝ์ ์๋์์)
(master)$ git reflog
0a2e358 HEAD@{0}: reset: moving to HEAD~2
0254ea7 HEAD@{1}: checkout: moving from 2.2 to master
c10f740 HEAD@{2}: checkout: moving from master to 2.2
์ด ๋ฆฌํ๋ก๊ทธ๋ ๋ง์คํฐ์์ 2.2 ๋ธ๋์น๋ก ์ฒดํฌ์์ํ๊ณ ๋๋๋ฆฐ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ค์.
์ ๊ธฐ์์ , ์ค๋๋ ์ปค๋ฐ์ผ๋ก ๋ฆฌ์
ํ๊ธฐ ์ด๋ ค์์. ์ต์ ํ๋์ด HEAD@{0}
์๋จ ๋ผ๋ฒจ๋ก ๋ณด์ฌ์ง๋ค์.
๋ง์ฝ ์ค์๋ก ๋ค๋ก ์ด๋ํ๋ค๋ฉด, ๋ฆฌํ๋ก๊ทธ๋ ์ค์๋ก ์ง์์ง 2๊ฐ์ ์ปค๋ฐ ์ ์ํ์ธ (0254ea7)๋ฅผ ๊ฐ๋ฆฌํค๋ ์ปค๋ฐ ๋ง์คํฐ๋ฅผ ํฌํจํ ๊ฑฐ์์.
$ git reset --hard 0254ea7
git reset
์ ์ฐ๋ ๊ฒ์ผ๋ก ๋ง์คํฐ๋ฅผ ์ด์ ์ปค๋ฐ์ผ๋ก ๋๋๋ฆด ์ ์์ด์.
์ด๋ ฅ์ด ์ค์๋ก ๋ณ๊ฒฝ๋์ ๋์ ์์ ๋ง์ ์ ๊ณตํ ๊ฑฐ์์.
(์ฌ๊ธฐ์์ ๋ณต์ ํด์ ์์ ํ์ด์).
- Pro Git - Scott Chacon ๊ณผ Ben Straub์ ํ๋ฅญํ ๊น ์ฑ
- Git Internals - Scott Chacon์ ๋๋ค๋ฅธ ํ๋ฅญํ ๊น ์ฑ
- Atlassian's Git tutorial ๊ธฐ์ด๋ถํฐ ๊ณ ๊ธ๊น์ง ํํ ๋ฆฌ์ผ๊ณผ ํจ๊ป ํ๋ ๊น ์ ๋๋ก ์ป๊ธฐ
- Learn Git branching ๋ํํ ์น ๊ธฐ๋ฐ์ ๋ธ๋์น/๋จธ์ง/๋ฆฌ๋ฒ ์ด์ค ํํ ๋ฆฌ์ผ
- Getting solid at Git rebase vs. merge
- git-workflow - Aaron Meurer์ ์ด๋ป๊ฒ ๊น์ ํตํด ์คํ์์ค ๋ ํ์งํ ๋ฆฌ์ ์ด๋ป๊ฒ ๊ธฐ์ฌํ ๊น
- GitHub as a workflow - ๊นํ์ ์ํฌํ๋ก์ฐ๋ก ์ฐ๋ ํฅ๋ฏธ๋ก์ด ์์ , ํนํ ๋น ํ ๋ฆฌํ์คํธ๋ฅผ ํ์ฉํ๋
- Githug - ๋ ์ผ๋ฐ์ ์ธ ๊น ์ํฌํ๋ก์ฐ๋ฅผ ๋ฐฐ์ฐ๋ ๊ฒ์
- firstaidgit.io ๊ฐ์ฅ ๋ง์ด ๋ฌป๋ ๊น ์ง๋ฌธ์, ๊ฒ์๊ฐ๋ฅํ ๋ชจ์
- git-extra-commands - ์ ์ฉํ ๊ธฐํ ๊น ์คํฌ๋ฆฝํธ ๋ชจ์
- git-extras - ๊น ์ ํธ๋ฆฌํฐ -- ๋ ํ์งํ ๋ฆฌ ์์ฝ, repl, ๋ณ๊ฒฝ์ด๋ ฅ ๋ฐ์ง๋, ์์ฑ์ ์ปค๋ฐ ๋น์จ ๋ฑ
- git-fire - git-fire๋ ๋ชจ๋ ํ์ฌ ํ์ผ์ ์ถ๊ฐ,์ปค๋ฐ,์ ๋ธ๋์น๋ก ํธ์(๋จธ์ง๋ฅผ ์๋ฐฉํ๊ธฐ ์ํ) ๋ฑ ๋น์์ฌํ๋ฅผ ๋์์ฃผ๋ ํ๋ฌ๊ทธ์ธ
- git-tips - ์๊ทธ๋งํ ๊น ํ๋ค
- git-town - ํฌ๊ด์ ์ด๊ณ , ๋์ ์์ค์ ๊น ์ํฌํ๋ก์ฐ ์ง์! http://www.git-town.com
- GitKraken - ์์ ๊ณ ๊ธ์ ๊น ํด๋ผ์ด์ธํธ Windows, Mac & Linux
- git-cola - ๋ ๋ค๋ฅธ ๊น ํด๋ผ์ด์ธํธ Windows, OS X
- GitUp - ์์ฃผ ๋ ๋จ์ ์ผ๋ก ๋ฐฉ์์ผ๋ก ๊น์ ๋ณต์กํจ์ ๋ค๋ฃจ๋ ์๋ก์ด GUI
- gitx-dev - ๋๋ค๋ฅธ ๊ทธ๋ํฝ์ ์ธ ๊น ํด๋ผ์ด์ธํธ OS X
- Sourcetree - ์๋ฆ๋ต๊ณ ๋ฌด๋ฃ์ธ ๊น GUI ์์์ ๋จ์ํจ๊ณผ ๊ฐ๋ ฅํจ์ด ๋ง๋ฌ์ด Windows and Mac
- Tower - ๊ทธ๋ํฝ Git ํด๋ผ์ด์ธํธ OS X (์ ๋ฃ)
- tig - ๊น์ ์ํ ํฐ๋ฏผ๋ฌ ํ ์คํธ ๋ชจ๋ ์ธํฐํ์ด์ค
- Magit - Emacs ํจํค์ง๋ฅผ ์ํด ๊ตฌํ๋ ๊น ์ธํฐํ์ด์ค
- GitExtensions - ์ ํ์ฅ, ๋น์ฃผ์ผ ์คํฌ๋์ค 2010-2015 ํ๋ฌ๊ทธ์ธ ๊ทธ๋ฆฌ๊ณ ๋ ์์ ์ธ ๊น ๋ ํ์งํ ๋ฆฌ ๋๊ตฌ
- Fork - ๋น ๋ฅด๊ณ ์น์ํ ๊น ํด๋ผ์ด์ธํธ Mac (๋ฒ ํ)
- gmaster - 3-way ๋จธ์ง, ๋ฆฌํฉํฐ ๋ถ์๊ธฐ, ์๋ฉํฑ diff์ ๋จธ์ง ๊ธฐ๋ฅ์ ์๋ ์ ์ฉ ๊น ํด๋ผ์ด์ธํธ (๋ฒ ํ)
- gitk - ๊ฐ๋จํ ๋ ํ์งํ ๋ฆฌ ์ํ๋ฅผ ๋ณผ ์ ์๋ ๋ฆฌ๋ ์ค ๊น ํด๋ผ์ด์ธํธ