# ๊นƒ์„ ์œ„ํ•œ flight rules ๐ŸŒ *[English](README.md) โˆ™ [Espaรฑol](README_es.md) โˆ™ [ะ ัƒััะบะธะน](README_ru.md) โˆ™ [็น้ซ”ไธญๆ–‡](README_zh-TW.md) โˆ™ [็ฎ€ไฝ“ไธญๆ–‡](README_zh-CN.md) โˆ™ [ํ•œ๊ตญ์–ด](README_kr.md) โˆ™ [Tiแบฟng Viแป‡t](README_vi.md) โˆ™ [Franรงais](README_fr.md) โˆ™ [ๆ—ฅๆœฌ่ชž](README_ja.md)* #### flight rules ๊ฐ€ ๋ญ์•ผ? ๋ญ”๊ฐ€ ์ž˜๋ชป ๋์„ ๋•Œ ๋ญ˜ ํ•ด์•ผํ• ์ง€์— ๋Œ€ํ•œ ์šฐ์ฃผ๋น„ํ–‰์‚ฌ๋ฅผ ์œ„ํ•œ ๊ฐ€์ด๋“œ (์—ฌ๊ธฐ์„  ๊นƒ์„ ์“ฐ๋Š” ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ) > *Flight Rules* ๋Š” ์–ด๋–ค ๋ฌธ์ œ X๊ฐ€ ๋ฐœ์ƒํ•œ ์ด์œ ์™€ ๊ทธ ๋‹จ๊ณ„์˜ ๋งค๋‰ด์–ผ์—์„œ ์–ด๋ ต์‚ฌ๋ฆฌ ์–ป์€ ์ง€์‹์ด์—์š”. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๋งค์šฐ ์ž์„ธํ•˜๊ณ  ๊ตฌ์ฒด์ ์ธ ์šด์˜ ์ ˆ์ฐจ๋ž๋‹ˆ๋‹ค. [...] > NASA๋Š” ์ˆ˜์„ฑ(Mercury) ์‹œ๋Œ€ ๋•Œ ์ง€์ƒํŒ€์—์„œ ์ฒ˜์Œ์œผ๋กœ "lessons learned" ์ด๋ž€ ๊ฒƒ์„ ๋ชจ์•˜๋Š”๋ฐ ์ˆ˜์ฒœ๊ฐœ์˜ ๋ฌธ์ œ์˜ ์ƒํ™ฉ๋“ค, ๋ถ€์„œ์ง„ ํ•ด์น˜ ์†์žก์ด๋กœ ์ธํ•œ ์—”์ง„ ๊ณ ์žฅ๋ถ€ํ„ฐ ์ปดํ“จํ„ฐ ๋ฌธ์ œ ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํ•ด๋‹ต๊นŒ์ง€, 1960๋…„๋Œ€ ์ดˆ๋ถ€ํ„ฐ ์šฐ๋ฆฌ์˜ ์‹ค์ˆ˜๋“ค, ์žฌ์•™๋“ค, ํ•ด๊ฒฐ์ฑ… ๋“ฑ์ด ๋ชฉ๋กํ™” ๋ผ์žˆ์–ด์š”. โ€” Chris Hadfield, *์ธ์ƒ์„ ์œ„ํ•œ ์šฐ์ฃผ๋น„ํ–‰์‚ฌ์˜ ๊ฐ€์ด๋“œ*. #### ์ด ๋ฌธ์„œ์˜ ๊ทœ์น™ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋ฌธ์„œ์˜ ๋ชจ๋“  ์˜ˆ์ œ๋Š” ํ˜„์žฌ ๋ธŒ๋žœ์น˜๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์Šคํ…Œ์ด์ง€์— ๋ณ€๊ฒฝ์ด ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์ปค์Šคํ…€ ๋œ ๋ฐฐ์‹œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์จ์š”. ๋ธŒ๋žœ์น˜๋Š” ๊ด„ํ˜ธ ์•ˆ์— ์žˆ๊ณ , ๋ธŒ๋žœ์น˜ ๋‹ค์Œ์˜ *๋Š” ์Šคํ…Œ์ด์ง€์˜ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด์š”. [![Join the chat at https://gitter.im/k88hudson/git-flight-rules](https://badges.gitter.im/Join%20Chat.svg)](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) - [๋ญ˜ ์ž˜๋ชปํ–ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์–ด](#%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 (main)$ git show ``` ๋˜๋Š” ```sh $ git log -n1 -p ``` ๋งŒ์•ฝ ํŠน์ • ์ปค๋ฐ‹์˜ ํŒŒ์ผ์„ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด, ์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ์–ด์š”. (commitID๋Š” ๋ฐ”๋กœ ๋‹น์‹ ์ด ๊ด€์‹ฌ์žˆ๋Š” ๊ทธ commit์ด์—์š”) ```sh $ git show :filename ``` ### ์ปค๋ฐ‹ ๋ฉ”์„ธ์ง€๋ฅผ ์ž˜๋ชป ์ผ์–ด ๋งŒ์•ฝ ๋ฉ”์‹œ์ง€๋ฅผ ์ž˜๋ชป ์ผ๊ณ  ์•„์ง ํ‘ธ์‹œ๋ฅผ ์•ˆํ–ˆ๋‹ค๋ฉด, ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๋ฐ”๊พธ๊ธฐ๋ฅผ ๋”ฐ๋ผํ•ด ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ```sh $ git commit --amend --only ``` ์ด ๋ฐฉ๋ฒ•์€ ํŽธ์ง‘ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋ณธ ํ…์ŠคํŠธ ์—๋””ํ„ฐ๊ฐ€ ์—ด๋ฆดํ…๋ฐ์š”, ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋ก  ํ•œ์ค„์— ์“ธ ์ˆ˜๋„ ์žˆ์–ด์š”. ```sh $ git commit --amend --only -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^ ``` ์ด ๋ฐฉ๋ฒ•์€ ํ‘ธ์‹œ๋ฅผ ์•ˆ ํ–ˆ์„ ๋•Œ๋งŒ ๋™์ž‘ํ•ด์š”. ํ‘ธ์‹œ๋ฅผ ํ–ˆ์œผ๋ฉด, ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ `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 (main)$ git reflog ``` ์ง€๋‚œ ์ปค๋ฐ‹๊ณผ ๋ฆฌ์…‹์„ ์œ„ํ•œ ์ปค๋ฐ‹์„ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฑฐ์—์š”. ๋Œ์•„๊ฐ€๊ณ  ์‹ถ์€ ์ปค๋ฐ‹์˜ SHA ์ฝ”๋“œ๋ฅผ ๊ณจ๋ผ์„œ, ๋ฆฌ์…‹์„ ํ•ด์š”: ```sh (main)$ 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 (main)$ 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 (main)$ 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 (my-branch)$ git reset --hard origin/my-branch ``` ### ์ƒˆ ๋ธŒ๋žœ์น˜ ๋Œ€์‹ ์— ๋งˆ์Šคํ„ฐ์— ์ปค๋ฐ‹์„ ํ•ด๋ฒ„๋ ธ์–ด ๋งˆ์Šคํ„ฐ์— ์žˆ์œผ๋ฉด์„œ ์ƒˆ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์–ด์š”: ```sh (main)$ git branch my-branch ``` ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ์กด ์ปค๋ฐ‹์œผ๋กœ ๋ฆฌ์…‹ํ•ด์š”: ```sh (main)$ 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 (main)$ git reset --hard a13b85e HEAD is now at a13b85e ``` ์ƒˆ ๋ธŒ๋žœ์น˜๋กœ ์ฒดํฌ์•„์›ƒ ํ•ด์„œ ๊ณ„์† ์ž‘์—…์„ ํ•ด์š”: ```sh (main)$ 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 (main)$ 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 (main)$ git reset --hard a13b85e HEAD is now at a13b85e ``` ๊ทธ๋ฆฌ๊ณ , 21๋ฒˆ ๋ฒ„๊ทธ ์ž‘์—…์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์ˆ˜ ์žˆ์–ด์š”: ```sh (main)$ git checkout -b 21 (21)$ ``` ๊ทธ๋ฆฌ๊ณ  21๋ฒˆ ๋ฒ„๊ทธ ์ปค๋ฐ‹์„ *์ฒด๋ฆฌํ”ฝ* ํ•ด์„œ ๋ธŒ๋žœ์น˜ ์ตœ์ƒ๋‹จ์— ์˜ฌ๋ ค์š”. ๊ทธ ์ปค๋ฐ‹์„ ์ ์šฉํ• ๊ฑด๋ฐ, ์˜ค์ง ๊ทธ ์ปค๋ฐ‹๋งŒ์„ ํ—ค๋“œ์— ๋ญ๊ฐ€ ์žˆ๋“  ์ตœ์ƒ๋‹จ์œผ๋กœ ์ ์šฉํ• ๊ฑฐ๋ž€ ์˜๋ฏธ์—์š”. ```sh (21)$ git cherry-pick e3851e8 ``` ์ด ์ง€์ ์—์„œ ์ถฉ๋Œ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ์–ด์š”. ์–ด๋–ป๊ฒŒ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ• ์ง€ [๋Œ€ํ™”ํ˜• ๋ฆฌ๋ฒ ์ด์Šค ์„น์…˜](#interactive-rebase) ์•ˆ์— ์žˆ๋Š” [**์ถฉ๋Œ์ด ์žˆ์–ด**](#merge-conflict) ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ•˜์„ธ์š”. ์ž ์ด์ œ 14๋ฒˆ ๋ฒ„๊ทธ ์ž‘์—…์„ ์œ„ํ•ด ๋งˆ์Šคํ„ฐ๋กœ ๊ฐ€์„œ ์ƒˆ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์–ด์š”. ```sh (21)$ git checkout main (main)$ git checkout -b 14 (14)$ ``` ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ, 14๋ฒˆ ๋ฒ„๊ทธ์ž‘์—…์„ ์œ„ํ•œ ์ปค๋ฐ‹์„ ์ฒด๋ฆฌํ”ฝํ•ด์š”. ```sh (14)$ git cherry-pick 5ea5173 ``` ### ์—…์ŠคํŠธ๋ฆผ์—์„  ์ง€์›Œ์ง„ ๋กœ์ปฌ ๋ธŒ๋žœ์น˜๋ฅผ ์ง€์šฐ๊ณ  ์‹ถ์–ด ๊นƒํ—™์— ํ’€๋ฆฌํ€˜์ŠคํŠธ๋กœ ๋จธ์ง€๋ฅผ ํ•˜๋ฉด, ํฌํฌ ๋œฌ ๋จธ์ง€ ๋ธŒ๋žœ์น˜๋ฅผ ์ง€์šธ๊ป€์ง€ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์„ ์ค˜์š”. ํ•ด๋‹น ๋ธŒ๋žœ์น˜์— ๊ณ„์† ์ž‘์—…ํ•  ์˜ˆ์ •์ด ์—†๋‹ค๋ฉด, ๋‹ค๋Ÿ‰์˜ ์˜ค๋ž˜๋œ ๋ธŒ๋žœ์น˜๋“ค๋กœ ๋’ค๋ฎ์ด์ง€ ์•Š๊ฒŒ ๋กœ์ปฌ ์ž‘์—…์„ ์ง€์›Œ์ฃผ๋Š”๊ฒŒ ๋” ๊น”๋”ํ•ด์š”. ```sh $ git fetch -p upstream ``` ์—ฌ๊ธฐ์„œ, `upstream`์€ ํŒจ์น˜๋กœ ๊ฐ€์ ธ์˜ค๋ ค๋Š” ๋ฆฌ๋ชจํŠธ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ์—์š”. ### ๋ธŒ๋žœ์น˜๋ฅผ ์ง€์›Œ๋ฒ„๋ ธ์–ด ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฆฌ๋ชจํŠธ์œผ๋กœ ํ‘ธ์‹œํ•œ๋‹ค๋ฉด, ๋Œ€๋ถ€๋ถ„์€ ์•ˆ์ „ํ•ด์•ผ ํ•ด์š”. ๊ทธ์น˜๋งŒ ๊ฐ€๋”์€ ๋ธŒ๋žœ์น˜๋ฅผ ์ง€์šธ ์ˆ˜ ์žˆ์–ด์š”. ์ƒˆ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  ํŒŒ์ผ์„ ํ•˜๋‚˜ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•ด๋ณด์ฃ : ```sh (main)$ 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 main Switched to branch 'main' Your branch is up-to-date with 'origin/main'. (main)$ git branch -D my-branch Deleted branch my-branch (was 4e3cd85). (main)$ echo oh noes, deleted my branch! oh noes, deleted my branch! ``` ์—ฌ๊ธฐ์—์„œ ์—…๊ทธ๋ ˆ์ด๋“œ๋œ ๋กœ๊ทธ ๋„๊ตฌ์ธ '๋ฆฌํ”Œ๋กœ๊ทธ'์— ์ต์ˆ™ํ•ด์ ธ์•ผ ํ•ด์š”. ๋ฆฌํ”Œ๋กœ๊ทธ๋Š” ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ์˜ ๋ชจ๋“  ํ–‰๋™์˜ ์ด๋ ฅ์„ ๋‹ค ๋ณด๊ด€ํ•ด์š”. ``` (main)$ git reflog 69204cd HEAD@{0}: checkout: moving from my-branch to main 4e3cd85 HEAD@{1}: commit: foo.txt added 69204cd HEAD@{2}: checkout: moving from main to my-branch ``` ๋ณด์‹œ๋‹ค์‹œํ”ผ ์ง€์›Œ์ง„ ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹ ํ•ด์‰ฌ๋„ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ์ง€์› ๋˜ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ด๋ฆด ์ˆ˜ ์žˆ๋Š” ์ง€ ํ•œ๋ฒˆ ํ•ด๋ณด์ฃ . ```sh (main)$ 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 (main)$ git push origin --delete my-branch ``` ์ด๋ ‡๊ฒŒ๋„: ```sh (main)$ git push origin :my-branch ``` ๋กœ์ปฌ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด: ```sh (main)$ git branch -d my-branch ``` ํ˜„์žฌ ๋ธŒ๋žœ์น˜๋‚˜ ์—…์ŠคํŠธ๋ฆผ์— ๋จธ์ง€๋˜์ง€ ์•Š์€ ๋กœ์ปฌ ๋ธŒ๋žœ์น˜๋ฅผ ์ง€์šฐ๋ ค๋ฉด: ```sh (main)$ git branch -D my-branch ``` ### ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์ง€์šฐ๊ณ  ์‹ถ์–ด `fix/`๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ๋ธŒ๋žœ์น˜๋“ค์„ ์ง€์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด: ```sh (main)$ git branch | grep 'fix/' | xargs git branch -d ``` ### ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ณ  ์‹ถ์–ด ํ˜„์žฌ (๋กœ์ปฌ) ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋ ค๋ฉด: ```sh (main)$ git branch -m new-name ``` ๋‹ค๋ฅธ (๋กœ์ปฌ) ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋ ค๋ฉด ```sh (main)$ git branch -m old-name new-name ``` ### ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ž‘์—…์ค‘์ธ ๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜๋กœ ์ฒดํฌ์•„์›ƒ ํ•˜๊ณ  ์‹ถ์–ด ์šฐ์„ , ๋ฆฌ๋ชจํŠธ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ์—์„œ ๋ชจ๋“  ๋ธŒ๋žœ์น˜๋ฅผ ํŒจ์น˜ ๋ฐ›์•„์š”: ```sh (main)$ git fetch --all ``` ๋ฆฌ๋ชจํŠธ์˜ `daves`๋กœ ์ฒดํฌ์•„์›ƒ ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•˜๋ฉด. ```sh (main)$ 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#Documentation/git-config.txt-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/main ``` `origin/HEAD`๋ฅผ `origin/main`๋ฅผ ํŠธ๋ž˜ํ‚นํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด, ์ด ์ปค๋งจ๋“œ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์š”: ```sh $ git remote set-head origin --auto origin/HEAD set to main ``` ### ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์— ๋ณ€๊ฒฝ์ ์„ ์ž˜๋ชป ๋‚จ๊ฒผ์–ด ์ปค๋ฐ‹ ๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ์ , ๊ฑฐ๊ธฐ๋‹ค ์ž˜๋ชป๋œ ๋ธŒ๋žœ์น˜์— ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด ๋ณ€๊ฒฝ์ ์„ ์Šคํ…Œ์ด์‹œ ํ•˜๊ณ  ์›ํ•˜๋Š” ๋ธŒ๋žœ์น˜๋กœ ๊ฐ€ ์Šคํ…Œ์ด์‹œ ์–ดํ”Œ๋ผ์ด ํ•ด์š”: ```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 (main)$ git checkout my-branch (my-branch)$ git rebase -i main (my-branch)$ git checkout main (main)$ git merge --ff-only my-branch ``` ๋” ํ™•์ธ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, [์ด ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ์˜ ์“ฐ๋ ˆ๋“œ](https://stackoverflow.com/questions/11058312/how-can-i-use-git-rebase-without-requiring-a-forced-push)๋ฅผ ์ฐธ๊ณ ํ•ด์š”. ### ์ปค๋ฐ‹๋ผ๋ฆฌ ํ•ฉ์น˜๊ณ  ์‹ถ์–ด `main`์— ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๊ฐ€ ๋  ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด์š”. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ๋Š” ์›ํ•˜๋Š”๊ฒŒ *๋ชจ๋“ * ์ปค๋ฐ‹์„ ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์œผ๋กœ ํ•ฉ์น˜๊ณ  ๋ณ€๊ฒฝ์ ์˜ ์‹œ๊ฐ„์„ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒƒ์ผ ๋•Œ, ๋ฆฌ์…‹ํ•˜๊ณ  ์ปค๋ฐ‹ ๋‹ค์‹œํ•˜๋ฉด ๋ผ์š”. ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜๊ฐ€ ์ตœ์‹ ์ด๊ณ  ๋ชจ๋“  ๋ณ€๊ฒฝ์ ์ด ์ปค๋ฐ‹๋œ ๊ฒƒ๋งŒ ํ™•์ธํ•œ ๋‹ค์Œ: ```sh (my-branch)$ git reset --soft main (my-branch)$ git commit -am "New awesome feature" ``` ์ข€๋” ์กฐ์ •ํ•˜๊ณ , ์‹œ๊ฐ„๊ธฐ๋ก๊นŒ์ง€ ๋ณด๊ด€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๋Œ€ํ™”ํ˜• ๋ฆฌ๋ฒ ์ด์Šค๊ฐ€ ํ•„์š”ํ• ๊ฑฐ์—์š”. ```sh (my-branch)$ git rebase -i main ``` ๋งŒ์•ฝ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ ๋ถ™๋Š” ์ž‘์—…์„ ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด, `HEAD`์„ ๊ธฐ์ค€์œผ๋กœ ๋ฆฌ๋ฒ ์ด์Šค ํ•ด์•ผํ•ด์š”. ์˜ˆ๋กœ ๋งˆ์ง€๋ง‰ 2๊ฐœ์˜ ์ปค๋ฐ‹์„ ์Šค์ฟผ์‹œ(๊ธฐ์กด ์ปค๋ฐ‹์— ๋ฐ˜์˜ํ•ด๋„ฃ๋Š”)ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด `HEAD~2`๋กœ ๋ฆฌ๋ฒ ์ด์Šค ํ•ด์š”. 3๊ฐœ๋ผ๋ฉด `HEAD~3`์œผ๋กœ ํ•˜๊ตฌ์š”. ```sh (main)$ 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 'main' on '8074d12'. # # Changes to be committed: # modified: README.md # ``` ์ „๋ถ€ ๋‹ค ์„ฑ๊ณตํ•˜๋ฉด, ์ด๋Ÿฐ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณผ๊ฑฐ์—์š”: ```sh (main)$ Successfully rebased and updated refs/heads/main. ``` #### ์•ˆ์ „ํ•œ ๋จธ์ง€ ์ „๋žต `--no-commit`๋Š” ๋จธ์ง€๋Š” ํ•˜์ง€๋งŒ ์‹คํŒจํ•˜๊ณ  ์ž๋™ ์ปค๋ฐ‹์ด ์•ˆ๋œ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š”๋ฐ, ์ปค๋ฐ‹ํ•˜๊ธฐ์ „์— ๋จธ์ง€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ  ์ถ”๊ฐ€๋กœ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜์š”. `no-ff`๋Š” ํ”ผ์ณ ๋ธŒ๋žœ์น˜๊ฐ€ ์žˆ์—ˆ๋‹ค๋Š” ์ฆ๊ฑฐ๋ฅผ ๋‚จ๊ธฐ๊ณ , ์ด๋ ฅ์„ ์ผ๊ด€๋˜๊ฒŒ ๊ฐ€์ง€๊ฒŒ ํ•ด์š”. ```sh (main)$ git merge --no-ff --no-commit my-branch ``` #### ๋ธŒ๋žœ์น˜๋ฅผ ์ปค๋ฐ‹ ํ•˜๋‚˜๋กœ ๋จธ์ง€ํ•ด์•ผํ•ด ```sh (main)$ git merge --squash my-branch ``` #### ํ‘ธ์‹œ ๋˜์ง€ ์•Š์€ ์ปค๋ฐ‹๋งŒ ํ•ฉ์น˜๊ณ  ์‹ถ์–ด ๊ฐ€๋” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ž‘์—… ๋„์ค‘์ธ ์ปค๋ฐ‹์„ ํ‘ธ์‹œํ•˜๊ธฐ ์ „์— ํ•ฉ์น˜๊ณ  ์‹ถ์„๊ฑฐ์—์š”. ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฒŒ์จ ์ฐธ๊ณ ํ•ด์„œ ์ปค๋ฐ‹์„ ๋งŒ๋“ค๊ณ  ์žˆ์„ํ…Œ๋‹ˆ ์ด๋ฏธ ํ‘ธ์‹œ๋œ ์ปค๋ฐ‹์„ ์ž˜๋ชป ํ•ฉ์น˜๊ธธ ๋ฐ”๋ผ์ง„ ์•Š์„๊ฑฐ์—์š”. ```sh (main)$ git rebase -i @{u} ``` ์ด ๋ช…๋ น์€ ์•„์ง ํ‘ธ์‹œํ•˜์ง€ ์•Š์€ ์ปค๋ฐ‹๋งŒ์œผ๋กœ ๋Œ€ํ™”ํ˜• ๋ฆฌ๋ฒ ์ด์Šค๋ฅผ ์‹คํ–‰ํ•ด์š”. ๊ทธ๋Ÿฌ๋‹ˆ ๋ชฉ๋ก ๋‚ด์— ์žˆ๋Š” ์–ด๋–ค ์ปค๋ฐ‹์ด๋“  ์žฌ์ •๋ ฌ/์ˆ˜์ •/ํ•ฉ์น˜๊ธฐ ์•ˆ์ „ํ•ด์š”. #### ๋จธ์ง€๋ฅผ ์ค‘๋‹จํ•ด์•ผํ•ด ๋•Œ๋•Œ๋กœ ๋จธ์ง€๋Š” ์–ด๋–ค ํŒŒ์ผ์— ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜๋„ ์žˆ์–ด์š”, ์ด ๊ฒฝ์šฐ ์˜ต์…˜ `abort`์œผ๋กœ ํ˜„์žฌ ์ถฉ๋Œ ํ•ด๊ฒฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ค‘๋‹จํ•˜๊ณ  ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „ ์ƒํƒœ๋กœ ๋‹ค์‹œ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”. ```sh (my-branch)$ git merge --abort ``` ์ด ๋ช…๋ น์€ 1.7.4 ๋ฒ„์ „๋ถ€ํ„ฐ ์“ธ ์ˆ˜ ์žˆ์–ด์š”. ### ๋ธŒ๋žœ์น˜๋‚ด ๋ชจ๋“  ์ปค๋ฐ‹์ด ๋จธ์ง€๋๋Š”์ง€ ํ™•์ธํ•ด ๋ธŒ๋žœ์น˜ ๋‚ด ๋ชจ๋“  ์ปค๋ฐ‹์ด ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ ๋จธ์ง€๋๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด, ๊ทธ ๋ธŒ๋žœ์น˜๋“ค HEAD (๋˜๋Š” ํŠน์ • ์ปค๋ฐ‹)๋ฅผ ๋น„๊ตํ•ด์•ผํ•ด์š”: ```sh (main)$ git log --graph --left-right --cherry-pick --oneline HEAD...feature/120-on-scroll ``` ์ด ๋ช…๋ น์€ ์–ด๋””์—๋Š” ์žˆ๊ณ  ๋‹ค๋ฅธ๋ด ์—†๋Š” ์ปค๋ฐ‹์ด ์žˆ๋‚˜๋ฅผ ์•Œ๋ ค์ค„๊ฑฐ์—์š” ๊ทธ๋ฆฌ๊ณ  ๋ธŒ๋žœ์น˜๋“ค ์‚ฌ์ด์— ๊ณต์œ ๋˜์ง€ ์•Š์€๊ฒŒ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค„ ๊ฑฐ๊ตฌ์š”. ๋‹ค๋ฅธ ์˜ต์…˜์€ ์ด๋ ‡๊ฒŒ: ```sh (main)$ git log main ^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 (main*)$ git checkout --ours README.md ``` - *๋จธ์ง€*ํ• ๋•Œ, `--ours`๋ฅผ ์“ฐ๋ฉด ๋กœ์ปฌ ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ์  ์œ ์ง€ํ•˜๊ณ , `--theirs` ๋Š” ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ์ ๋ฅผ ์œ ์ง€ํ•ด์š”. - *๋ฆฌ๋ฒ ์ด์Šค*ํ•  ๋•, `--theirs`๊ฐ€ ๋กœ์ปฌ ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ์ ์„ ์œ ์ง€ํ•˜๊ณ  `--ours`๋Š” ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ์ ์„ ์œ ์ง€ํ•ด์š”. ์ด๋Ÿฐ ์ฐจ์ด์— ๊ด€ํ•œ ์„ค๋ช…์€ Git ์ •์‹ ๋ฌธ์„œ ์ค‘ [์ด ๋ฌธ์„œ](https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt---merge)๋ฅผ ๋ณด์„ธ์š”. ๋งŒ์•ฝ ๋จธ์ง€๊ฐ€ ๋” ๋ณต์žกํ•˜๋ฉด, ๋น„์ฃผ์–ผ ๋””ํ”„ ์—๋””ํ„ฐ๋ฅผ ์“ธ ์ˆ˜๋„ ์žˆ์–ด์š”: ```sh (main*)$ 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 main ``` ## ํŒŒ์ผ ์ถ”์ ํ•˜๊ธฐ ### ํŒŒ์ผ ๋‚ด์šฉ์—” ๋ณ€๊ฒฝ์ด ์—†์ด ํŒŒ์ผ ์ด๋ฆ„์„ ์•ž๊ธ€์ž๋งŒ ๋Œ€๋ฌธ์ž๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์–ด ```sh (main)$ git mv --force myfile MyFile ``` ### ๊นƒ ํ’€ ๋ฐ›์„๋•Œ ๋กœ์ปฌ ํŒŒ์ผ์„ ๋ฎ์–ด์”Œ์šฐ๊ณ  ์‹ถ์–ด ```sh (main)$ git fetch --all (main)$ git reset --hard origin/main ``` ### ํŒŒ์ผ์„ ๋กœ์ปฌ์—๋Š” ๋ณด๊ด€ํ•˜๊ณ  ๊นƒ์—์„œ ์ง€์šฐ๊ณ  ์‹ถ์–ด ```sh (main)$ git rm --cached log.txt ``` ### ํŠน์ •ํ•œ ๋ฒ„์ „๋Œ€๋กœ ํŒŒ์ผ์„ ๋ณต๊ตฌํ•˜๊ณ  ์‹ถ์–ด ๋ณต๊ตฌํ•˜๊ณ  ์‹ถ์€ ํ•ด์‹œ๊ฐ€ c5f567 ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด: ```sh (main)$ git checkout c5f567 -- file1/to/restore file2/to/restore ``` c5f567 ํ•œ ๋‹จ๊ณ„์ „์œผ๋กœ ๋ณต๊ตฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, c5f567~1๋กœ ์ ์–ด์ค˜์š”: ```sh (main)$ git checkout c5f567~1 -- file1/to/restore file2/to/restore ``` ### ์ปค๋ฐ‹๊ณผ ๋ธŒ๋žœ์น˜ ๊ฐ„์˜ ํŠน์ • ํŒŒ์ผ ๋ณ€๊ฒฝ ์ด๋ ฅ์ด ํ•„์š”ํ•ด ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹๊ณผ c5f567์œผ๋กœ ๋ถ€ํ„ฐ์˜ ์ฐจ์ด๋ฅผ ๋น„๊ตํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด: ```sh $ git diff HEAD:path_to_file/file c5f567:path_to_file/file # ์•„๋‹ˆ๋ฉด ์งง๊ฒŒ: $ git diff HEAD c5f567 -- path_to_file/file ``` ๋ธŒ๋žœ์น˜๋„ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ: ```sh $ git diff main:path_to_file/file staging:path_to_file/file # ์•„๋‹ˆ๋ฉด ์งง๊ฒŒ: $ git diff main 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]โ€ ``` ## ๋ญ˜ ์ž˜๋ชปํ–ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์–ด ์Œ, ๋งํ–ˆ๊ตฐ์š”. ๋ญ”๊ฐ€๋ฅผ `reset` ํ–ˆ๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ ๋จธ์ง€ํ–ˆ๊ฑฐ๋‚˜, ์ง€๊ธˆ์€ ์ฐพ์งˆ ๋ชปํ•˜๋Š” ์ปค๋ฐ‹์œผ๋กœ ๊ฐ•์ œ ํ‘ธ์‹œ๋ฅผ ํ•ด๋ฒ„๋ ธ๊ตฐ์š”. ์•Œ๋‹ค์‹œํ”ผ, ์–ด๋–ค ์‹œ์ ์—์„ , ์ž˜ ํ•˜๊ณ  ์žˆ์—ˆ๊ณ  ๊ฑฐ๊ธฐ๋กœ ๋Œ์•„๊ฐ€๊ณ  ์‹ถ๊ฒ ์ฃ . ์ด๊ฒŒ ๋ฐ”๋กœ `git reflog`์˜ ์กด์žฌ์ด์œ ์—์š”. `reflog` ๋Š” ๋ธŒ๋žœ์น˜ ๋์˜ ์–ด๋–ค ๋ณ€๊ฒฝ์ ์ด๋“  ๋ธŒ๋žœ์น˜๋‚˜ ํƒœ๊ทธ์— ์˜ํ•ด ์ฐธ์กฐ๋˜์ง€ ์•Š๋”๋ผ๋„ ๋‹ค ๋ณด๊ด€ํ•ด์š”. ๊ธฐ๋ณธ์ ์œผ๋กœ, HEAD๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ, ๋ฆฌํ”Œ๋กœ๊ทธ์— ์ƒˆ๋กœ์šด ์ž…๋ ฅ์ด ์ถ”๊ฐ€๋ผ์š”. ์•„์‰ฝ๊ฒŒ๋„ ์ด ๊ธฐ๋Šฅ์€ ๋กœ์ปฌ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ์—์„œ๋งŒ ๋™์ž‘ํ•ด๊ณ , ์˜ค์ง ์›€์ง์ž„๋งŒ์„ ํŠธ๋ž˜ํ‚นํ•ด์š” (์˜ˆ๋ฅผ ๋“ค์ž๋ฉด ์–ด๋””์—๋„ ๊ธฐ๋ก๋˜์ง€ ์•Š์•˜๋˜ ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ์€ ์•„๋‹ˆ์—์š”) ```sh (main)$ git reflog 0a2e358 HEAD@{0}: reset: moving to HEAD~2 0254ea7 HEAD@{1}: checkout: moving from 2.2 to main c10f740 HEAD@{2}: checkout: moving from main 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) - ๊ฐ„๋‹จํ•œ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ ์ƒํƒœ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฆฌ๋ˆ…์Šค ๊นƒ ํด๋ผ์ด์–ธํŠธ