# ๊น์ ์ํ flight rules
๐
*[English](README.md) โ [Espaรฑol](README_es.md) โ [ะ ัััะบะธะน](README_ru.md) โ [็ฎไฝไธญๆ](README_zh-CN.md)โ [ํ๊ตญ์ด](README_kr.md) โ [Tiแบฟng Viแปt](README_vi.md)*
#### flight rules ๊ฐ ๋ญ์ผ?
๋ญ๊ฐ ์๋ชป ๋์ ๋ ๋ญ ํด์ผํ ์ง์ ๋ํ [์ฐ์ฃผ๋นํ์ฌ๋ฅผ ์ํ ๊ฐ์ด๋](https://www.jsc.nasa.gov/news/columbia/fr_generic.pdf) (์ฌ๊ธฐ์ ๊น์ ์ฐ๋ ๊ฐ๋ฐ์๋ฅผ ์ํ)
> *Flight Rules* ๋ ์ด๋ค ๋ฌธ์ X๊ฐ ๋ฐ์ํ ์ด์ ์ ๊ทธ ๋จ๊ณ์ ๋งค๋ด์ผ์์ ์ด๋ ต์ฌ๋ฆฌ ์ป์ ์ง์์ด์์. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ ์๋๋ฆฌ์ค์ ๋งค์ฐ ์์ธํ๊ณ ๊ตฌ์ฒด์ ์ธ ์ด์ ์ ์ฐจ๋๋๋ค. [...]
> NASA๋ ์์ฑ(Mercury) ์๋ ๋ ์ง์ํ์์ ์ฒ์์ผ๋ก "lessons learned" ์ด๋ ๊ฒ์ ๋ชจ์๋๋ฐ ์์ฒ๊ฐ์ ๋ฌธ์ ์ ์ํฉ๋ค, ๋ถ์์ง ํด์น ์์ก์ด๋ก ์ธํ ์์ง ๊ณ ์ฅ๋ถํฐ ์ปดํจํฐ ๋ฌธ์ ๊ทธ๋ฆฌ๊ณ ๊ทธ ํด๋ต๊น์ง, 1960๋
๋ ์ด๋ถํฐ ์ฐ๋ฆฌ์ ์ค์๋ค, ์ฌ์๋ค, ํด๊ฒฐ์ฑ
๋ฑ์ด ๋ชฉ๋กํ ๋ผ์์ด์.
โ Chris Hadfield, *์ธ์์ ์ํ ์ฐ์ฃผ๋นํ์ฌ์ ๊ฐ์ด๋*.
#### ์ด ๋ฌธ์์ ๊ท์น
๋ช
ํํ๊ฒ ํ๊ธฐ ์ํด ์ด ๋ฌธ์์ ๋ชจ๋ ์์ ๋ ํ์ฌ ๋ธ๋์น๋ฅผ ํ์ํ๊ณ ์คํ
์ด์ง์ ๋ณ๊ฒฝ์ด ์๋์ง๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ์ปค์คํ
๋ ๋ฐฐ์ ํ๋กฌํํธ๋ฅผ ์จ์. ๋ธ๋์น๋ ๊ดํธ ์์ ์๊ณ , ๋ธ๋์น ๋ค์์ *๋ ์คํ
์ด์ง์ ๋ณ๊ฒฝ๋ ๊ฒ์ ๋ํ๋ด์.
[](https://gitter.im/k88hudson/git-flight-rules?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*
- [๋ ํ์งํ ๋ฆฌ](#%EB%A0%88%ED%8C%8C%EC%A7%80%ED%86%A0%EB%A6%AC)
- [๋ก์ปฌ ๋ ํ์งํ ๋ฆฌ์์ ์์ํ๊ณ ์ถ์ด](#%EB%A1%9C%EC%BB%AC-%EB%A0%88%ED%8C%8C%EC%A7%80%ED%86%A0%EB%A6%AC%EC%97%90%EC%84%9C-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๋ ๋ฆฌ๋ชจํธ ๋ ํ์งํ ๋ฆฌ๋ฅผ ๋ณต์ ํด์ค๊ณ ์ถ์ด](#%EB%82%9C-%EB%A6%AC%EB%AA%A8%ED%8A%B8-%EB%A0%88%ED%8C%8C%EC%A7%80%ED%86%A0%EB%A6%AC%EB%A5%BC-%EB%B3%B5%EC%A0%9C%ED%95%B4%EC%98%A4%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [์ปค๋ฐ ์์ ](#%EC%BB%A4%EB%B0%8B-%EC%88%98%EC%A0%95)
- [๋ด๊ฐ ๋ฐฉ๊ธ ์ด๋ค ์ปค๋ฐ์ ๋จ๊ฒผ์ง?](#%EB%82%B4%EA%B0%80-%EB%B0%A9%EA%B8%88-%EC%96%B4%EB%96%A4-%EC%BB%A4%EB%B0%8B%EC%9D%84-%EB%82%A8%EA%B2%BC%EC%A7%80)
- [์ปค๋ฐ ๋ฉ์ธ์ง๋ฅผ ์๋ชป ์ผ์ด](#%EC%BB%A4%EB%B0%8B-%EB%A9%94%EC%84%B8%EC%A7%80%EB%A5%BC-%EC%9E%98%EB%AA%BB-%EC%8D%BC%EC%96%B4)
- [์ปค๋ฐ์ ๋ค๋ฅธ ์ด๋ฆ๊ณผ ์ด๋ฉ์ผ ์ค์ ์ผ๋ก ํด๋ฒ๋ ธ์ด](#%EC%BB%A4%EB%B0%8B%EC%9D%84-%EB%8B%A4%EB%A5%B8-%EC%9D%B4%EB%A6%84%EA%B3%BC-%EC%9D%B4%EB%A9%94%EC%9D%BC-%EC%84%A4%EC%A0%95%EC%9C%BC%EB%A1%9C-%ED%95%B4%EB%B2%84%EB%A0%B8%EC%96%B4)
- [์ง๋ ์ปค๋ฐ์์ ํ์ผ ํ๋๋ฅผ ์ง์ฐ๊ณ ์ถ์ด](#%EC%A7%80%EB%82%9C-%EC%BB%A4%EB%B0%8B%EC%97%90%EC%84%9C-%ED%8C%8C%EC%9D%BC-%ED%95%98%EB%82%98%EB%A5%BC-%EC%A7%80%EC%9A%B0%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๋ง์ง๋ง ์ปค๋ฐ์ ์ง์ฐ๊ณ ์ถ์ด](#%EB%A7%88%EC%A7%80%EB%A7%89-%EC%BB%A4%EB%B0%8B%EC%9D%84-%EC%A7%80%EC%9A%B0%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [์์์ ์ธ ์ปค๋ฐ ์ง์ฐ๊ธฐ](#%EC%9E%84%EC%9D%98%EC%A0%81%EC%9D%B8-%EC%BB%A4%EB%B0%8B-%EC%A7%80%EC%9A%B0%EA%B8%B0)
- [์์ ๋ ์ปค๋ฐ์ ํธ์ํ๋๋ฐ, ์๋ฌ ๋ฉ์ธ์ง๊ฐ ๋ ](#%EC%88%98%EC%A0%95%EB%90%9C-%EC%BB%A4%EB%B0%8B%EC%9D%84-%ED%91%B8%EC%8B%9C%ED%96%88%EB%8A%94%EB%8D%B0-%EC%97%90%EB%9F%AC-%EB%A9%94%EC%84%B8%EC%A7%80%EA%B0%80-%EB%96%A0)
- [ํ๋ ๋ฆฌ์
์ ํด๋ฒ๋ ธ๋๋ฐ ๋๋๋ฆฌ๊ณ ์ถ์ด](#%ED%95%98%EB%93%9C-%EB%A6%AC%EC%85%8B%EC%9D%84-%ED%95%B4%EB%B2%84%EB%A0%B8%EB%8A%94%EB%8D%B0-%EB%90%98%EB%8F%8C%EB%A6%AC%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๋จธ์ง๋ฅผ ์ค์๋ก ์ปค๋ฐ, ํธ์ํด๋ฒ๋ ธ์ด](#%EB%A8%B8%EC%A7%80%EB%A5%BC-%EC%8B%A4%EC%88%98%EB%A1%9C-%EC%BB%A4%EB%B0%8B-%ED%91%B8%EC%8B%9C%ED%95%B4%EB%B2%84%EB%A0%B8%EC%96%B4)
- [์คํ
์ด์ง](#%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80)
- [์ง๋ ์ปค๋ฐ์ ์คํ
์ด์ง ๋ณ๊ฒฝ์ ์ ์ถ๊ฐํ๊ณ ์ถ์ด](#%EC%A7%80%EB%82%9C-%EC%BB%A4%EB%B0%8B%EC%97%90-%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80-%EB%B3%80%EA%B2%BD%EC%A0%90%EC%9D%84-%EC%B6%94%EA%B0%80%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [์ ์ฒด๊ฐ ์๋ ์ ํ์ผ๋ง ์คํ
์ด์ง์ ์ฌ๋ฆฌ๊ณ ์ถ์ด](#%EC%A0%84%EC%B2%B4%EA%B0%80-%EC%95%84%EB%8B%8C-%EC%83%88-%ED%8C%8C%EC%9D%BC%EB%A7%8C-%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80%EC%97%90-%EC%98%AC%EB%A6%AC%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [ํ๋์ ํ์ผ ๋ณ๊ฒฝ์ ์ ๋๊ฐ์ ๋ค๋ฅธ ์ปค๋ฐ์ ๋จ๊ธฐ๊ณ ์ถ์ด](#%ED%95%98%EB%82%98%EC%9D%98-%ED%8C%8C%EC%9D%BC-%EB%B3%80%EA%B2%BD%EC%A0%90%EC%9D%84-%EB%91%90%EA%B0%9C%EC%9D%98-%EB%8B%A4%EB%A5%B8-%EC%BB%A4%EB%B0%8B%EC%97%90-%EB%82%A8%EA%B8%B0%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [์์ง ์คํ
์ด์ง์ ์ ์ฌ๋ผ๊ฐ ๋ณ๊ฒฝ์ ์ ์คํ
์ด์ง์ ์ถ๊ฐํ๊ณ , ์คํ
์ด์ง์ ์๋ ๋ณ๊ฒฝ์ ์ ๋ค์ ๋นผ๊ณ ์ถ์ด](#%EC%95%84%EC%A7%81-%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80%EC%97%90-%EC%95%88-%EC%98%AC%EB%9D%BC%EA%B0%84-%EB%B3%80%EA%B2%BD%EC%A0%90%EC%9D%84-%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80%EC%97%90-%EC%B6%94%EA%B0%80%ED%95%98%EA%B3%A0-%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80%EC%97%90-%EC%9E%88%EB%8A%94-%EB%B3%80%EA%B2%BD%EC%A0%90%EC%9D%84-%EB%8B%A4%EC%8B%9C-%EB%B9%BC%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [์คํ
์ด์ง ์ ์ ๋ณ๊ฒฝ์ ](#%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80-%EC%A0%84%EC%9D%98-%EB%B3%80%EA%B2%BD%EC%A0%90)
- [์คํ
์ด์ง ์ ์ ๋ณ๊ฒฝ์ ์ ์ ๋ธ๋์น๋ก ์ฎ๊ธฐ๊ณ ์ถ์ด](#%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80-%EC%A0%84%EC%9D%98-%EB%B3%80%EA%B2%BD%EC%A0%90%EC%9D%84-%EC%83%88-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%A1%9C-%EC%98%AE%EA%B8%B0%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [์คํ
์ด์ง์ ๋ณ๊ฒฝ์ ์ ๋ง๋ค์ด๋ ๋ค๋ฅธ ๋ธ๋์น๋ก ์ฎ๊ธฐ๊ณ ์ถ์ด](#%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80%EC%A0%84-%EB%B3%80%EA%B2%BD%EC%A0%90%EC%9D%84-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%91%94-%EB%8B%A4%EB%A5%B8-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%A1%9C-%EC%98%AE%EA%B8%B0%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๋ด ๋ก์ปฌ์ ์๋ ์ปค๋ฐ ์๋ ๋ณ๊ฒฝ์ ์ ๋ค ๋ฌด์ํ๊ณ ์ถ์ด (์คํ
์ด์ง ๋๋ ์๋๋)](#%EB%82%B4-%EB%A1%9C%EC%BB%AC%EC%97%90-%EC%9E%88%EB%8A%94-%EC%BB%A4%EB%B0%8B-%EC%95%88%EB%90%9C-%EB%B3%80%EA%B2%BD%EC%A0%90%EC%9D%84-%EB%8B%A4-%EB%AC%B4%EC%8B%9C%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%96%B4-%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%95-%EB%90%90%EB%8D%98-%EC%95%88%EB%90%90%EB%8D%98)
- [์คํ
์ด์ง ์๋ ํน์ ๋ณ๊ฒฝ์ ์ ์ง์ฐ๊ณ ์ถ์ด](#%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80-%EC%95%88%EB%90%9C-%ED%8A%B9%EC%A0%95-%EB%B3%80%EA%B2%BD%EC%A0%90%EC%9D%84-%EC%A7%80%EC%9A%B0%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [์คํ
์ด์ง ์๋ ํน์ ํ์ผ์ ์ง์ฐ๊ณ ์ถ์ด](#%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80-%EC%95%88%EB%90%9C-%ED%8A%B9%EC%A0%95-%ED%8C%8C%EC%9D%BC%EC%9D%84-%EC%A7%80%EC%9A%B0%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๋ก์ปฌ์ ์๋ ์คํ
์ด์ง ์๋ ๋ณ๊ฒฝ์ ๋ง ์ง์ฐ๊ณ ์ถ์ด](#%EB%A1%9C%EC%BB%AC%EC%97%90-%EC%9E%88%EB%8A%94-%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80-%EC%95%88%EB%90%9C-%EB%B3%80%EA%B2%BD%EC%A0%90%EB%A7%8C-%EC%A7%80%EC%9A%B0%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [ํธ๋ํน ์๋ ํ์ผ๋ค ๋ค ์ง์ฐ๊ณ ์ถ์ด](#%ED%8A%B8%EB%9E%98%ED%82%B9-%EC%95%88%EB%90%9C-%ED%8C%8C%EC%9D%BC%EB%93%A4-%EB%8B%A4-%EC%A7%80%EC%9A%B0%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๋ธ๋์น](#%EB%B8%8C%EB%9E%9C%EC%B9%98)
- [๋ชจ๋ ๋ธ๋์น ๋ฆฌ์คํธ๋ฅผ ๋ณด๊ณ ์ถ์ด](#%EB%AA%A8%EB%93%A0-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC-%EB%B3%B4%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [์ปค๋ฐ์์ ๋ธ๋์น ๋ง๋ค๊ธฐ](#%EC%BB%A4%EB%B0%8B%EC%97%90%EC%84%9C-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%A7%8C%EB%93%A4%EA%B8%B0)
- [๋ค๋ฅธ ๋ธ๋์น์์ ํ์ ๋ฐ์์๋ฒ๋ ธ์ด](#%EB%8B%A4%EB%A5%B8-%EB%B8%8C%EB%9E%9C%EC%B9%98%EC%97%90%EC%84%9C-%ED%92%80%EC%9D%84-%EB%B0%9B%EC%95%84%EC%99%80%EB%B2%84%EB%A0%B8%EC%96%B4)
- [๋ก์ปฌ์ ์ปค๋ฐ์ ์ง์์ ์๋ฒ์ ์๋ ๋ด ๋ธ๋์น์ ๋ง์ถ๊ณ ์ถ์ด](#%EB%A1%9C%EC%BB%AC%EC%9D%98-%EC%BB%A4%EB%B0%8B%EC%9D%84-%EC%A7%80%EC%9B%8C%EC%84%9C-%EC%84%9C%EB%B2%84%EC%97%90-%EC%9E%88%EB%8A%94-%EB%82%B4-%EB%B8%8C%EB%9E%9C%EC%B9%98%EC%99%80-%EB%A7%9E%EC%B6%94%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [์ ๋ธ๋์น ๋์ ์ ๋ง์คํฐ์ ์ปค๋ฐ์ ํด๋ฒ๋ ธ์ด](#%EC%83%88-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%8C%80%EC%8B%A0%EC%97%90-%EB%A7%88%EC%8A%A4%ED%84%B0%EC%97%90-%EC%BB%A4%EB%B0%8B%EC%9D%84-%ED%95%B4%EB%B2%84%EB%A0%B8%EC%96%B4)
- [๋ค๋ฅธ ๋ ํผ๋ฐ์ค ๊ฐ์ ๊ณณ์์ ๋ชจ๋ ํ์ผ์ ์ ์งํ๊ณ ์ถ์ด](#%EB%8B%A4%EB%A5%B8-%EB%A0%88%ED%8D%BC%EB%9F%B0%EC%8A%A4-%EA%B0%99%EC%9D%80-%EA%B3%B3%EC%97%90%EC%84%9C-%EB%AA%A8%EB%93%A0-%ED%8C%8C%EC%9D%BC%EC%9D%84-%EC%9C%A0%EC%A7%80%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [ํ ๋ธ๋์น์ ๋ค๋ฅธ ๋ธ๋์น์ ๋จ๊ฒผ์ด์ผ ํ๋ ์ปค๋ฐ์ ์ฌ๋ฌ๊ฐ ๋จ๊ฒผ์ด](#%ED%95%9C-%EB%B8%8C%EB%9E%9C%EC%B9%98%EC%97%90-%EB%8B%A4%EB%A5%B8-%EB%B8%8C%EB%9E%9C%EC%B9%98%EC%97%90-%EB%82%A8%EA%B2%BC%EC%96%B4%EC%95%BC-%ED%95%98%EB%8A%94-%EC%BB%A4%EB%B0%8B%EC%9D%84-%EC%97%AC%EB%9F%AC%EA%B0%9C-%EB%82%A8%EA%B2%BC%EC%96%B4)
- [์
์คํธ๋ฆผ์์ ์ง์์ง ๋ก์ปฌ ๋ธ๋์น๋ฅผ ์ง์ฐ๊ณ ์ถ์ด](#%EC%97%85%EC%8A%A4%ED%8A%B8%EB%A6%BC%EC%97%90%EC%84%A0-%EC%A7%80%EC%9B%8C%EC%A7%84-%EB%A1%9C%EC%BB%AC-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%A5%BC-%EC%A7%80%EC%9A%B0%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๋ธ๋์น๋ฅผ ์ง์๋ฒ๋ ธ์ด](#%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%A5%BC-%EC%A7%80%EC%9B%8C%EB%B2%84%EB%A0%B8%EC%96%B4)
- [๋ธ๋์น๋ฅผ ์ง์ฐ๊ณ ์ถ์ด](#%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%A5%BC-%EC%A7%80%EC%9A%B0%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [์ฌ๋ฌ๊ฐ์ ๋ธ๋์น๋ฅผ ์ง์ฐ๊ณ ์ถ์ด](#%EC%97%AC%EB%9F%AC%EA%B0%9C%EC%9D%98-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%A5%BC-%EC%A7%80%EC%9A%B0%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๋ธ๋์น ์ด๋ฆ์ ๋ฐ๊พธ๊ณ ์ถ์ด](#%EB%B8%8C%EB%9E%9C%EC%B9%98-%EC%9D%B4%EB%A6%84%EC%9D%84-%EB%B0%94%EA%BE%B8%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๋ค๋ฅธ ์ฌ๋์ด ์์
์ค์ธ ๋ฆฌ๋ชจํธ ๋ธ๋์น๋ก ์ฒดํฌ์์ ํ๊ณ ์ถ์ด](#%EB%8B%A4%EB%A5%B8-%EC%82%AC%EB%9E%8C%EC%9D%B4-%EC%9E%91%EC%97%85%EC%A4%91%EC%9D%B8-%EB%A6%AC%EB%AA%A8%ED%8A%B8-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%A1%9C-%EC%B2%B4%ED%81%AC%EC%95%84%EC%9B%83-%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [ํ์ฌ ๋ก์ปฌ ๋ธ๋์น๋ก ์๋ก์ด ๋ฆฌ๋ชจํธ ๋ธ๋์น๋ฅผ ๋ง๋ค๊ณ ์ถ์ด](#%ED%98%84%EC%9E%AC-%EB%A1%9C%EC%BB%AC-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%A1%9C-%EC%83%88%EB%A1%9C%EC%9A%B4-%EB%A6%AC%EB%AA%A8%ED%8A%B8-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%A5%BC-%EB%A7%8C%EB%93%A4%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๋ฆฌ๋ชจํธ ๋ธ๋์น๋ฅผ ๋ก์ปฌ ๋ธ๋์น๋ฅผ ์ํ ์
์คํธ๋ฆผ์ผ๋ก ์ค์ ํ๊ณ ์ถ์ด](#%EB%A6%AC%EB%AA%A8%ED%8A%B8-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%A5%BC-%EB%A1%9C%EC%BB%AC-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%97%85%EC%8A%A4%ED%8A%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%84%A4%EC%A0%95%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [HEAD๋ฅผ ๊ธฐ๋ณธ ๋ฆฌ๋ชจํธ ๋ธ๋์น๋ก ํธ๋ํนํ๋๋ก ์ค์ ํ๊ณ ์ถ์ด](#head%EB%A5%BC-%EA%B8%B0%EB%B3%B8-%EB%A6%AC%EB%AA%A8%ED%8A%B8-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%A1%9C-%ED%8A%B8%EB%9E%98%ED%82%B9%ED%95%98%EB%8F%84%EB%A1%9D-%EC%84%A4%EC%A0%95%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๋ค๋ฅธ ๋ธ๋์น์ ๋ณ๊ฒฝ์ ์ ์๋ชป ๋จ๊ฒผ์ด](#%EB%8B%A4%EB%A5%B8-%EB%B8%8C%EB%9E%9C%EC%B9%98%EC%97%90-%EB%B3%80%EA%B2%BD%EC%A0%90%EC%9D%84-%EC%9E%98%EB%AA%BB-%EB%82%A8%EA%B2%BC%EC%96%B4)
- [๋ฆฌ๋ฒ ์ด์ค์ ๋จธ์ง](#%EB%A6%AC%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%99%80-%EB%A8%B8%EC%A7%80)
- [๋ฆฌ๋ฒ ์ด์ค/๋จธ์ง ํ ๊ฑธ ๋๋๋ฆฌ๊ณ ์ถ์ด](#%EB%A6%AC%EB%B2%A0%EC%9D%B4%EC%8A%A4%EB%A8%B8%EC%A7%80-%ED%95%9C-%EA%B1%B8-%EB%90%98%EB%8F%8C%EB%A6%AC%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๋ฆฌ๋ฒ ์ด์ค๋ฅผ ํ๋๋ฐ, ๊ฐ์ ํธ์ํ๊ณ ์ถ์ง ์์](#%EB%A6%AC%EB%B2%A0%EC%9D%B4%EC%8A%A4%EB%A5%BC-%ED%96%88%EB%8A%94%EB%8D%B0-%EA%B0%95%EC%A0%9C-%ED%91%B8%EC%8B%9C%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%A7%84-%EC%95%8A%EC%95%84)
- [์ปค๋ฐ๋ผ๋ฆฌ ํฉ์น๊ณ ์ถ์ด](#%EC%BB%A4%EB%B0%8B%EB%81%BC%EB%A6%AC-%ED%95%A9%EC%B9%98%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [์์ ํ ๋จธ์ง ์ ๋ต](#%EC%95%88%EC%A0%84%ED%95%9C-%EB%A8%B8%EC%A7%80-%EC%A0%84%EB%9E%B5)
- [๋ธ๋์น๋ฅผ ์ปค๋ฐ ํ๋๋ก ๋จธ์งํด์ผํด](#%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%A5%BC-%EC%BB%A4%EB%B0%8B-%ED%95%98%EB%82%98%EB%A1%9C-%EB%A8%B8%EC%A7%80%ED%95%B4%EC%95%BC%ED%95%B4)
- [ํธ์ ๋์ง ์์ ์ปค๋ฐ๋ง ํฉ์น๊ณ ์ถ์ด](#%ED%91%B8%EC%8B%9C-%EB%90%98%EC%A7%80-%EC%95%8A%EC%9D%80-%EC%BB%A4%EB%B0%8B%EB%A7%8C-%ED%95%A9%EC%B9%98%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๋จธ์ง๋ฅผ ์ค๋จํด์ผํด](#%EB%A8%B8%EC%A7%80%EB%A5%BC-%EC%A4%91%EB%8B%A8%ED%95%B4%EC%95%BC%ED%95%B4)
- [๋ธ๋์น๋ด ๋ชจ๋ ์ปค๋ฐ์ด ๋จธ์ง๋๋์ง ํ์ธํด](#%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%82%B4-%EB%AA%A8%EB%93%A0-%EC%BB%A4%EB%B0%8B%EC%9D%B4-%EB%A8%B8%EC%A7%80%EB%90%90%EB%8A%94%EC%A7%80-%ED%99%95%EC%9D%B8%ED%95%B4)
- [๋ํํ ๋ฆฌ๋ฒ ์ด์ค๋ก ๋ฐ์๊ฐ๋ฅํ ์ด์](#%EB%8C%80%ED%99%94%ED%98%95-%EB%A6%AC%EB%B2%A0%EC%9D%B4%EC%8A%A4%EB%A1%9C-%EB%B0%9C%EC%83%9D%EA%B0%80%EB%8A%A5%ED%95%9C-%EC%9D%B4%EC%8A%88)
- [๋ฆฌ๋ฒ ์ด์ค ํธ์ง ํ๋ฉด์์ 'noop'](#%EB%A6%AC%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%8E%B8%EC%A7%91-%ED%99%94%EB%A9%B4%EC%97%90%EC%84%9C-noop)
- [์ถฉ๋์ด ์์ด](#%EC%B6%A9%EB%8F%8C%EC%9D%B4-%EC%9E%88%EC%96%B4)
- [์คํ
์ด์](#%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%8B%9C)
- [๋ชจ๋ ๋ณ๊ฒฝ์ ์คํ
์ด์ ํ๊ธฐ](#%EB%AA%A8%EB%93%A0-%EB%B3%80%EA%B2%BD%EC%A0%90-%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%8B%9C-%ED%95%98%EA%B8%B0)
- [ํน์ ํ์ผ๋ค๋ง ์คํ
์ด์ ํ๊ธฐ](#%ED%8A%B9%EC%A0%95-%ED%8C%8C%EC%9D%BC%EB%93%A4%EB%A7%8C-%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%8B%9C-%ED%95%98%EA%B8%B0)
- [๋ฉ์ธ์ง์ ํจ๊ป ์คํ
์ด์ ํ๊ธฐ](#%EB%A9%94%EC%84%B8%EC%A7%80%EC%99%80-%ED%95%A8%EA%BB%98-%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%8B%9C-%ED%95%98%EA%B8%B0)
- [ํน์ ์คํ
์ด์ ๋ชฉ๋ก์์ ๊ฐ์ ธ์ ์ ์ฉํ๊ธฐ](#%ED%8A%B9%EC%A0%95-%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%8B%9C-%EB%AA%A9%EB%A1%9D%EC%97%90%EC%84%9C-%EA%B0%80%EC%A0%B8%EC%99%80-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0)
- [์ฐพ์๋ณด๊ธฐ](#%EC%B0%BE%EC%95%84%EB%B3%B4%EA%B8%B0)
- [์ด๋ค ์ปค๋ฐ์์ ๋ฌธ์์ด์ ์ฐพ๊ณ ์ถ์ด](#%EC%96%B4%EB%96%A4-%EC%BB%A4%EB%B0%8B%EC%97%90%EC%84%9C-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84-%EC%B0%BE%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [์์ฑ์๋ ์ปค๋ฏธํฐ๋ฅผ ์ฐพ๊ณ ์ถ์ด](#%EC%9E%91%EC%84%B1%EC%9E%90%EB%82%98-%EC%BB%A4%EB%AF%B8%ED%84%B0%EB%A5%BC-%EC%B0%BE%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [ํน์ ํ์ผ์ด ํฌํจ๋ ์ปค๋ฐ์ ๋ชฉ๋กํ ํ๊ณ ์ถ์ด](#%ED%8A%B9%EC%A0%95-%ED%8C%8C%EC%9D%BC%EC%9D%B4-%ED%8F%AC%ED%95%A8%EB%90%9C-%EC%BB%A4%EB%B0%8B%EC%9D%84-%EB%AA%A9%EB%A1%9D%ED%99%94-%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [์ปค๋ฐ์ ์ฐธ์กฐํ๋ ํ๊ทธ๋ฅผ ์ฐพ๊ณ ์ถ์ด](#%EC%BB%A4%EB%B0%8B%EC%9D%84-%EC%B0%B8%EC%A1%B0%ED%95%98%EB%8A%94-%ED%83%9C%EA%B7%B8%EB%A5%BC-%EC%B0%BE%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [์๋ธ๋ชจ๋](#%EC%84%9C%EB%B8%8C%EB%AA%A8%EB%93%88)
- [๋ชจ๋ ์๋ธ๋ชจ๋์ ํด๋ก ํ๊ธฐ](#%EB%AA%A8%EB%93%A0-%EC%84%9C%EB%B8%8C%EB%AA%A8%EB%93%88%EC%9D%84-%ED%81%B4%EB%A1%A0%ED%95%98%EA%B8%B0)
- [์๋ธ๋ชจ๋ ์ง์ฐ๊ธฐ](#%EC%84%9C%EB%B8%8C%EB%AA%A8%EB%93%88-%EC%A7%80%EC%9A%B0%EA%B8%B0)
- [๊ธฐํ ํญ๋ชฉ๋ค](#%EA%B8%B0%ED%83%80-%ED%95%AD%EB%AA%A9%EB%93%A4)
- [์ง์ด ํ์ผ ๋ณต๊ตฌํ๊ธฐ](#%EC%A7%80%EC%9A%B4-%ED%8C%8C%EC%9D%BC-%EB%B3%B5%EA%B5%AC%ED%95%98%EA%B8%B0)
- [ํ๊ทธ ์ง์ฐ๊ธฐ](#%ED%83%9C%EA%B7%B8-%EC%A7%80%EC%9A%B0%EA%B8%B0)
- [์ง์์ง ํ๊ทธ ๋ณต๊ตฌํ๊ธฐ](#%EC%A7%80%EC%9B%8C%EC%A7%84-%ED%83%9C%EA%B7%B8-%EB%B3%B5%EA%B5%AC%ED%95%98%EA%B8%B0)
- [์ง์์ง ํจ์น](#%EC%A7%80%EC%9B%8C%EC%A7%84-%ED%8C%A8%EC%B9%98)
- [Zipํ์ผ๋ก ๋ ํ์งํ ๋ฆฌ ์ถ์ถํ๊ธฐ](#zip%ED%8C%8C%EC%9D%BC%EB%A1%9C-%EB%A0%88%ED%8C%8C%EC%A7%80%ED%86%A0%EB%A6%AC-%EC%B6%94%EC%B6%9C%ED%95%98%EA%B8%B0)
- [ํ์ผ ์ถ์ ํ๊ธฐ](#%ED%8C%8C%EC%9D%BC-%EC%B6%94%EC%A0%81%ED%95%98%EA%B8%B0)
- [ํ์ผ ๋ด์ฉ์ ๋ณ๊ฒฝ์ด ์์ด ํ์ผ ์ด๋ฆ์ ์๊ธ์๋ง ๋๋ฌธ์๋ก ๋ฐ๊พธ๊ณ ์ถ์ด](#%ED%8C%8C%EC%9D%BC-%EB%82%B4%EC%9A%A9%EC%97%94-%EB%B3%80%EA%B2%BD%EC%9D%B4-%EC%97%86%EC%9D%B4-%ED%8C%8C%EC%9D%BC-%EC%9D%B4%EB%A6%84%EC%9D%84-%EC%95%9E%EA%B8%80%EC%9E%90%EB%A7%8C-%EB%8C%80%EB%AC%B8%EC%9E%90%EB%A1%9C-%EB%B0%94%EA%BE%B8%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๊น ํ ๋ฐ์๋ ๋ก์ปฌ ํ์ผ์ ๋ฎ์ด์์ฐ๊ณ ์ถ์ด](#%EA%B9%83-%ED%92%80-%EB%B0%9B%EC%9D%84%EB%95%8C-%EB%A1%9C%EC%BB%AC-%ED%8C%8C%EC%9D%BC%EC%9D%84-%EB%8D%AE%EC%96%B4%EC%94%8C%EC%9A%B0%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [ํ์ผ์ ๋ก์ปฌ์๋ ๋ณด๊ดํ๊ณ ๊น์์ ์ง์ฐ๊ณ ์ถ์ด](#%ED%8C%8C%EC%9D%BC%EC%9D%84-%EB%A1%9C%EC%BB%AC%EC%97%90%EB%8A%94-%EB%B3%B4%EA%B4%80%ED%95%98%EA%B3%A0-%EA%B9%83%EC%97%90%EC%84%9C-%EC%A7%80%EC%9A%B0%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [ํน์ ํ ๋ฒ์ ๋๋ก ํ์ผ์ ๋ณต๊ตฌํ๊ณ ์ถ์ด](#%ED%8A%B9%EC%A0%95%ED%95%9C-%EB%B2%84%EC%A0%84%EB%8C%80%EB%A1%9C-%ED%8C%8C%EC%9D%BC%EC%9D%84-%EB%B3%B5%EA%B5%AC%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [์ปค๋ฐ๊ณผ ๋ธ๋์น ๊ฐ์ ํน์ ํ์ผ ๋ณ๊ฒฝ ์ด๋ ฅ์ด ํ์ํด](#%EC%BB%A4%EB%B0%8B%EA%B3%BC-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EA%B0%84%EC%9D%98-%ED%8A%B9%EC%A0%95-%ED%8C%8C%EC%9D%BC-%EB%B3%80%EA%B2%BD-%EC%9D%B4%EB%A0%A5%EC%9D%B4-%ED%95%84%EC%9A%94%ED%95%B4)
- [์ค์ ](#%EC%84%A4%EC%A0%95)
- [๊น ๋ช
๋ น์ด ๋ช ๊ฐ๋ฅผ ์จ๋ฆฌ์ด์ค ๋ฑ๋กํ๊ณ ์ถ์ด](#%EA%B9%83-%EB%AA%85%EB%A0%B9%EC%96%B4-%EB%AA%87-%EA%B0%9C%EB%A5%BC-%EC%95%A8%EB%A6%AC%EC%96%B4%EC%8A%A4-%EB%93%B1%EB%A1%9D%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๋ ํ์งํ ๋ฆฌ์ ๋น ๋๋ ํ ๋ฆฌ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ด](#%EB%A0%88%ED%8C%8C%EC%A7%80%ED%86%A0%EB%A6%AC%EC%97%90-%EB%B9%88-%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EB%A5%BC-%EC%B6%94%EA%B0%80%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๋ ํ์งํ ๋ฆฌ ์ ์ ๋ช
๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์บ์ํด๋๊ณ ์ถ์ด](#%EB%A0%88%ED%8C%8C%EC%A7%80%ED%86%A0%EB%A6%AC-%EC%9C%A0%EC%A0%80%EB%AA%85%EA%B3%BC-%EB%B9%84%EB%B0%80%EB%B2%88%ED%98%B8%EB%A5%BC-%EC%BA%90%EC%8B%9C%ED%95%B4%EB%91%90%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๊น์ด ๊ถํ๊ณผ ํ์ผ๋ชจ๋ ๋ณ๊ฒฝ์ ๋ฌด์ํ๊ฒ ๋ง๋ค๊ณ ์ถ์ด](#%EA%B9%83%EC%9D%B4-%EA%B6%8C%ED%95%9C%EA%B3%BC-%ED%8C%8C%EC%9D%BC%EB%AA%A8%EB%93%9C-%EB%B3%80%EA%B2%BD%EC%9D%84-%EB%AC%B4%EC%8B%9C%ED%95%98%EA%B2%8C-%EB%A7%8C%EB%93%A4%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๊ธ๋ก๋ฒ ์ ์ ๋ก ์ค์ ํด๋๊ณ ์ถ์ด](#%EA%B8%80%EB%A1%9C%EB%B2%8C-%EC%9C%A0%EC%A0%80%EB%A1%9C-%EC%84%A4%EC%A0%95%ED%95%B4%EB%91%90%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๊น์ ๋ช
๋ น์ด ์์์์ ๋ฃ๊ณ ์ถ์ด](#%EA%B9%83%EC%97%90-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%83%89%EC%83%81%EC%9D%84%EC%9D%84-%EB%84%A3%EA%B3%A0-%EC%8B%B6%EC%96%B4)
- [๋ญ ์๋ชปํ๋์ง ๋ชจ๋ฅด๊ฒ ์ด](#%EB%AD%98-%EC%9E%98%EB%AA%BB%ED%96%88%EB%8A%94%EC%A7%80-%EB%AA%A8%EB%A5%B4%EA%B2%A0%EC%96%B4)
- [๋ค๋ฅธ ๋ฆฌ์์ค](#%EB%8B%A4%EB%A5%B8-%EB%A6%AC%EC%86%8C%EC%8A%A4)
- [๋์](#%EB%8F%84%EC%84%9C)
- [ํํ ๋ฆฌ์ผ](#%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC)
- [์คํฌ๋ฆฝํธ์ ๋๊ตฌ](#%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%99%80-%EB%8F%84%EA%B5%AC)
- [GUI ํด๋ผ์ด์ธํธ](#gui-%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8)
## ๋ ํ์งํ ๋ฆฌ
### ๋ก์ปฌ ๋ ํ์งํ ๋ฆฌ์์ ์์ํ๊ณ ์ถ์ด
์ด๋ฏธ ์กด์ฌํ๋ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ๋ฅผ ๊น ๋ ํ์งํ ๋ฆฌ๋ก ์ต์ ํํด ์ฐ๋ ค๋ฉด:
```sh
(my-folder) $ git init
```
### ๋ ๋ฆฌ๋ชจํธ ๋ ํ์งํ ๋ฆฌ๋ฅผ ๋ณต์ ํด์ค๊ณ ์ถ์ด
๋ฆฌ๋ชจํธ ๋ ํ์งํ ๋ฆฌ๋ฅผ ํด๋ก ํ๋ ค๋ฉด, ๋ ํ์งํ ๋ฆฌ URL์ ๋ณต์ฌํด์์ ์คํํด์.
```sh
$ git clone [url]
```
ํด๋ ์ด๋ฆ์ด ๋ฆฌ๋ชจํธ ๋ ํ์งํ ๋ฆฌ ์ด๋ฆ๊ณผ ๊ฐ์ด ์ ์ฅ๋ ๊ฑฐ์์.
๋ณต์ ํ ๋ฆฌ๋ชจํธ ์๋ฒ์ ์ฐ๊ฒฐ์ ํ์ธํ์ธ์.(๋๋ถ๋ถ ์ธํฐ๋ท ์ฐ๊ฒฐ์ ํ์ธํ๋ ๋ป์ด์์)
๋ค๋ฅธ ๋ ํ์งํ ๋ฆฌ ์ด๋ฆ์ผ๋ก ๋ณต์ ๋ฅผ ํด์ค๊ณ ์ถ๋ค๋ฉด
```sh
$ git clone [url] name-of-new-folder
```
## ์ปค๋ฐ ์์
### ๋ด๊ฐ ๋ฐฉ๊ธ ์ด๋ค ์ปค๋ฐ์ ๋จ๊ฒผ์ง?
`git commit -a` ๋ก ๋ง ์ปค๋ฐ์ ๋จ๊ธฐ๊ณ ๋ด๊ฐ ๋ญ๋ผ๊ณ ์์ ์ ์๋๋ผ? ํ๋ค๊ณ ํ๊ณ . ์ต๊ทผ์ ์ปค๋ฐ์ ํ์ฌ HEAD์์ ๋ณผ ์ ์์ด์.
```sh
(master)$ git show
```
๋๋
```sh
$ git log -n1 -p
```
๋ง์ฝ ํน์ ์ปค๋ฐ์ ํ์ผ์ ๋ณด๊ณ ์ถ๋ค๋ฉด, ์ด๋ ๊ฒ ํ ์๋ ์์ด์. (commitID๋ ๋ฐ๋ก ๋น์ ์ด ๊ด์ฌ์๋ ๊ทธ commit์ด์์)
```sh
$ git show :filename
```
### ์ปค๋ฐ ๋ฉ์ธ์ง๋ฅผ ์๋ชป ์ผ์ด
๋ง์ฝ ๋ฉ์์ง๋ฅผ ์๋ชป ์ผ๊ณ ์์ง ํธ์๋ฅผ ์ํ๋ค๋ฉด, ์ปค๋ฐ ๋ฉ์์ง ๋ฐ๊พธ๊ธฐ๋ฅผ ๋ฐ๋ผํด ๋ณผ ์ ์์ด์.
```sh
$ git commit --amend
```
์ด ๋ฐฉ๋ฒ์ ํธ์ง ๊ฐ๋ฅํ ๊ธฐ๋ณธ ํ
์คํธ ์๋ํฐ๊ฐ ์ด๋ฆดํ
๋ฐ์, ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ํ์ค์ ์ธ ์๋ ์์ด์.
```sh
$ git commit --amend -m 'xxxxxxx'
```
๋ง์ฝ ํธ์๋ฅผ ์ด๋ฏธ ํ๋ค๋ฉด, ์ปค๋ฐ์ ์์ ํด์ ๊ฐ์ ํธ์๋ฅผ ํ ์ ์๊ธดํ๋ ๋ณ๋ก ์ถ์ฒํ์ง ์์์.
### ์ปค๋ฐ์ ๋ค๋ฅธ ์ด๋ฆ๊ณผ ์ด๋ฉ์ผ ์ค์ ์ผ๋ก ํด๋ฒ๋ ธ์ด
ํ๋์ ์ปค๋ฐ์ด๋ผ๋ฉด ์ด๋ ๊ฒ ์์ ํด์.
```sh
$ git commit --amend --no-edit --author "New Authorname "
```
๋์์ผ๋ก๋ `git config --global author.(name|email)`์์ ์ค์ ์ ๋ค์ ๋ง์ถ ๋ค์
```sh
$ git commit --amend --reset-author --no-edit
```
๋ง์ฝ ์ ์ฒด ์ด๋ ฅ ๋ณ๊ฒฝ์ด ํ์ํ๋ค๋ฉด, `git filter-branch`์ ์ค๋ช
ํ์ด์ง๋ฅผ ๋ด์.
### ์ง๋ ์ปค๋ฐ์์ ํ์ผ ํ๋๋ฅผ ์ง์ฐ๊ณ ์ถ์ด
์ง๋ ์ปค๋ฐ์์ ํ์ผ ๋ณ๊ฒฝ๋ด์ญ์ ์ง์ฐ๋ ค๋ฉด, ์ด๋ ๊ฒ ํด๋ด์:
```sh
$ git checkout HEAD^ myfile
$ git add myfile
$ git commit --amend --no-edit
```
๊ทธ ํ์ผ์ด ์๋กญ๊ฒ ์ปค๋ฐ์ผ๋ก ์ถ๊ฐ๋๊ณ ๊ทธ ํ์ผ๋ง ์ง์ฐ๊ณ (git ์์๋ง) ์ถ์ ๊ฒฝ์ฐ์,
```sh
$ git rm --cached myfile
$ git commit --amend --no-edit
```
์ด ๋ฐฉ๋ฒ์ ์ด๋ฆฐ ํจ์น๊ฐ ์๊ณ ๋ถํ์ํ ํ์ผ์ ์ปค๋ฐ ํ๊ฑฐ๋ ๋ฆฌ๋ชจํธ์ ๊ฐ์ ํธ์๋ก ํจ์น๋ฅผ ์
๋ฐ์ดํธ ํด์ผํ ๋ ํนํ ์ ์ฉํด์. `--no-edit` ์ต์
์ ๊ธฐ์กด ์ปค๋ฐ ๋ฉ์ธ์ง๋ฅผ ์ ์งํ๋๋ฐ ์ฌ์ฉ๋ผ์.
### ๋ง์ง๋ง ์ปค๋ฐ์ ์ง์ฐ๊ณ ์ถ์ด
ํธ์๋ ์ปค๋ฐ์ ์ง์ฐ๊ณ ์ถ๋ค๋ฉด ์ด๊ฑธ ๋ฐ๋ผํ๋ฉด ๋๋๋ฐ, ์ด๋ ฅ์ ๋์ดํฌ ์ ์๊ฒ ๋๊ณ ๋ ํ์งํ ๋ฆฌ์์ ์ด๋ฏธ ํ์ ๋ฐ์๊ฐ ๋ค๋ฅธ ์ฌ๋์ ์ด๋ ฅ๋ ์๋ง์ด ๋์. ๊ฐ๋จํ ๋งํ์๋ฉด, ์ ๋ชจ๋ฅด๊ฒ ์ผ๋ฉด ์ ๋ ํ์ง๋ง์.
```sh
$ 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` ๋ช
๋ น์ด๋ฅผ ์ธ์ ์์ด์.
๋ ์๊ณ ์ถ๋ค๋ฉด, [์ด ์น์
](#deleteremove-last-pushed-commit)์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
### ์์์ ์ธ ์ปค๋ฐ ์ง์ฐ๊ธฐ
์ด์ ๊ณผ ๋์ผํ ๊ฒฝ๊ณ ์์. ๊ฐ๋ฅํ ์ด ๋ฐฉ๋ฒ์ ์ฐ์ง ๋ง์ธ์.
```sh
$ git rebase --onto SHA1_OF_BAD_COMMIT^ SHA1_OF_BAD_COMMIT
$ git push --force-with-lease [remote] [branch]
```
์๋๋ฉด [๋ํํ ๋ฆฌ๋ฒ ์ด์ค](#interactive-rebase)๋ฅผ ์ฐ๊ณ ์ง์ฐ๊ณ ์ถ์ ์ปค๋ฐ ๋ผ์ธ์ ์ง์๋ ๋ผ์.
### ์์ ๋ ์ปค๋ฐ์ ํธ์ํ๋๋ฐ, ์๋ฌ ๋ฉ์ธ์ง๊ฐ ๋
```sh
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.
```
์์๋์ธ์, ๋ฆฌ๋ฒ ์ด์ค(์๋๋ฅผ ๋ณด์ธ์)๋ ์ด๋ฉ๋๋ **๊ธฐ์กด ์ปค๋ฐ์ ์๊ฑธ๋ก ๋ฐ๊ฟ์**,
๊ทธ๋์ ์ด๋ฏธ ๋จผ์ ์์ ๋ ์ปค๋ฐ์ด ํธ์๋๋ค๋ฉด ๊ฐ์ ํธ์๋ฅผ ํด์ผ ํด์.
์ด ๋ฐฉ๋ฒ์ ์ธ๋ ์กฐ์ฌํ์ธ์; *ํญ์* ์์
๋๋ ๋ธ๋์น๊ฐ ๋ง๋ ํ์ธํด์!
```sh
(my-branch)$ git push origin mybranch --force-with-lease
```
์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ ํธ์๋ฅผ ์ฐ์ง ๋ง์ธ์.
์ ์ปค๋ฐ์ ๋ง๋ค์ด์ ํธ์ํ๋๊ฒ ์์ ๋ ์ปค๋ฐ์ ๊ฐ์ ๋ก ํธ์ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋์์. ๊ทธ๋ฐ ์์ ๋ ์ปค๋ฐ์ ๊ทธ ๋ธ๋์น๋ ๋ค๋ฅธ ์์ ๋ธ๋์น๋ฅผ ์ฐ๋ ๋ค๋ฅธ ๊ฐ๋ฐ์์ ์์ค ์ด๋ ฅ๊ณผ ์ถฉ๋์ ์์ธ์ด ๋ ๊ฑฐ์์.
`--force-with-lease` ๋ ์ฌ์ ํ ์คํจํ ํ
๋ฐ, ๋๊ตฐ๊ฐ๊ฐ ๊ฐ์ ๋ธ๋์น๋ฅผ ์ด๋ค๋ฉด ๋ณ๊ฒฝ์ ์ ๋ฎ์ด์ฐ๋ ํธ์๋ฅผ ํ ์๋ ์์ด์.
์ ๋๋ก ์๋ฌด๋ ๊ฐ์ ๋ธ๋์น๋ฅผ ์ ์ฐ๊ฑฐ๋, ์ ๋๋ก ๋ธ๋์น์ ์
๋ฐ์ดํธ๋ฅผ ํด์ผํ ๋ `--force` (`-f`) ์ต์
์ ์ธ ์ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ํผํ๋๊ฒ ์ข์์.
### ํ๋ ๋ฆฌ์
์ ํด๋ฒ๋ ธ๋๋ฐ ๋๋๋ฆฌ๊ณ ์ถ์ด
๋ง์ฝ ํ๋ ๋ฆฌ์
์ ํ๋ค๊ณ ํด๋ ์ปค๋ฐ์ ๋๋ฆด ์ ์์ด์. ๊น์ ๋ฉฐ์น ๊ฐ์ ๋ก๊ทธ๋ฅผ ๊ฐ์ง๊ณ ์๊ฑฐ๋ ์.
์์๋๊ธฐ : ์ด๊ฑด ์ปค๋ฐ์ ๋จ๊ฒผ๊ฑฐ๋ ์คํ
์ด์๊ฐ์ด ๋ฐฑ์
์ ํ์ ๋๋ง ์ ํจํด์. `git reset --hard` ์ ์ปค๋ฐ๋์ง ์์ ์์ ์ฌํญ์ _๋ค ์ง์ธ ๊ฑฐ์์_, ๊ทธ๋ฌ๋ ์กฐ์ฌํด์ ์จ์ผํด์. (์์ ํ ๋ฐฉ๋ฒ์ผ๋ก `git reset --keep` ์ด ์์ด์)
```sh
(master)$ git reflog
```
์ง๋ ์ปค๋ฐ๊ณผ ๋ฆฌ์
์ ์ํ ์ปค๋ฐ์ ๋ณผ ์ ์์ ๊ฑฐ์์. ๋์๊ฐ๊ณ ์ถ์ ์ปค๋ฐ์ SHA ์ฝ๋๋ฅผ ๊ณจ๋ผ์, ๋ฆฌ์
์ ํด์:
```sh
(master)$ git reset --hard SHA1234
```
๊ณ์ ํ ์ ์์๊ฑฐ์์.
### ๋จธ์ง๋ฅผ ์ค์๋ก ์ปค๋ฐ, ํธ์ํด๋ฒ๋ ธ์ด
๋ง์ฝ ์ค์๋ก ๋จธ์งํ ์ค๋น๊ฐ ์๋ ํผ์ณ ๋ธ๋์น๋ฅผ ๋ฉ์ธ ๋ธ๋์น์ ๋จธ์งํ์ด๋ ๋๋๋ฆด ์ ์์ด์.
ํ์ง๋ง ๋ฌธ์ ๋ ์์ด์: ๋จธ์ง ์ปค๋ฐ์ ํ๊ฐ ์ด์์ ๋ถ๋ชจ(๋ณดํต์ ๋ ๊ฐ)๋ฅผ ๊ฐ์ง๊ฒ ๋ผ์.
์ฌ์ฉํ๋ ค๋ฉด
```sh
(feature-branch)$ git revert -m 1
```
์ฌ๊ธฐ์ -m 1 ์ต์
์ ๋ถ๋ชจ ๋ฒํธ 1(๋จธ์ง๊ฐ ๋ง๋ค์ด์ง ๋ธ๋์น)์ ๋๋๋ฆด ์์ ํญ๋ชฉ์ผ๋ก ์ ํํ๋ผ๊ณ ํด์.
์์๋๊ธฐ : ๋ถ๋ชจ ๋ฒํธ๋ ์ปค๋ฐ ์๋ณ์๊ฐ ์๋๊ณ , ์คํ๋ ค ๋จธ์ง๋ ์ปค๋ฐ์ด `Merge: 8e2ce2d 86ac2e7` ์ด๋ผ๋ ๋ผ์ธ์ ๊ฐ์ง๊ณ ์์ด์.
๋ถ๋ชจ ๋ฒํธ๋ ์ด ๋ผ์ธ์์ ์ํ๋ ๋ถ๋ชจ์ 1 ๊ธฐ๋ฐ ์ธ๋ฑ์ค์ด๊ณ , ์ฒซ๋ฒ์งธ ์๋ณ์๋ 1, ๋ค์์ 2 ์ด๋ ๊ฒ ์ด์ด์ ธ์.
## ์คํ
์ด์ง
### ์ง๋ ์ปค๋ฐ์ ์คํ
์ด์ง ๋ณ๊ฒฝ์ ์ ์ถ๊ฐํ๊ณ ์ถ์ด
```sh
(my-branch*)$ git commit --amend
```
### ์ ์ฒด๊ฐ ์๋ ์ ํ์ผ๋ง ์คํ
์ด์ง์ ์ฌ๋ฆฌ๊ณ ์ถ์ด
๋ณดํต์ ๋ถ๋ถ์ ์ผ๋ก ํ์ผ์ ์คํ
์ด์งํ๋ ค๋ฉด ์ด๋ ๊ฒ ํด์:
```sh
$ git add --patch filename.x
```
`-p`๋ ์ถ์ฝ๋ ์ต์
์ด์์. ์ด ๋ฐฉ์์ ๋ํํ ๋ชจ๋๋ฅผ ์ดํ
๋ฐ์. `s` ์ต์
์ ์ฐ๋ฉด ์ปค๋ฐ์ ๋๋ ์ ์์ด์. ํ์ง๋ง ์ ํ์ผ์ด๋ผ๋ฉด ๊ทธ๋ฐ ์ต์
์ด ์์๊ฑฐ์์. ์ ํ์ผ์ ์ถ๊ฐํ๋ ค๋ฉด:
```sh
$ git add -N filename.x
```
๊ทธ ๋ค์ ์์์ ์ผ๋ก ๋ผ์ธ๋ค์ ๊ณจ๋ผ ์ถ๊ฐํด์ฃผ๋ ค๋ฉด `e`์ต์
์ด ํ์ํ ๊ฑฐ์์. `git diff --cached`๋ `git diff --staged`๋ ๋ก์ปฌ์ ์ ์ฅ๋ ๋ถ๋ถ๊ณผ ์คํ
์ด์ง์ ์๋ ๋ผ์ธ๋ค์ ๋น๊ตํด์ ๋ณด์ฌ์ค ๊ฑฐ์์.
### ํ๋์ ํ์ผ ๋ณ๊ฒฝ์ ์ ๋๊ฐ์ ๋ค๋ฅธ ์ปค๋ฐ์ ๋จ๊ธฐ๊ณ ์ถ์ด
`git add`๋ ์ ์ฒด ํ์ผ๋ค์ ์ปค๋ฐ์ ์ถ๊ฐํด์. `git add -p`๋ ๋ํํ์ผ๋ก ์ถ๊ฐํ๊ณ ํ ๋ณ๊ฒฝ์ ๋ค์ ๊ณ ๋ฅผ ์ ์์ด์.
### ์์ง ์คํ
์ด์ง์ ์ ์ฌ๋ผ๊ฐ ๋ณ๊ฒฝ์ ์ ์คํ
์ด์ง์ ์ถ๊ฐํ๊ณ , ์คํ
์ด์ง์ ์๋ ๋ณ๊ฒฝ์ ์ ๋ค์ ๋นผ๊ณ ์ถ์ด
์ด๊ฑด ์ข ๊ผผ์์ธ๋ฐ์, ์คํ
์ด์ง ์ ์ธ ํ์ผ๋ค์ ์คํ
์ด์ํด์ ๋นผ๋๊ณ ์ ๋ฆฌ์
ํ ์ ์์๊ฑฐ์์. ๊ทธ ๋ค์ ์คํ
์ด์๋ฅผ ๋ค์ ๋ถ๋ฌ์ ์ถ๊ฐ๋ฅผ ํด์.
```sh
$ git stash -k
$ git reset --hard
$ git stash pop
$ git add -A
```
## ์คํ
์ด์ง ์ ์ ๋ณ๊ฒฝ์
### ์คํ
์ด์ง ์ ์ ๋ณ๊ฒฝ์ ์ ์ ๋ธ๋์น๋ก ์ฎ๊ธฐ๊ณ ์ถ์ด
```sh
$ git checkout -b my-branch
```
### ์คํ
์ด์ง์ ๋ณ๊ฒฝ์ ์ ๋ง๋ค์ด๋ ๋ค๋ฅธ ๋ธ๋์น๋ก ์ฎ๊ธฐ๊ณ ์ถ์ด
```sh
$ git stash
$ git checkout my-branch
$ git stash pop
```
### ๋ด ๋ก์ปฌ์ ์๋ ์ปค๋ฐ ์๋ ๋ณ๊ฒฝ์ ์ ๋ค ๋ฌด์ํ๊ณ ์ถ์ด (์คํ
์ด์ง ๋๋ ์๋๋)
๋ง์ฝ ๋ชจ๋ ์คํ
์ด์ง ๋๊ฑฐ๋ ์ ๋ ๋ณ๊ฒฝ์ ์ ๋ฒ๋ฆฌ๊ณ ์ถ๋ค๋ฉด ์ด๋ ๊ฒ ํด์:
```sh
(my-branch)$ git reset --hard
# or
(master)$ git checkout -f
```
์ด ๋ฐฉ๋ฒ์ `git add`๋ก ์คํ
์ด์ง๋ ๋ชจ๋ ํ์ผ์ด ๋น ์ง๊ฒ ๋ผ์.
```sh
$ git reset
```
์ด ๋ฐฉ๋ฒ์ ์ปค๋ฐ๋์ง ์์ ๋ชจ๋ ๋ก์ปฌ ๋ณ๊ฒฝ์ ์ด ๋๋๋ ค ์ ธ์. (๋ ํ์งํ ๋ฆฌ ์ต์๋จ ๋ฃจํธ์์ ์คํํด์ผ ํ ๊ฑฐ์์)
```sh
$ git checkout .
```
๋ ์ปค๋ฐ๋์ง ์์ ๋ณ๊ฒฝ์ ๋ค ์ค ๋ช๊ฐ์ง ํ์ผ์ด๋ ๋๋ ํ ๋ฆฌ๋ง ๋๋๋ฆด ์ ์์ด์.
```sh
$ git checkout [some_dir|file.txt]
```
๊ฑฐ๊ธฐ์ ๋ ๋ค๋ฅธ ๋๋๋ฆฌ๋ ๋ฐฉ๋ฒ์ผ๋ก (ํ์ดํ ์น ๊ฒ ๋ง์ง๋ง ์ด๋ค ํ์ ๋๋ ํ ๋ฆฌ์์๋ ๋ผ์):
```sh
$ git reset --hard HEAD
```
์ด ๋ฐฉ๋ฒ์ ๋ชจ๋ ํธ๋ํน๋์ง ์์ ํ์ผ๋ค์ ์ง์์, ๊ทธ๋์ ๊น์์ ํธ๋ํน๋๋ ํ์ผ๋ค๋ง ๋จ์์:
```sh
$ git clean -fd
```
`-x` ์ต ๋ํ ๋ฌด์๋ ํ์ผ๋ค์ ๋ค ์ง์์.
### ์คํ
์ด์ง ์๋ ํน์ ๋ณ๊ฒฝ์ ์ ์ง์ฐ๊ณ ์ถ์ด
์์
์ค์ธ ์์ญ์์ ์ ์ฒด๊ฐ ์๋ ํน์ ๋ถ๋ถ์ ์ง์ฐ๊ณ ์ถ์๋
์์น์๋ ๋ณ๊ฒฝ์ ์ ํ์ธํ๊ณ , ๋ณ๊ฒฝ์ ์ ์ ๋ณด๊ดํ์ธ์.
```sh
$ git checkout -p
# ๋ ๋ฆฌ๊ณ ์ถ์ ์ฌํญ์ y๋ฅผ ์ ์ผ์ธ์
```
๋๋ค๋ฅธ ์ ๋ต์ `stash`์ ๊ฐ์ด ์ฐ๋๊ฑฐ์์. ์ฑ๊ฒจ์ผ ํ๋ ๋ณ๊ฒฝ์ ์ ์คํ
์ด์ ํ๊ณ , ์์
์ค์ธ ์์ญ์ ๋ฆฌ์
ํ๊ณ , ๋ค์ ์ฌ๋ฐ๋ฅธ ๋ณ๊ฒฝ์ ์ผ๋ก ์ฌ์ ์ฉํด์.
```sh
$ git stash -p
# ์ ์ฅํ๊ณ ์ถ์ ์ฌํญ๋ค์ ๋ค ์ ํํ์ธ์
$ git reset --hard
$ git stash pop
```
๋์์ผ๋ก, ์์น์๋ ๋ณ๊ฒฝ์ ์ ์คํ
์ด์ํด์ ๊ทธ๊ฑธ ๋ ๋ฆฌ๋ ๋ฐฉ๋ฒ๋ ์์ด์.
```sh
$ git stash -p
# ์ ์ฅํ๊ณ ์ถ์ง ์์ ์ฌํญ๋ค์ ๋ค ์ ํํ์ธ์
$ git stash drop
```
### ์คํ
์ด์ง ์๋ ํน์ ํ์ผ์ ์ง์ฐ๊ณ ์ถ์ด
์์
์์ญ์์ ํน์ ํ์ผ์ ์ง์ฐ๊ณ ์ถ์ ๋.
```sh
$ git checkout myFile
```
๋์์ผ๋ก, ์์
์์ญ ๋ด ์ฌ๋ฌ ํ์ผ๋ค์ ์ง์ฐ๊ณ ์ถ์๋ ๋ชจ๋ ๋์ดํด์ ์ ์ด์.
```sh
$ git checkout myFirstFile mySecondFile
```
### ๋ก์ปฌ์ ์๋ ์คํ
์ด์ง ์๋ ๋ณ๊ฒฝ์ ๋ง ์ง์ฐ๊ณ ์ถ์ด
๋ชจ๋ ์คํ
์ด์ง ์๋ ์ปค๋ฐ ์ ์ธ ๋ณ๊ฒฝ์ ์ ์ง์ฐ๊ณ ์ถ์ ๋
```sh
$ git checkout .
```
### ํธ๋ํน ์๋ ํ์ผ๋ค ๋ค ์ง์ฐ๊ณ ์ถ์ด
ํธ๋ํน ์๋ ํ์ผ๋ค ๋ค ์ง์ฐ๊ณ ์ถ์ ๋
```sh
$ git clean -f
```
## ๋ธ๋์น
### ๋ชจ๋ ๋ธ๋์น ๋ฆฌ์คํธ๋ฅผ ๋ณด๊ณ ์ถ์ด
๋ก์ปฌ ๋ธ๋์น ๋ค ๋ณด๊ธฐ
```sh
$ git branch
```
๋ฆฌ๋ชจํธ ๋ธ๋์น ๋ค ๋ณด๊ธฐ
```sh
$ git branch -r
```
๋ก์ปฌ๊ณผ ๋ฆฌ๋ชจํธ ๋ธ๋์น ๋ชจ๋ ๋ณด๊ธฐ
```sh
$ git branch -a
```
### ์ปค๋ฐ์์ ๋ธ๋์น ๋ง๋ค๊ธฐ
```sh
$ git checkout -b
```
### ๋ค๋ฅธ ๋ธ๋์น์์ ํ์ ๋ฐ์์๋ฒ๋ ธ์ด
์ด๊ฑด ์๋ชป๋ ํ์ ๋ฐ๊ธฐ์ HEAD๊ฐ ์ด๋ ๊ฐ๋ฅดํค๊ณ ์์๋์ง ๋ณผ ์ ์๋ `git reflog`๋ฅผ ์จ๋ณผ ์ ์๋ ๊ธฐํ์์.
```sh
(master)$ git reflog
ab7555f HEAD@{0}: pull origin wrong-branch: Fast-forward
c5bc55a HEAD@{1}: checkout: checkout message goes here
```
๊ฐ๋จํ ์ํ๋ ์ปค๋ฐ์ผ๋ก ๋ธ๋์น๋ฅผ ๋๋๋ฆด ์ ์์ด์:
```sh
$ git reset --hard c5bc55a
```
๋!
### ๋ก์ปฌ์ ์ปค๋ฐ์ ์ง์์ ์๋ฒ์ ์๋ ๋ด ๋ธ๋์น์ ๋ง์ถ๊ณ ์ถ์ด
์๋ฒ์ ๋ณ๊ฒฝ์ ์ ํธ์ ์ํ๋์ง๋ถํฐ ํ์ธํด์.
`git status` ๊ฐ ์ค๋ฆฌ์ง๋ณด๋ค ๋ช๊ฐ์ ์ปค๋ฐ๋ค์ด ์์ ์๋์ง ๋ณด์ฌ์ค๊ฑฐ์์:
```sh
(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)
#
```
์ค๋ฆฌ์ง(๋ฆฌ๋ชจํธ๊ณผ ๊ฐ์ ์ํ์)๋ก ๋ง์ถ๋ ๋ฆฌ์
์ ํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋:
```sh
(master)$ git reset --hard origin/my-branch
```
### ์ ๋ธ๋์น ๋์ ์ ๋ง์คํฐ์ ์ปค๋ฐ์ ํด๋ฒ๋ ธ์ด
๋ง์คํฐ์ ์์ผ๋ฉด์ ์ ๋ธ๋์น๋ฅผ ๋ง๋ค์ด์:
```sh
(master)$ git branch my-branch
```
๋ง์คํฐ ๋ธ๋์น๋ฅผ ๊ธฐ์กด ์ปค๋ฐ์ผ๋ก ๋ฆฌ์
ํด์:
```sh
(master)$ git reset --hard HEAD^
```
`HEAD^`๋ `HEAD^1`์ ์ถ์ฝ์ธ๋ฐ์. `HEAD^`์ ์ฒซ๋ฒ์งธ ๋ถ๋ชจ๋ฅผ ์๋ฏธํ๊ณ , ๋น์ทํ `HEAD^2`๋ ๋๋ฒ์งธ ๋ถ๋ชจ๋ฅผ ์๋ฏธํด์. (๋จธ์ง๋ ๋ ๋ถ๋ชจ๋ฅผ ๊ฐ์ง ์ ์์ฃ )
์์๋์ธ์ `HEAD^2`๋ `HEAD~2`๊ณผ ๊ฐ์๊ฒ ์๋์์. (๋ ์์ธํ ์ ๋ณด๋ [์ด ๋งํฌ](http://www.paulboxley.com/blog/2011/06/git-caret-and-tilde)๋ฅผ ์ฐธ๊ณ ํด์ )
๋์์ผ๋ก, `HEAD^`๋ฅผ ์ฐ๊ณ ์ถ์ง ์๋ค๋ฉด, ๋ง์คํฐ ๋ธ๋์น๋ก ์ฎ๊ธธ ์ปค๋ฐ ํด์๋ฅผ ์์๋ฌ์ (`git log`๊ฐ ํธ๋ฆญ์ ๋ถ๋ฆด ๊ฑฐ์์) ๊ทธ๋ฆฌ๊ณ ๊ทธ ํด์ฌ๋ก ๋ฆฌ์
์ ํด์. `git push`๊ฐ ๋ฆฌ๋ชจํธ๋ ๋ณ๊ฒฝ์ ์ด ๋๊ฐ์๊ฑธ ํ์ธํด์ค๊ฑฐ์์.
์๋ฅผ ๋ค์๋ฉด, ๊ทธ ๋ง์คํฐ์ ์ปค๋ฐ์ ํด์ฌ๊ฐ `a13b85e`๋ผ๋ฉด:
```sh
(master)$ git reset --hard a13b85e
HEAD is now at a13b85e
```
์ ๋ธ๋์น๋ก ์ฒดํฌ์์ ํด์ ๊ณ์ ์์
์ ํด์:
```sh
(master)$ git checkout my-branch
```
### ๋ค๋ฅธ ๋ ํผ๋ฐ์ค ๊ฐ์ ๊ณณ์์ ๋ชจ๋ ํ์ผ์ ์ ์งํ๊ณ ์ถ์ด
์๋ฐฑ๋ฒ์ ๋ณ๊ฒฝ์ ์ ๊ฐ์ง ์คํ์ดํฌ(์๋ ์์๋๊ธฐ ์ฐธ๊ณ ) ์์
์ ํ๋ค๊ณ ๊ฐ์ ํด๋ณด์ฃ . ๋ชจ๋ ๊ฑด ๋์ํ๊ณ ์๊ณ ,๊ทธ ์์
์ ์ ์ฅํด๋๊ธฐ ์ํด ๋ค๋ฅธ ๋ธ๋์น๋ก ์ปค๋ฐ์ ํด์:
```sh
(solution)$ git add -A && git commit -m "Adding all changes from this spike into one big commit."
```
๊ทธ ์ปค๋ฐ์ ๋ธ๋์น(์๋ง feature์ผ์๋ ์๊ณ , `develop` ์ผ์๋ ์๊ฒ ์ฃ )์ ๋ฃ๊ณ ์ถ์ ๋, ๋ชจ๋ ํ์ผ์ ์งํค๋๋ฐ ๊ด์ฌ์ด ์์๊ฑฐ์์. ํฐ ์ปค๋ฐ์ ์๊ฒ ๋๋๊ณ ์ถ์๊ฑฐ์์.
ํ์ฌ ๊ฐ์ง๊ณ ์๋๊ฑด:
* ์คํ์ดํฌ๋ฅผ ์ํ ์๋ฃจ์
๊ณผ ํจ๊ป์ธ `solution` ๋ธ๋์น. `develop` ๋ธ๋์น์ 1๋จ๊ณ ์์ ์ํ.
* ๋ณ๊ฒฝ์ ์ ์ถ๊ฐํ๊ณ ์ถ์ `develop` ๋ธ๋์น
๋ธ๋์น๋ก ๋ด์ฉ๋ค์ ๋ถ๋ฌ์ค๋ ๊ฒ์ผ๋ก ํด๊ฒฐํ ์ ์์ด์:
```sh
(develop)$ git checkout solution -- file1.txt
```
`develop`๋ธ๋์น์์ `solution` ๋ธ๋์น์ ์ ํ์ผ์ ๋ด์ฉ๋ค์ ์ป์ ์ ์์ด์.
```sh
# On branch develop
# Your branch is up-to-date with 'origin/develop'.
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: file1.txt
```
๊ทธ ๋ค์, ํ์์ฒ๋ผ ์ปค๋ฐํด์.
์์๋๊ธฐ : ์คํ์ดํฌ ์๋ฃจ์
์ ๋ฌธ์ ๋ฅผ ๋ถ์ํ๊ฑฐ๋ ํ๊ธฐ์ํด ๋ง๋ค์ด์ก์ด์. ์ด ์๋ฃจ์
๋ค์ ๋ชจ๋๊ฐ ๋ฌธ์ ์ ํ์คํ ์๊ฐํ๋ฅผ ์ป๊ณ ์ ํ๊ฐ๋๊ณ ์ ๊ฑฐ๋ผ์.~ [์ํคํผ๋์](https://en.wikipedia.org/wiki/Extreme_programming_practices).
### ํ ๋ธ๋์น์ ๋ค๋ฅธ ๋ธ๋์น์ ๋จ๊ฒผ์ด์ผ ํ๋ ์ปค๋ฐ์ ์ฌ๋ฌ๊ฐ ๋จ๊ฒผ์ด
๋ง์คํฐ ๋ธ๋์น์ ์๋ค๊ณ ๊ฐ์ ํ๊ณ `git log` ํด๋ณด๋ฉด ์ปค๋ฐ ๋๊ฐ ๋ณผ ์ ์์๊ฑฐ์์:
```sh
(master)$ git log
commit e3851e817c451cc36f2e6f3049db528415e3c114
Author: Alex Lee
Date: Tue Jul 22 15:39:27 2014 -0400
Bug #21 - Added CSRF protection
commit 5ea51731d150f7ddc4a365437931cd8be3bf3131
Author: Alex Lee
Date: Tue Jul 22 15:39:12 2014 -0400
Bug #14 - Fixed spacing on title
commit a13b85e984171c6e2a1729bb061994525f626d14
Author: Aki Rose
Date: Tue Jul 21 01:12:48 2014 -0400
First commit
```
๊ฐ ๋ฒ๊ทธ์ปค๋ฐ์ ํด์ฌ๋ฅผ ๊ฐ์ ธ์์. (21๋ฒ์ `e3851e8`, 14๋ฒ์ `5ea5173`)
์ฐ์ , ๋ง์คํฐ ๋ธ๋์น์ ์ ํํ ์ปค๋ฐ (`a13b85e`)์ผ๋ก ๋ฆฌ์
ํด์:
```sh
(master)$ git reset --hard a13b85e
HEAD is now at a13b85e
```
๊ทธ๋ฆฌ๊ณ , 21๋ฒ ๋ฒ๊ทธ ์์
์ ์ํ ์๋ก์ด ๋ธ๋์น๋ฅผ ๋ง๋ค์ ์์ด์:
```sh
(master)$ git checkout -b 21
(21)$
```
๊ทธ๋ฆฌ๊ณ 21๋ฒ ๋ฒ๊ทธ ์ปค๋ฐ์ *์ฒด๋ฆฌํฝ* ํด์ ๋ธ๋์น ์ต์๋จ์ ์ฌ๋ ค์. ๊ทธ ์ปค๋ฐ์ ์ ์ฉํ ๊ฑด๋ฐ, ์ค์ง ๊ทธ ์ปค๋ฐ๋ง์ ํค๋์ ๋ญ๊ฐ ์๋ ์ต์๋จ์ผ๋ก ์ ์ฉํ ๊ฑฐ๋ ์๋ฏธ์์.
```sh
(21)$ git cherry-pick e3851e8
```
์ด ์ง์ ์์ ์ถฉ๋์ด ์์ ์๋ ์์ด์.
์ด๋ป๊ฒ ์ถฉ๋์ ํด๊ฒฐํ ์ง [๋ํํ ๋ฆฌ๋ฒ ์ด์ค ์น์
](#interactive-rebase) ์์ ์๋ [**์ถฉ๋์ด ์์ด**](#merge-conflict) ๋ถ๋ถ์ ์ฐธ๊ณ ํ์ธ์.
์ ์ด์ 14๋ฒ ๋ฒ๊ทธ ์์
์ ์ํด ๋ง์คํฐ๋ก ๊ฐ์ ์ ๋ธ๋์น๋ฅผ ๋ง๋ค์ด์.
```sh
(21)$ git checkout master
(master)$ git checkout -b 14
(14)$
```
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก, 14๋ฒ ๋ฒ๊ทธ์์
์ ์ํ ์ปค๋ฐ์ ์ฒด๋ฆฌํฝํด์.
```sh
(14)$ git cherry-pick 5ea5173
```
### ์
์คํธ๋ฆผ์์ ์ง์์ง ๋ก์ปฌ ๋ธ๋์น๋ฅผ ์ง์ฐ๊ณ ์ถ์ด
๊นํ์ ํ๋ฆฌํ์คํธ๋ก ๋จธ์ง๋ฅผ ํ๋ฉด, ํฌํฌ ๋ฌ ๋จธ์ง ๋ธ๋์น๋ฅผ ์ง์ธ๊ป์ง ์ ํํ ์ ์๋ ์ต์
์ ์ค์.
ํด๋น ๋ธ๋์น์ ๊ณ์ ์์
ํ ์์ ์ด ์๋ค๋ฉด, ๋ค๋์ ์ค๋๋ ๋ธ๋์น๋ค๋ก ๋ค๋ฎ์ด์ง ์๊ฒ ๋ก์ปฌ ์์
์ ์ง์์ฃผ๋๊ฒ ๋ ๊น๋ํด์.
```sh
$ git fetch -p upstream
```
์ฌ๊ธฐ์, `upstream`์ ํจ์น๋ก ๊ฐ์ ธ์ค๋ ค๋ ๋ฆฌ๋ชจํธ ๋ ํ์งํ ๋ฆฌ์์.
### ๋ธ๋์น๋ฅผ ์ง์๋ฒ๋ ธ์ด
์ฃผ๊ธฐ์ ์ผ๋ก ๋ฆฌ๋ชจํธ์ผ๋ก ํธ์ํ๋ค๋ฉด, ๋๋ถ๋ถ์ ์์ ํด์ผ ํด์. ๊ทธ์น๋ง ๊ฐ๋์ ๋ธ๋์น๋ฅผ ์ง์ธ ์ ์์ด์. ์ ๋ธ๋์น๋ฅผ ๋ง๋ค๊ณ ํ์ผ์ ํ๋ ๋ง๋ค์๋ค๊ณ ํด๋ณด์ฃ :
```sh
(master)$ git checkout -b my-branch
(my-branch)$ git branch
(my-branch)$ touch foo.txt
(my-branch)$ ls
README.md foo.txt
```
์ถ๊ฐํ๊ณ ์ปค๋ฐํด์.
```sh
(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
Date: Wed Jul 30 00:34:10 2014 +0200
foo.txt added
commit 69204cdf0acbab201619d95ad8295928e7f411d5
Author: Kate Hudson
Date: Tue Jul 29 13:14:46 2014 -0400
Fixes #6: Force pushing after amending commits
```
์ด์ ๋ค์ ๋ง์คํฐ๋ก ๋์๊ฐ '์ค์๋ก' ๋ธ๋์น๋ฅผ ์ง์๋ณด์ฃ .
```sh
(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
```
๋ณด์๋ค์ํผ ์ง์์ง ๋ธ๋์น์ ์ปค๋ฐ ํด์ฌ๋ ๋ณผ ์ ์์ด์. ์ง์ ๋ ๋ธ๋์น๋ฅผ ์ด๋ฆด ์ ์๋ ์ง ํ๋ฒ ํด๋ณด์ฃ .
```sh
(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`๋ ๋ฆฌ๋ฒ ์ด์ค๊ฐ ๋์ฐํ๊ฒ ์๋ชป ๋์๋ ์์ฃผ ์ ์ฉํด์.
### ๋ธ๋์น๋ฅผ ์ง์ฐ๊ณ ์ถ์ด
๋ฆฌ๋ชจํธ ๋ธ๋์น๋ฅผ ์ญ์ ํ๋ ค๋ฉด:
```sh
(master)$ git push origin --delete my-branch
```
์ด๋ ๊ฒ๋:
```sh
(master)$ git push origin :my-branch
```
๋ก์ปฌ ๋ธ๋์น๋ฅผ ์ญ์ ํ๋ ค๋ฉด:
```sh
(master)$ git branch -d my-branch
```
ํ์ฌ ๋ธ๋์น๋ ์
์คํธ๋ฆผ์ ๋จธ์ง๋์ง ์์ ๋ก์ปฌ ๋ธ๋์น๋ฅผ ์ง์ฐ๋ ค๋ฉด:
```sh
(master)$ git branch -D my-branch
```
### ์ฌ๋ฌ๊ฐ์ ๋ธ๋์น๋ฅผ ์ง์ฐ๊ณ ์ถ์ด
`fix/`๋ก ์์ํ๋ ๋ชจ๋ ๋ธ๋์น๋ค์ ์ง์ฐ๊ณ ์ถ๋ค๋ฉด:
```sh
(master)$ git branch | grep 'fix/' | xargs git branch -d
```
### ๋ธ๋์น ์ด๋ฆ์ ๋ฐ๊พธ๊ณ ์ถ์ด
ํ์ฌ (๋ก์ปฌ) ๋ธ๋์น ์ด๋ฆ์ ๋ฐ๊พธ๋ ค๋ฉด:
```sh
(master)$ git branch -m new-name
```
๋ค๋ฅธ (๋ก์ปฌ) ๋ธ๋์น ์ด๋ฆ์ ๋ฐ๊พธ๋ ค๋ฉด
```sh
(master)$ git branch -m old-name new-name
```
### ๋ค๋ฅธ ์ฌ๋์ด ์์
์ค์ธ ๋ฆฌ๋ชจํธ ๋ธ๋์น๋ก ์ฒดํฌ์์ ํ๊ณ ์ถ์ด
์ฐ์ , ๋ฆฌ๋ชจํธ ๋ ํ์งํ ๋ฆฌ์์ ๋ชจ๋ ๋ธ๋์น๋ฅผ ํจ์น ๋ฐ์์:
```sh
(master)$ git fetch --all
```
๋ฆฌ๋ชจํธ์ `daves`๋ก ์ฒดํฌ์์ ํ๊ณ ์ถ๋ค๊ณ ํ๋ฉด.
```sh
(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` ๋ธ๋์น์ ๋ก์ปฌ ์นดํผ๋ฅผ ์ค๊ฑฐ์์. ๊ทธ๋ฆฌ๊ณ ํธ์๋ ์
๋ฐ์ดํธ๋ค๋ ๋ฆฌ๋ชจํธ๋ก ํ์๋ผ์.
### ํ์ฌ ๋ก์ปฌ ๋ธ๋์น๋ก ์๋ก์ด ๋ฆฌ๋ชจํธ ๋ธ๋์น๋ฅผ ๋ง๋ค๊ณ ์ถ์ด
```sh
$ git push HEAD
```
๋ํ ๋ฆฌ๋ชจํธ ๋ธ๋์น๋ฅผ ํ์ฌ ๋ธ๋์น๋ฅผ ์ํ ์
์คํธ๋ฆผ์ผ๋ก ์ค์ ํ๊ณ ์ถ๋ค๋ฉด, ๋์ ์๋ ๋ฐฉ๋ฒ์ ์จ๋ด์:
```sh
$ git push -u HEAD
```
`push.default` ์ค์ ์ `upstream` ๋ชจ๋์ `simple`๋ชจ๋ (2.0 ๋ฒ์ ์ ๊น์ ๊ธฐ๋ณธ)์ ํจ๊ป,
์๋ ์ปค๋งจ๋๋ ์ด์ ์ `-u` ์ต์
์ผ๋ก ๋ฑ๋ก๋ ๋ฆฌ๋ชจํธ ๋ธ๋์น์ ๊ด๋ จ๋ ํ์ฌ ๋ธ๋์น๋ฅผ ํธ์ํ ๊ฑฐ์์:
```sh
$ git push
```
`git push`์ ๋ค๋ฅธ ๋ชจ๋์ ๋์์ [`push.default` ๋ฌธ์](https://git-scm.com/docs/git-config#git-config-pushdefault)์ ์ค๋ช
๋ผ ์์ด์.
### ๋ฆฌ๋ชจํธ ๋ธ๋์น๋ฅผ ๋ก์ปฌ ๋ธ๋์น๋ฅผ ์ํ ์
์คํธ๋ฆผ์ผ๋ก ์ค์ ํ๊ณ ์ถ์ด
๋ฆฌ๋ชจํธ ๋ธ๋์น๋ฅผ ํ์ฌ ์ฐ๊ณ ์๋ ๋ก์ปฌ ๋ธ๋์น๋ฅผ ์ํ ์
์คํธ๋ฆผ์ผ๋ก ์ค์ ํ ์ ์์ด์:
```sh
$ git branch --set-upstream-to [remotename]/[branch]
# ์๋๋ฉด ์งง๊ฒ:
$ git branch -u [remotename]/[branch]
```
๋ค๋ฅธ ๋ก์ปฌ ๋ธ๋์น๋ฅผ ์ํ ์
์คํธ๋ฆผ ๋ฆฌ๋ชจํธ ๋ธ๋์น๋ฅผ ์ค์ ํ๋ ค๋ฉด:
```sh
$ git branch -u [remotename]/[branch] [local-branch]
```
### HEAD๋ฅผ ๊ธฐ๋ณธ ๋ฆฌ๋ชจํธ ๋ธ๋์น๋ก ํธ๋ํนํ๋๋ก ์ค์ ํ๊ณ ์ถ์ด
๋ฆฌ๋ชจํธ ๋ธ๋์น๋ฅผ ํ์ธํด๋ณด๋ ๊ฒ์ผ๋ก, HEAD๊ฐ ํธ๋ํน ์ค์ธ ๋ฆฌ๋ชจํธ ๋ธ๋์น๋ฅผ ๋ณผ ์ ์์ด์. ๋ช๋ช ๊ฒฝ์ฐ์๋, ์ํ๋ ๋ธ๋์น๊ฐ ์๋๊ฑฐ์์.
```sh
$ git branch -r
origin/HEAD -> origin/gh-pages
origin/master
```
`origin/HEAD`๋ฅผ `origin/master`๋ฅผ ํธ๋ํนํ๋ ๊ฒ์ผ๋ก ๋ณ๊ฒฝํ๋ ค๋ฉด, ์ด ์ปค๋งจ๋๋ก ์คํํ ์ ์์ด์:
```sh
$ git remote set-head origin --auto
origin/HEAD set to master
```
### ๋ค๋ฅธ ๋ธ๋์น์ ๋ณ๊ฒฝ์ ์ ์๋ชป ๋จ๊ฒผ์ด
์ปค๋ฐ ๋์ง ์์ ๋ณ๊ฒฝ์ , ๊ฑฐ๊ธฐ๋ค ์๋ชป๋ ๋ธ๋์น์ ํ๊ณ ์์๋ค๋ฉด ๋ณ๊ฒฝ์ ์ ์คํ
์ด์ ํ๊ณ ์ํ๋ ๋ธ๋์น๋ก ๊ฐ ์คํ
์ด์ ์ดํ๋ผ์ด ํด์:
```sh
(wrong_branch)$ git stash
(wrong_branch)$ git checkout
(correct_branch)$ git stash apply
```
## ๋ฆฌ๋ฒ ์ด์ค์ ๋จธ์ง
### ๋ฆฌ๋ฒ ์ด์ค/๋จธ์ง ํ ๊ฑธ ๋๋๋ฆฌ๊ณ ์ถ์ด
ํ์ฌ ๋ธ๋์น๋ฅผ ์๋ํ์ง ์๋ ๋ธ๋์น๋ก ๋จธ์ง ๋๋ ๋ฆฌ๋ฒ ์ด์ค ํ๊ฑฐ๋, ๋ฆฌ๋ฒ ์ด์ค/๋จธ์ง ๋์ค์ ์๋ฃํ๊ฑฐ๋ ๋๋ด์ง ๋ชปํ์๊ฑฐ์์.
๊น์ ์ํํ ๊ณผ์ ์ ์ ์๋์ HEAD ํฌ์ธํธ๋ฅผ ORIG_HEAD๋ผ ๋ถ๋ฆฌ๋ ๋ณ์์ ๋ณด๊ดํด์, ๊ทธ๋ฌ๋ ๋ฆฌ๋ฒ ์ด์ค/๋จธ์ง ์ ์ํ๋ก ๋ธ๋์น๋ฅผ ๋ณต๊ตฌํ๊ธฐ ๊ฐ๋จํด์.
```sh
(my-branch)$ git reset --hard ORIG_HEAD
```
### ๋ฆฌ๋ฒ ์ด์ค๋ฅผ ํ๋๋ฐ, ๊ฐ์ ํธ์ํ๊ณ ์ถ์ง ์์
์์ฝ๊ฒ๋ ๊ทธ๋ฐ ๋ณ๊ฒฝ์ ์ ๋ฆฌ๋ชจํธ ๋ธ๋์น์ ๋ฐ์ํ๋ ค๋ฉด ๊ฐ์ ํธ์๋ฐ์ ๋ฐฉ๋ฒ์ด ์์ด์. ์ด๋ ฅ์ ๋ณ๊ฒฝํด์๊ธฐ ๋๋ฌธ์ด์ฃ .
๋ฆฌ๋ชจํธ ๋ธ๋์น๋ ๊ฐ์ ํธ์ ์ธ์ ์ ์ฉ ํด์ฃผ์ง ์์๊ฑฐ์์.
๋ง์ ๋ถ๋ค์ด ๋จธ์ง ์ํฌํ๋ก์ฐ๋ฅผ ๋ฆฌ๋ฒ ์ด์ค ์ํฌํ๋ก์ฐ๋ณด๋ค ์ ํธํ๋ ๋ง์ด ์ด์ ์ค ํ๋์ฃ - ํฐ ํ์์ ๊ฐ๋ฐ์์ ๊ฐ์ ํธ์๋ก ๊ณค๋ํด์ง ์ ์์ด์.
์ฃผ์ํด์ ์ฐ์ธ์.
๋ฆฌ๋ฒ ์ด์ค๋ฅผ ๊ทธ๋๋ง ์์ ํ๊ฒ ์ฐ๋ ๋ฐฉ๋ฒ์ ๋ฆฌ๋ชจํธ ๋ธ๋์น์ ๋ชจ๋ ๋ณ๊ฒฝ์ ๊ณผ ๋๊ฐ์ด ๋ฐ์ํ๋๊ฒ ์๋๋ผ ๋์ ์ ์ด๋ ๊ฒ ํด๋ด์:
```sh
(master)$ git checkout my-branch
(my-branch)$ git rebase -i master
(my-branch)$ git checkout master
(master)$ git merge --ff-only my-branch
```
๋ ํ์ธ์ด ํ์ํ๋ค๋ฉด, [์ด ์คํ์ค๋ฒํ๋ก์ฐ์ ์ฐ๋ ๋](https://stackoverflow.com/questions/11058312/how-can-i-use-git-rebase-without-requiring-a-forced-push)๋ฅผ ์ฐธ๊ณ ํด์.
### ์ปค๋ฐ๋ผ๋ฆฌ ํฉ์น๊ณ ์ถ์ด
`master`์ ํ ๋ฆฌํ์คํธ๊ฐ ๋ ๋ธ๋์น์์ ์์
ํ๊ณ ์๋ค๊ณ ๊ฐ์ ํด๋ด์.
๊ฐ์ฅ ๊ฐ๋จํ ๊ฒฝ์ฐ๋ ์ํ๋๊ฒ *๋ชจ๋ * ์ปค๋ฐ์ ํ๋์ ์ปค๋ฐ์ผ๋ก ํฉ์น๊ณ ๋ณ๊ฒฝ์ ์ ์๊ฐ์ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋๋ ๊ฒ์ผ ๋, ๋ฆฌ์
ํ๊ณ ์ปค๋ฐ ๋ค์ํ๋ฉด ๋ผ์.
๋ง์คํฐ ๋ธ๋์น๊ฐ ์ต์ ์ด๊ณ ๋ชจ๋ ๋ณ๊ฒฝ์ ์ด ์ปค๋ฐ๋ ๊ฒ๋ง ํ์ธํ ๋ค์:
```sh
(my-branch)$ git reset --soft master
(my-branch)$ git commit -am "New awesome feature"
```
์ข๋ ์กฐ์ ํ๊ณ , ์๊ฐ๊ธฐ๋ก๊น์ง ๋ณด๊ดํ๊ณ ์ถ๋ค๋ฉด, ๋ํํ ๋ฆฌ๋ฒ ์ด์ค๊ฐ ํ์ํ ๊ฑฐ์์.
```sh
(my-branch)$ git rebase -i master
```
๋ง์ฝ ๋ค๋ฅธ ๋ธ๋์น๋ก ๋ถ๋ ์์
์ ํ๋๊ฒ ์๋๋ผ๋ฉด, `HEAD`์ ๊ธฐ์ค์ผ๋ก ๋ฆฌ๋ฒ ์ด์ค ํด์ผํด์.
์๋ก ๋ง์ง๋ง 2๊ฐ์ ์ปค๋ฐ์ ์ค์ฟผ์(๊ธฐ์กด ์ปค๋ฐ์ ๋ฐ์ํด๋ฃ๋)ํ๊ณ ์ถ๋ค๋ฉด `HEAD~2`๋ก ๋ฆฌ๋ฒ ์ด์ค ํด์. 3๊ฐ๋ผ๋ฉด `HEAD~3`์ผ๋ก ํ๊ตฌ์.
```sh
(master)$ git rebase -i HEAD~2
```
๋ํํ ๋ฆฌ๋ฒ ์ด์ค๋ฅผ ์คํํ๋ฉด ํ
์คํธ ์๋ํฐ๋ก ์ด๋ฐ ๊ฒ๋ค์ ๋ณผ ์ ์์๊ฑฐ์์.
```vim
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`๋ก ๋ฐ๊ฟ์ผ ํ ๊ฑฐ์์:
```vim
pick a9c8a1d Some refactoring
pick 01b2fd8 New awesome feature
f b729ad5 fixup
f e3851e8 another fix
```
์ด ์ปค๋ฐ๋ค์ ํฉ์น๊ณ **์ปค๋ฐ ์ด๋ฆ์ ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด**, ์ถ๊ฐ๋ก ์ ์ด์ค์ผ ํด์ ๋๋ฒ์งธ ์ปค๋ฐ ๋ค์์ `r`๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ฐ๋จํ `f` ๋์ `s`๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋ ๊ฑฐ์์:
```vim
pick a9c8a1d Some refactoring
pick 01b2fd8 New awesome feature
s b729ad5 fixup
s e3851e8 another fix
```
๊ทธ๋ฐ ๋ค์์ ํ๋ฒ ๋ ๋จ๋ ํ
์คํธ ์๋ํฐ๋ก ์ปค๋ฐ ์ด๋ฆ์ ๋ฐ๊ฟ ์ ์์ด์.
```vim
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
#
```
์ ๋ถ ๋ค ์ฑ๊ณตํ๋ฉด, ์ด๋ฐ ๋ฉ์ธ์ง๋ฅผ ๋ณผ๊ฑฐ์์:
```sh
(master)$ Successfully rebased and updated refs/heads/master.
```
#### ์์ ํ ๋จธ์ง ์ ๋ต
`--no-commit`๋ ๋จธ์ง๋ ํ์ง๋ง ์คํจํ๊ณ ์๋ ์ปค๋ฐ์ด ์๋๊ฒ์ฒ๋ผ ๋ณด์ด๋๋ฐ, ์ปค๋ฐํ๊ธฐ์ ์ ๋จธ์ง ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ์ถ๊ฐ๋ก ์กฐ์ ํ ์ ์๊ฒ ํด์ค์.
`no-ff`๋ ํผ์ณ ๋ธ๋์น๊ฐ ์์๋ค๋ ์ฆ๊ฑฐ๋ฅผ ๋จ๊ธฐ๊ณ , ์ด๋ ฅ์ ์ผ๊ด๋๊ฒ ๊ฐ์ง๊ฒ ํด์.
```sh
(master)$ git merge --no-ff --no-commit my-branch
```
#### ๋ธ๋์น๋ฅผ ์ปค๋ฐ ํ๋๋ก ๋จธ์งํด์ผํด
```sh
(master)$ git merge --squash my-branch
```
#### ํธ์ ๋์ง ์์ ์ปค๋ฐ๋ง ํฉ์น๊ณ ์ถ์ด
๊ฐ๋ ์ฌ๋ฌ๊ฐ์ง ์์
๋์ค์ธ ์ปค๋ฐ์ ํธ์ํ๊ธฐ ์ ์ ํฉ์น๊ณ ์ถ์๊ฑฐ์์.
๋ค๋ฅธ ๋๊ตฐ๊ฐ๊ฐ ๋ฒ์จ ์ฐธ๊ณ ํด์ ์ปค๋ฐ์ ๋ง๋ค๊ณ ์์ํ
๋ ์ด๋ฏธ ํธ์๋ ์ปค๋ฐ์ ์๋ชป ํฉ์น๊ธธ ๋ฐ๋ผ์ง ์์๊ฑฐ์์.
```sh
(master)$ git rebase -i @{u}
```
์ด ๋ช
๋ น์ ์์ง ํธ์ํ์ง ์์ ์ปค๋ฐ๋ง์ผ๋ก ๋ํํ ๋ฆฌ๋ฒ ์ด์ค๋ฅผ ์คํํด์. ๊ทธ๋ฌ๋ ๋ชฉ๋ก ๋ด์ ์๋ ์ด๋ค ์ปค๋ฐ์ด๋ ์ฌ์ ๋ ฌ/์์ /ํฉ์น๊ธฐ ์์ ํด์.
#### ๋จธ์ง๋ฅผ ์ค๋จํด์ผํด
๋๋๋ก ๋จธ์ง๋ ์ด๋ค ํ์ผ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์๋ ์์ด์, ์ด ๊ฒฝ์ฐ ์ต์
`abort`์ผ๋ก ํ์ฌ ์ถฉ๋ ํด๊ฒฐ ํ๋ก์ธ์ค๋ฅผ ์ค๋จํ๊ณ ๋ณํฉํ๊ธฐ ์ ์ํ๋ก ๋ค์ ๊ตฌ์ฑํ ์ ์์ด์.
```sh
(my-branch)$ git merge --abort
```
์ด ๋ช
๋ น์ 1.7.4 ๋ฒ์ ๋ถํฐ ์ธ ์ ์์ด์.
### ๋ธ๋์น๋ด ๋ชจ๋ ์ปค๋ฐ์ด ๋จธ์ง๋๋์ง ํ์ธํด
๋ธ๋์น ๋ด ๋ชจ๋ ์ปค๋ฐ์ด ๋ค๋ฅธ ๋ธ๋์น๋ก ๋จธ์ง๋๋์ง ํ์ธํ๋ ค๋ฉด, ๊ทธ ๋ธ๋์น๋ค HEAD (๋๋ ํน์ ์ปค๋ฐ)๋ฅผ ๋น๊ตํด์ผํด์:
```sh
(master)$ git log --graph --left-right --cherry-pick --oneline HEAD...feature/120-on-scroll
```
์ด ๋ช
๋ น์ ์ด๋์๋ ์๊ณ ๋ค๋ฅธ๋ด ์๋ ์ปค๋ฐ์ด ์๋๋ฅผ ์๋ ค์ค๊ฑฐ์์ ๊ทธ๋ฆฌ๊ณ ๋ธ๋์น๋ค ์ฌ์ด์ ๊ณต์ ๋์ง ์์๊ฒ ๋ชฉ๋ก์ ๋ณด์ฌ์ค ๊ฑฐ๊ตฌ์. ๋ค๋ฅธ ์ต์
์ ์ด๋ ๊ฒ:
```sh
(master)$ git log master ^feature/120-on-scroll --no-merges
```
### ๋ํํ ๋ฆฌ๋ฒ ์ด์ค๋ก ๋ฐ์๊ฐ๋ฅํ ์ด์
#### ๋ฆฌ๋ฒ ์ด์ค ํธ์ง ํ๋ฉด์์ 'noop'
์ด๋ฐ ๊ฑธ ๋ณธ๋ค๋ฉด:
```
noop
```
๋์ผํ ์ปค๋ฐ์ ์๊ฑฐ๋ ํ์ฌ ๋ธ๋์น๋ณด๋ค ์์ ์๋ ๋ธ๋์น์ ๋ํด ๋ฆฌ๋ฒ ์ด์ค๋ฅผ ์๋ํ๋ค๋ ์๋ฏธ์์. ์ด๋ ๊ฒ ํด๋ณผ ์ ์์ด์:
* ๋ง์คํฐ ๋ธ๋์น๊ฐ ์์ด์ผ ํ ๊ณณ์ ์๋ ํ์ธ
* ๋์ ํด์ `HEAD~2` ๋๋ ๋ ๊ธฐ์กด ํญ๋ชฉ์ ๋ฆฌ๋ฒ ์ด์ค
#### ์ถฉ๋์ด ์์ด
๋ฆฌ๋ฒ ์ด์ค๋ฅผ ๋๋ฐ๋ก ๋๋ด์ง ๋ชปํ๋ค๋ฉด, ์ถฉ๋์ ํด๊ฒฐํด์ผ ํ ๊ฑฐ์์.
์ด๋ค ํ์ผ์ด ์ถฉ๋๋ฌ๋์ง `git status`๋ฅผ ๋จผ์ ์คํํด๋ด์:
```sh
(my-branch)$ git status
On branch my-branch
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
both modified: README.md
```
์ด ์์์์ , `README.md` ๊ฐ ์ถฉ๋๋ฌ๋ค์. ํ์ผ์ ์ด์ด์ ์๋์ ๊ฐ์ ๋ถ๋ถ์ ์ฐพ์๋ด์:
```vim
<<<<<<< HEAD
some code
=========
some code
>>>>>>> new-commit
```
์๋ก์ด ์ปค๋ฐ์ผ๋ก ์ถ๊ฐ๋ ์ฝ๋(์์์์ , ์ค๊ฐ ์ ๋ถํฐ `new-commit` ๊น์ง์)์ `HEAD` ์ฌ์ด์์ ์ฐจ์ด์ ์ ํด๊ฒฐํด์ผ ํ ๊ฑฐ์์.
์ด๋ ํ์ชฝ ๋ธ๋์น์ ์ฝ๋๋ฅผ ๋จ๊ธฐ๊ณ ์ถ๋ค๋ฉด, `--ours` ๋๋ `--theirs`๋ฅผ ์ฐ๋ฉด ๋ผ์:
```sh
(master*)$ git checkout --ours README.md
```
- *๋จธ์ง*ํ ๋, `--ours`๋ฅผ ์ฐ๋ฉด ๋ก์ปฌ ๋ธ๋์น์ ๋ณ๊ฒฝ์ ์ ์งํ๊ณ , `--theirs` ๋ ๋ค๋ฅธ ๋ธ๋์น์ ๋ณ๊ฒฝ์ ๋ฅผ ์ ์งํด์.
- *๋ฆฌ๋ฒ ์ด์ค*ํ ๋, `--theirs`๊ฐ ๋ก์ปฌ ๋ธ๋์น์ ๋ณ๊ฒฝ์ ์ ์ ์งํ๊ณ `--ours`๋ ๋ค๋ฅธ ๋ธ๋์น์ ๋ณ๊ฒฝ์ ์ ์ ์งํด์. ์ด๋ฐ ์ฐจ์ด์ ๊ดํ ์ค๋ช
์ Git ์ ์ ๋ฌธ์ ์ค [์ด ๋ฌธ์](https://git-scm.com/docs/git-rebase#git-rebase---merge)๋ฅผ ๋ณด์ธ์.
๋ง์ฝ ๋จธ์ง๊ฐ ๋ ๋ณต์กํ๋ฉด, ๋น์ฃผ์ผ ๋ํ ์๋ํฐ๋ฅผ ์ธ ์๋ ์์ด์:
```sh
(master*)$ git mergetool -t opendiff
```
์ฝ๋์ ์ถฉ๋์ ํด๊ฒฐํ๊ณ ํ
์คํธ๊ฐ ํด๊ฒฐ๋๊ณ ๋๋ฉด, ๋ฐ๋ ํ์ผ ๋ด์ฉ์ `git add` ํด์ฃผ๊ณ , `git rebase --continue`๋ก ๋ฆฌ๋ฒ ์ด์ค๋ฅผ ์ด์ด์ ํด์.
```sh
(my-branch)$ git add README.md
(my-branch)$ git rebase --continue
```
๋ง์ฝ ๋ชจ๋ ์ถฉ๋์ ๊ฐ์ ํ ๋ด์ฉ์ด ์ปค๋ฐ ์ ๊ณผ ๋์ผํ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค๋ฉด, ๋์ ์ `git rebase --skip`๋ฅผ ํด์ผ ํด์.
๋ฆฌ๋ฒ ์ด์ค ์ค ๋ฉ์ถ๊ณ ์ถ์ ์ด๋ค ์์ ์ด๊ฑฐ๋ ์๋ ์ํ์ ๋ธ๋์น๋ก ๋์๊ฐ๊ณ ์ถ๋ค๋ฉด, ์ด๋ ๊ฒ ํ ์ ์์ด์:
```sh
(my-branch)$ git rebase --abort
```
## ์คํ
์ด์
### ๋ชจ๋ ๋ณ๊ฒฝ์ ์คํ
์ด์ ํ๊ธฐ
์์
์ค์ธ ๋๋ ํ ๋ฆฌ์์์ ๋ณ๊ฒฝํ ๋ด์ฉ ์ ๋ถ๋ฅผ ์คํ
์ด์ ํ๋ ค๋ฉด
```sh
$ git stash
```
ํธ๋ํน ๋์ง ์์ ํ์ผ๊น์ง๋ ํฌํจํ๋ ค๋ฉด, `-u` ์ต์
์ ์จ์.
```sh
$ git stash -u
```
### ํน์ ํ์ผ๋ค๋ง ์คํ
์ด์ ํ๊ธฐ
์์
์ค์ธ ๋๋ ํ ๋ฆฌ์์ ํ ํ์ผ๋ง ์คํ
์ด์ ํ๊ธฐ
```sh
$ git stash push working-directory-path/filename.ext
```
์์
์ค์ธ ๋๋ ํ ๋ฆฌ์์ ์ฌ๋ฌ ํ์ผ ์คํ
์ด์ ํ๊ธฐ
```sh
$ git stash push working-directory-path/filename1.ext working-directory-path/filename2.ext
```
### ๋ฉ์ธ์ง์ ํจ๊ป ์คํ
์ด์ ํ๊ธฐ
```sh
$ git stash save
```
### ํน์ ์คํ
์ด์ ๋ชฉ๋ก์์ ๊ฐ์ ธ์ ์ ์ฉํ๊ธฐ
๋ฉ์ธ์ง ์์ฑ๋ ์คํ
์ด์ ๋ฆฌ์คํธ ๋จผ์ ํ์ธํ์ธ์
```sh
$ git stash list
```
๊ทธ๋ฐ ๋ค์ ๋ฆฌ์คํธ ๋ด ํน์ ์คํ
์ด์๋ฅผ ์ ์ฉํด์
```sh
$ git stash apply "stash@{n}"
```
์ฌ๊ธฐ์์, 'n' ์ ์คํ ์์์ ์คํ
์ด์์ ์์น๋ฅผ ๋ํ๋ด์. ์ ค ์์ ์๋ ์คํ
์ด์๊ฐ 0 ์ผ๊ฑฐ์์.
## ์ฐพ์๋ณด๊ธฐ
### ์ด๋ค ์ปค๋ฐ์์ ๋ฌธ์์ด์ ์ฐพ๊ณ ์ถ์ด
ํน์ ํ ๋ฌธ์์ด์ด ํฌํจ๋ ์ด๋ค ์ปค๋ฐ์ ์ฐพ์ผ๋ ค๋ฉด, ์ด๋ฐ ๊ตฌ์กฐ๋ก ์ธ ์ ์์ด์:
```sh
$ git log -S "string to find"
```
์ผ๋ฐ์ ์ธ ํ๋ผ๋ฏธํฐ๋ค์:
* `--source` ๊ฐ ์ปค๋ฐ์ ๋๋ฌํ ๋ช
๋ น์ด์ ์ง์ ๋ ์ฐธ์กฐ ์ด๋ฆ์ ๋ณด์ฌ์ฃผ๋๊ฑธ ์๋ฏธํด์.
* `--all` ๋ ๋ชจ๋ ๋ธ๋์น์์ ์์ํ๋๊ฑธ ์๋ฏธํด์.
* `--reverse` ๋ฐ๋์ ์์๋ก ์ถ๋ ฅํด์, ๋ณ๊ฒฝ์ ์ ์ฒซ๋ฒ์งธ ์ปค๋ฐ์ด ๋ณด์ผ๊บผ๋ ๊ฑฐ์ฃ .
### ์์ฑ์๋ ์ปค๋ฏธํฐ๋ฅผ ์ฐพ๊ณ ์ถ์ด
์์ฑ์๋ ์ปค๋ฏธํฐ์ ๋ชจ๋ ์ปค๋ฐ์ ์ฐพ์ผ๋ ค๋ฉด ์ด๋ ๊ฒ ์ธ ์ ์์ด์:
```sh
$ git log --author=
$ git log --committer=
```
์์ฑ์์ ์ปค๋ฏธํฐ๊ฐ ๊ฐ์ง ์๋ค๋ ๊ฒ๋ง ์ผ๋ํด๋์ธ์.
`--author`๋ ์ฝ๋๋ฅผ ์ค์ ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ฌ๋์ด๊ณ
๋ฐ๋ฉด์ `--committer`๋ ์ค์ ์์ฑ์๋ฅผ ๋์ ํด ์ปค๋ฐ์ ํ ์ฌ๋์ด์์.
### ํน์ ํ์ผ์ด ํฌํจ๋ ์ปค๋ฐ์ ๋ชฉ๋กํ ํ๊ณ ์ถ์ด
ํน์ ํ์ผ์ด ๋ ๋ชจ๋ ์ปค๋ฐ์ ์ฐพ์ผ๋ ค๋ฉด ์ด๋ ๊ฒ ํด์:
```sh
$ git log --
```
๋ณดํต์ ์ ํํ ๊ฒฝ๋ก๋ฅผ ์ธํ
์ง๋ง ์์ผ๋ ์นด๋๋ก ๊ฒฝ๋ก๋ ํ์ผ๋ช
์ ์ธ์๋ ์์ด์:
```sh
$ git log -- **/*.js
```
์์ผ๋ ์นด๋๋ฅผ ์ธ ๋, ์ปค๋ฐ๋ ํ์ผ์ ๋ชฉ๋ก์ ๋ณผ ์ ์๋ `--name-status`๋ก ํ์ธํ๋๊ฒ ์ ์ฉํ ๊ฑฐ์์:
```sh
$ git log --name-status -- **/*.js
```
### ์ปค๋ฐ์ ์ฐธ์กฐํ๋ ํ๊ทธ๋ฅผ ์ฐพ๊ณ ์ถ์ด
ํน์ ์ปค๋ฐ์ด ํฌํจ๋ ๋ชจ๋ ํ๊ทธ๋ฅผ ์ฐพ์ผ๋ ค๋ฉด:
```sh
$ git tag --contains
```
## ์๋ธ๋ชจ๋
### ๋ชจ๋ ์๋ธ๋ชจ๋์ ํด๋ก ํ๊ธฐ
```sh
$ git clone --recursive git://github.com/foo/bar.git
```
๋ฒ์จ ํด๋ก ํ๋ค๋ฉด:
```sh
$ git submodule update --init --recursive
```
### ์๋ธ๋ชจ๋ ์ง์ฐ๊ธฐ
์๋ธ๋ชจ๋์ ๋ง๋๋๊ฑด ์์ฃผ ๊ฐ๋จํ์ง๋ง ์ง์ฐ๋๊ฑด ๊ทธ๋ ์ง ์์์. ํ์ํ ๋ช
๋ น์ด๋:
```sh
$ git submodule deinit submodulename
$ git rm submodulename
$ git rm --cached submodulename
$ rm -rf .git/modules/submodulename
```
## ๊ธฐํ ํญ๋ชฉ๋ค
### ์ง์ด ํ์ผ ๋ณต๊ตฌํ๊ธฐ
์ฐ์ ๊ทธ ํ์ผ์ด ๋ง์ง๋ง์ผ๋ก ์์๋ ์ปค๋ฐ์ ์ฐพ๊ณ :
```sh
$ git rev-list -n 1 HEAD -- filename
```
๊ทธ๋ฐ ๋ค์ ๊ทธ ํ์ผ์ ์ฒดํฌ์์ํด์
```
git checkout deletingcommitid^ -- filename
```
### ํ๊ทธ ์ง์ฐ๊ธฐ
```sh
$ git tag -d
$ git push :refs/tags/
```
### ์ง์์ง ํ๊ทธ ๋ณต๊ตฌํ๊ธฐ
์ด๋ฏธ ์ง์ด ํ๊ทธ๋ฅผ ๋ณต๊ตฌํ๊ณ ์ถ๋ค๋ฉด, ์ด๋ฐ ๋จ๊ณ๋ฅผ ๋ฐ๋ผํด ๋ณผ ์ ์์ด์: ์ฐ์ , ์ฐ๊ฒฐํ ์ ์๋ ํ๊ทธ๋ฅผ ์ฐพ๊ณ :
```sh
$ git fsck --unreachable | grep tag
```
ํ๊ทธ์ ํด์ฌ๋ฅผ ๋ฉ๋ชจํด๋์ธ์.
๊ทธ๋ฐ ๋ค์ [`git update-ref`](https://git-scm.com/docs/git-update-ref)์ ์จ์ ์ง์์ง ํ๊ทธ๋ฅผ ๋ณต๊ตฌํด์:
```sh
$ git update-ref refs/tags/
```
์ด์ ํ๊ทธ๊ฐ ๋ณต๊ตฌ๋ผ์์๊ฑฐ์์.
### ์ง์์ง ํจ์น
๋ง์ฝ ๊นํ์์ ๋๊ตฐ๊ฐ๊ฐ ํ๋ฆฌํ์คํธ๋ฅผ ๋ณด๋๋๋ฐ ์ด๋ฏธ ์๋์ ํฌํฌ๊ฐ ์ง์์ก๋ค๋ฉด,
url์ ์ธ ์ ์๊ฒ ๋ผ ๋ ํ์งํ ๋ฆฌ๋ฅผ ํด๋ก ํ ์ ์๊ฑฐ๋ [.diff, .patch](https://github.com/blog/967-github-secrets)์ ๊ฐ์ `git am`๋ฅผ ์ธ ์ ์์ ๊ฑฐ์์.
ํ์ง๋ง [๊นํ์ ํน๋ณํ ์ฐธ์กฐ](https://gist.github.com/piscisaureus/3342247)์ ์ด์ฉํด์ ํ ๋ฆฌํ์คํธ ์์ฒด๋ฅผ ํ์ธํ ์ ์์ด์.
PR#1์ ๋ด์ฉ์ pr_1์ด๋ ์ ๋ธ๋์น๋ก ํจ์น ๋ฐ์ผ๋ ค๋ฉด:
```sh
$ git fetch origin refs/pull/1/head:pr_1
From github.com:foo/bar
* [new ref] refs/pull/1/head -> pr_1
```
### Zipํ์ผ๋ก ๋ ํ์งํ ๋ฆฌ ์ถ์ถํ๊ธฐ
```sh
$ git archive --format zip --output /full/path/to/zipfile.zip master
```
## ํ์ผ ์ถ์ ํ๊ธฐ
### ํ์ผ ๋ด์ฉ์ ๋ณ๊ฒฝ์ด ์์ด ํ์ผ ์ด๋ฆ์ ์๊ธ์๋ง ๋๋ฌธ์๋ก ๋ฐ๊พธ๊ณ ์ถ์ด
```sh
(master)$ git mv --force myfile MyFile
```
### ๊น ํ ๋ฐ์๋ ๋ก์ปฌ ํ์ผ์ ๋ฎ์ด์์ฐ๊ณ ์ถ์ด
```sh
(master)$ git fetch --all
(master)$ git reset --hard origin/master
```
### ํ์ผ์ ๋ก์ปฌ์๋ ๋ณด๊ดํ๊ณ ๊น์์ ์ง์ฐ๊ณ ์ถ์ด
```sh
(master)$ git rm --cached log.txt
```
### ํน์ ํ ๋ฒ์ ๋๋ก ํ์ผ์ ๋ณต๊ตฌํ๊ณ ์ถ์ด
๋ณต๊ตฌํ๊ณ ์ถ์ ํด์๊ฐ c5f567 ์ด๋ผ๊ณ ๊ฐ์ ํ๋ฉด:
```sh
(master)$ git checkout c5f567 -- file1/to/restore file2/to/restore
```
c5f567 ํ ๋จ๊ณ์ ์ผ๋ก ๋ณต๊ตฌํ๊ณ ์ถ๋ค๋ฉด, c5f567~1๋ก ์ ์ด์ค์:
```sh
(master)$ git checkout c5f567~1 -- file1/to/restore file2/to/restore
```
### ์ปค๋ฐ๊ณผ ๋ธ๋์น ๊ฐ์ ํน์ ํ์ผ ๋ณ๊ฒฝ ์ด๋ ฅ์ด ํ์ํด
๋ง์ง๋ง ์ปค๋ฐ๊ณผ c5f567์ผ๋ก ๋ถํฐ์ ์ฐจ์ด๋ฅผ ๋น๊ตํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํ๋ฉด:
```sh
$ git diff HEAD:path_to_file/file c5f567:path_to_file/file
```
๋ธ๋์น๋ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก:
```sh
$ git diff master:path_to_file/file staging:path_to_file/file
```
## ์ค์
### ๊น ๋ช
๋ น์ด ๋ช ๊ฐ๋ฅผ ์จ๋ฆฌ์ด์ค ๋ฑ๋กํ๊ณ ์ถ์ด
๋งฅOS๋ ๋ฆฌ๋
์ค์๋, ๊น ์ค์ ํ์ผ์ด ```~/.gitconfig``` ์ ์์ด์. ๋จ์ถ์ฉ์ผ๋ก (๋ช๊ฐ๋ ํ์ ์ฐ๋ ์ฉ๋๋ก) ์จ๋ฆฌ์ด์ค ๋ช๊ฐ๋ฅผ ์๋์ ๊ฐ์ด ๊ณ์ ์ถ๊ฐํด์ค๊ณ ์์ด์.
```vim
[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์ด๋ผ๋ ์ด๋ฆ์ ๋น ํ์ผ์ ๋ง๋๋ ๊ฑฐ์์.
```sh
$ mkdir mydir
$ touch mydir/.gitkeep
```
.keep์ด๋ ์ด๋ฆ์ผ๋ก๋ ์ธ ์ ์๋๋ฐ์, ๋๋ฒ์งธ ๋ผ์ธ์ด ```touch mydir/.keep```๊ฐ ๋์ด์ผ๊ฒ ์ฃ .
### ๋ ํ์งํ ๋ฆฌ ์ ์ ๋ช
๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์บ์ํด๋๊ณ ์ถ์ด
์ธ์ฆ์ด ํ์ํ ๋ ํ์งํ ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์์ ํ
๋ฐ์.
์ด๋ฐ ๊ฒฝ์ฐ ์ ์ ๋ช
๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์บ์ํ ์ ์์ํ
๋ ๋งค๋ฒ ํธ์/ํ ํ ๋๋ง๋ค ์
๋ ฅํ ํ์ ์์ด์.
ํฌ๋ฆฌ๋ด์
ํฌํผ๊ฐ ํด์ค๊ฑฐ์์.
```sh
$ git config --global credential.helper cache
# Set git to use the credential memory cache
```
```sh
$ git config --global credential.helper 'cache --timeout=3600'
# Set the cache to timeout after 1 hour (setting is in seconds)
```
### ๊น์ด ๊ถํ๊ณผ ํ์ผ๋ชจ๋ ๋ณ๊ฒฝ์ ๋ฌด์ํ๊ฒ ๋ง๋ค๊ณ ์ถ์ด
```sh
$ git config core.fileMode false
```
์ด ๊ฒ์ ๋ก๊ทธ์ธ๋ ์ ์ ์ ๊ธฐ๋ณธ ํ์๋ก ์ค์ ์ผ๋ก ํด๋๋ ค๋ฉด, ์ด๋ ๊ฒ ์จ์:
```sh
$ git config --global core.fileMode false
```
### ๊ธ๋ก๋ฒ ์ ์ ๋ก ์ค์ ํด๋๊ณ ์ถ์ด
๋ชจ๋ ๋ก์ปฌ ๋ ํ์งํ ๋ฆฌ์ ์ฌ์ฉ๋๋ ์ ์ ์ ๋ณด๋ฅผ ์ค์ ํ๋ ค๋ฉด, ๊ทธ๋ฆฌ๊ณ ๋ฒ์ ์ด๋ ฅ์ ๋ฆฌ๋ทฐํ ๋ ์์๋ณด๊ธฐ ์ฌ์ด ์ด๋ฆ์ผ๋ก ์ค์ ํ๋ ค๋ฉด:
```sh
$ git config --global user.name โ[firstname lastname]โ
```
๊ฐ ์ด๋ ฅ ์์ฐ์์๊ฒ ์ฐ๊ดํด์ ์ด๋ฉ์ผ ์ค์ ์ ํด์ฃผ๋ ค๋ฉด:
```sh
git config --global user.email โ[valid-email]โ
```
### ๊น์ ๋ช
๋ น์ด ์์์์ ๋ฃ๊ณ ์ถ์ด
์ ์ฌ์ด ๋ฆฌ๋ทฐ๋ฅผ ์ํ ๊น ๋ช
๋ น์ค ์๋ ์์์ ์ค์ ํ๋ ค๋ฉด:
```sh
$ git config --global color.ui auto
```
## ๋ญ ์๋ชปํ๋์ง ๋ชจ๋ฅด๊ฒ ์ด
์, ๋งํ๊ตฐ์. ๋ญ๊ฐ๋ฅผ `reset` ํ๊ฑฐ๋, ๋ค๋ฅธ ๋ธ๋์น๋ก ๋จธ์งํ๊ฑฐ๋, ์ง๊ธ์ ์ฐพ์ง ๋ชปํ๋ ์ปค๋ฐ์ผ๋ก ๊ฐ์ ํธ์๋ฅผ ํด๋ฒ๋ ธ๊ตฐ์.
์๋ค์ํผ, ์ด๋ค ์์ ์์ , ์ ํ๊ณ ์์๊ณ ๊ฑฐ๊ธฐ๋ก ๋์๊ฐ๊ณ ์ถ๊ฒ ์ฃ .
์ด๊ฒ ๋ฐ๋ก `git reflog`์ ์กด์ฌ์ด์ ์์. `reflog` ๋ ๋ธ๋์น ๋์ ์ด๋ค ๋ณ๊ฒฝ์ ์ด๋ ๋ธ๋์น๋ ํ๊ทธ์ ์ํด ์ฐธ์กฐ๋์ง ์๋๋ผ๋ ๋ค ๋ณด๊ดํด์.
๊ธฐ๋ณธ์ ์ผ๋ก, HEAD๊ฐ ๋ณ๊ฒฝ๋๋ ๋ชจ๋ ๊ฒฝ์ฐ, ๋ฆฌํ๋ก๊ทธ์ ์๋ก์ด ์
๋ ฅ์ด ์ถ๊ฐ๋ผ์. ์์ฝ๊ฒ๋ ์ด ๊ธฐ๋ฅ์ ๋ก์ปฌ ๋ ํ์งํ ๋ฆฌ์์๋ง ๋์ํด๊ณ , ์ค์ง ์์ง์๋ง์ ํธ๋ํนํด์ (์๋ฅผ ๋ค์๋ฉด ์ด๋์๋ ๊ธฐ๋ก๋์ง ์์๋ ํ์ผ์ ๋ณ๊ฒฝ์ ์๋์์)
```sh
(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)๋ฅผ ๊ฐ๋ฆฌํค๋ ์ปค๋ฐ ๋ง์คํฐ๋ฅผ ํฌํจํ ๊ฑฐ์์.
```sh
$ git reset --hard 0254ea7
```
`git reset`์ ์ฐ๋ ๊ฒ์ผ๋ก ๋ง์คํฐ๋ฅผ ์ด์ ์ปค๋ฐ์ผ๋ก ๋๋๋ฆด ์ ์์ด์.
์ด๋ ฅ์ด ์ค์๋ก ๋ณ๊ฒฝ๋์ ๋์ ์์ ๋ง์ ์ ๊ณตํ ๊ฑฐ์์.
([์ฌ๊ธฐ](https://www.atlassian.com/git/tutorials/rewriting-history/git-reflog)์์ ๋ณต์ ํด์ ์์ ํ์ด์).
# ๋ค๋ฅธ ๋ฆฌ์์ค
## ๋์
* [Pro Git](https://git-scm.com/book/en/v2) - Scott Chacon ๊ณผ Ben Straub์ ํ๋ฅญํ ๊น ์ฑ
* [Git Internals](https://github.com/pluralsight/git-internals-pdf) - Scott Chacon์ ๋๋ค๋ฅธ ํ๋ฅญํ ๊น ์ฑ
## ํํ ๋ฆฌ์ผ
* [Atlassian's Git tutorial](https://www.atlassian.com/git/tutorials) ๊ธฐ์ด๋ถํฐ ๊ณ ๊ธ๊น์ง ํํ ๋ฆฌ์ผ๊ณผ ํจ๊ป ํ๋ ๊น ์ ๋๋ก ์ป๊ธฐ
* [Learn Git branching](https://learngitbranching.js.org/) ๋ํํ ์น ๊ธฐ๋ฐ์ ๋ธ๋์น/๋จธ์ง/๋ฆฌ๋ฒ ์ด์ค ํํ ๋ฆฌ์ผ
* [Getting solid at Git rebase vs. merge](https://medium.com/@porteneuve/getting-solid-at-git-rebase-vs-merge-4fa1a48c53aa)
* [git-workflow](https://github.com/asmeurer/git-workflow) - [Aaron Meurer](https://github.com/asmeurer)์ ์ด๋ป๊ฒ ๊น์ ํตํด ์คํ์์ค ๋ ํ์งํ ๋ฆฌ์ ์ด๋ป๊ฒ ๊ธฐ์ฌํ ๊น
* [GitHub as a workflow](https://hugogiraudel.com/2015/08/13/github-as-a-workflow/) - ๊นํ์ ์ํฌํ๋ก์ฐ๋ก ์ฐ๋ ํฅ๋ฏธ๋ก์ด ์์
, ํนํ ๋น ํ ๋ฆฌํ์คํธ๋ฅผ ํ์ฉํ๋
* [Githug](https://github.com/Gazler/githug) - ๋ ์ผ๋ฐ์ ์ธ ๊น ์ํฌํ๋ก์ฐ๋ฅผ ๋ฐฐ์ฐ๋ ๊ฒ์
## ์คํฌ๋ฆฝํธ์ ๋๊ตฌ
* [firstaidgit.io](http://firstaidgit.io/) ๊ฐ์ฅ ๋ง์ด ๋ฌป๋ ๊น ์ง๋ฌธ์, ๊ฒ์๊ฐ๋ฅํ ๋ชจ์
* [git-extra-commands](https://github.com/unixorn/git-extra-commands) - ์ ์ฉํ ๊ธฐํ ๊น ์คํฌ๋ฆฝํธ ๋ชจ์
* [git-extras](https://github.com/tj/git-extras) - ๊น ์ ํธ๋ฆฌํฐ -- ๋ ํ์งํ ๋ฆฌ ์์ฝ, repl, ๋ณ๊ฒฝ์ด๋ ฅ ๋ฐ์ง๋, ์์ฑ์ ์ปค๋ฐ ๋น์จ ๋ฑ
* [git-fire](https://github.com/qw3rtman/git-fire) - git-fire๋ ๋ชจ๋ ํ์ฌ ํ์ผ์ ์ถ๊ฐ,์ปค๋ฐ,์ ๋ธ๋์น๋ก ํธ์(๋จธ์ง๋ฅผ ์๋ฐฉํ๊ธฐ ์ํ) ๋ฑ ๋น์์ฌํ๋ฅผ ๋์์ฃผ๋ ํ๋ฌ๊ทธ์ธ
* [git-tips](https://github.com/git-tips/tips) - ์๊ทธ๋งํ ๊น ํ๋ค
* [git-town](https://github.com/Originate/git-town) - ํฌ๊ด์ ์ด๊ณ , ๋์ ์์ค์ ๊น ์ํฌํ๋ก์ฐ ์ง์! http://www.git-town.com
## GUI ํด๋ผ์ด์ธํธ
* [GitKraken](https://www.gitkraken.com/) - ์์ ๊ณ ๊ธ์ ๊น ํด๋ผ์ด์ธํธ Windows, Mac & Linux
* [git-cola](https://git-cola.github.io/) - ๋ ๋ค๋ฅธ ๊น ํด๋ผ์ด์ธํธ Windows, OS X
* [GitUp](https://github.com/git-up/GitUp) - ์์ฃผ ๋
๋จ์ ์ผ๋ก ๋ฐฉ์์ผ๋ก ๊น์ ๋ณต์กํจ์ ๋ค๋ฃจ๋ ์๋ก์ด GUI
* [gitx-dev](https://rowanj.github.io/gitx/) - ๋๋ค๋ฅธ ๊ทธ๋ํฝ์ ์ธ ๊น ํด๋ผ์ด์ธํธ OS X
* [Sourcetree](https://www.sourcetreeapp.com/) - ์๋ฆ๋ต๊ณ ๋ฌด๋ฃ์ธ ๊น GUI ์์์ ๋จ์ํจ๊ณผ ๊ฐ๋ ฅํจ์ด ๋ง๋ฌ์ด Windows and Mac
* [Tower](https://www.git-tower.com/) - ๊ทธ๋ํฝ Git ํด๋ผ์ด์ธํธ OS X (์ ๋ฃ)
* [tig](https://jonas.github.io/tig/) - ๊น์ ์ํ ํฐ๋ฏผ๋ฌ ํ
์คํธ ๋ชจ๋ ์ธํฐํ์ด์ค
* [Magit](https://magit.vc/) - Emacs ํจํค์ง๋ฅผ ์ํด ๊ตฌํ๋ ๊น ์ธํฐํ์ด์ค
* [GitExtensions](https://github.com/gitextensions/gitextensions) - ์ ํ์ฅ, ๋น์ฃผ์ผ ์คํฌ๋์ค 2010-2015 ํ๋ฌ๊ทธ์ธ ๊ทธ๋ฆฌ๊ณ ๋
์์ ์ธ ๊น ๋ ํ์งํ ๋ฆฌ ๋๊ตฌ
* [Fork](https://git-fork.com/) - ๋น ๋ฅด๊ณ ์น์ํ ๊น ํด๋ผ์ด์ธํธ Mac (๋ฒ ํ)
* [gmaster](https://gmaster.io/) - 3-way ๋จธ์ง, ๋ฆฌํฉํฐ ๋ถ์๊ธฐ, ์๋ฉํฑ diff์ ๋จธ์ง ๊ธฐ๋ฅ์ ์๋ ์ ์ฉ ๊น ํด๋ผ์ด์ธํธ (๋ฒ ํ)
* [gitk](https://git-scm.com/docs/gitk) - ๊ฐ๋จํ ๋ ํ์งํ ๋ฆฌ ์ํ๋ฅผ ๋ณผ ์ ์๋ ๋ฆฌ๋
์ค ๊น ํด๋ผ์ด์ธํธ