From 119764efde4a8a5ed17ad6329b724688dae1fb5c Mon Sep 17 00:00:00 2001 From: Jeongwoo Park <121204715+lurgi@users.noreply.github.com> Date: Sun, 7 Jul 2024 22:06:47 +0900 Subject: [PATCH] =?UTF-8?q?=EB=82=B4=EA=B0=80=20=EC=9B=90=ED=96=88?= =?UTF-8?q?=EB=8D=98=20Git=20=EA=B0=80=EC=9D=B4=EB=93=9C=20-=20the=20guid?= =?UTF-8?q?=20to=20git=20i=20never=20had?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- July/article/The-guide-to-Git-I-never-had.md | 455 +++++++++++++++++++ 1 file changed, 455 insertions(+) create mode 100644 July/article/The-guide-to-Git-I-never-had.md diff --git a/July/article/The-guide-to-Git-I-never-had.md b/July/article/The-guide-to-Git-I-never-had.md new file mode 100644 index 0000000..0fba8af --- /dev/null +++ b/July/article/The-guide-to-Git-I-never-had.md @@ -0,0 +1,455 @@ +## ๐Ÿ”— [The guide to Git I never had](https://medium.com/@jake.page91/the-guide-to-git-i-never-had-a89048d4703a) + +### ๐Ÿ—“๏ธ ๋ฒˆ์—ญ ๋‚ ์งœ: 2024.07.07 + +### ๐Ÿงš ๋ฒˆ์—ญํ•œ ํฌ๋ฃจ: ๋Ÿฌ๊ธฐ(๋ฐ•์ •์šฐ) + +--- + +## ๋‚ด๊ฐ€ ์›ํ–ˆ๋˜ Git ๊ฐ€์ด๋“œ + +![git](https://miro.medium.com/v2/resize:fit:1400/format:webp/1*SRMPPL8gPMrJLMqaGo0mCA.png) +๐Ÿฉบ์˜์‚ฌ๋“ค์€ ์ฒญ์ง„๊ธฐ๋ฅผ, ๐Ÿ”ง ๋ฉ”์นด๋‹‰๋“ค์€ ์ŠคํŒจ๋„ˆ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๐Ÿ‘จโ€๐Ÿ’ปย ์šฐ๋ฆฌ ๊ฐœ๋ฐœ์ž๋“ค์€ Git์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. + +Git์ด ์ฝ”๋“œ ์ž‘์—…์— ์–ผ๋งˆ๋‚˜ ํ•„์ˆ˜์ ์ธ์ง€, ์‚ฌ๋žŒ๋“ค์ด CV(Curriiculum Vitea = resume)๋‚˜ ๊ธฐ์ˆ ์Šคํƒ์— ๊ทธ๊ฒƒ์„ ๊ฑฐ์˜ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ณ ๊ณ„์‹ ๊ฐ€์š”? ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๊ฑฐ๋‚˜ ์ตœ์†Œํ•œ ๋‹ค๋ฃฐ ์ค„ ์•ˆ๋‹ค๋Š” ๊ฐ€์ •์ด ๊น”๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ •๋ง๋กœ ์•Œ๊ณ  ์žˆ๋‚˜์š”? + +Git์€ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(VCS)์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ํ•จ๊ป˜ ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณ€๊ฒฝํ•˜๋ฉฐ ํ˜‘๋ ฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ณดํŽธ์ ์ธ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. + +> ๐Ÿšจ ๊ธ€์„ ์†Œ๊ฐœํ•˜๊ธฐ ์•ž์„œ, Git์€ ๋ฐฉ๋Œ€ํ•œ ์ฃผ์ œ๋ผ๋Š” ์ ์„ ์ง€์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. Git์— ๊ด€ํ•œ ์ฑ…์ด ์“ฐ์—ฌ์กŒ๊ณ , ํ•™์ˆ  ๋…ผ๋ฌธ์œผ๋กœ ์˜คํ•ด๋  ์ˆ˜ ์žˆ๋Š” ๋ธ”๋กœ๊ทธ ๊ธ€๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์—ฌ๊ธฐ์„œ ํ•˜๋ ค๋Š” ๊ฒƒ์€ ๊ทธ๋Ÿฐ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ €๋Š” Git ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ์˜ ๋ชฉํ‘œ๋Š” ์ œ๊ฐ€ Git์„ ๋ฐฐ์šธ ๋•Œ ์›ํ–ˆ๋˜ Git ๊ธฐ๋ณธ ๊ธ€์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. + +๊ฐœ๋ฐœ์ž๋กœ์„œ ์šฐ๋ฆฌ์˜ ์ผ์ƒ์€ ์ฝ”๋“œ ์ฝ๊ธฐ, ์“ฐ๊ธฐ, ๊ฒ€ํ† ๋ฅผ ์ฃผ๋กœ ์ด๋ฃน๋‹ˆ๋‹ค. Git์€ ๋ถ„๋ช…ํ•˜๊ฒŒ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Git์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ ๊ธฐ๋Šฅ์„ ์ˆ™๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž๋กœ์„œ ์ž์‹ ์—๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๊ณ ์˜ ํˆฌ์ž ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. + +๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ด…์‹œ๋‹ค. + +![let's go git](https://miro.medium.com/v2/resize:fit:960/format:webp/0*xs6eNc-gxLusI4AJ.gif) + +> ํŠน์ • ๋ช…๋ น์–ด์— ๋Œ€ํ•ด ์ œ๊ฐ€ ๋†“์ณค๊ฑฐ๋‚˜ ๋” ์ž์„ธํžˆ ๋‹ค๋ค„์•ผ ํ•  ๋ถ€๋ถ„์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ์•„๋ž˜ ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”. ๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น ํฌ์ŠคํŠธ๋ฅผ ๊ทธ์— ๋งž๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ™ + +## ์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๋™์•ˆ + +Git ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜๊ณ  Glasskube์— ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์ €ํฌ๋Š” 2์›”์— ๊ณต์‹ ์ถœ๋ฒ”ํ–ˆ์œผ๋ฉฐ Kubernetes ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์˜ ๋‹น์—ฐํ•˜๊ณ  ๊ธฐ๋ณธ์ ์ธ ์†”๋ฃจ์…˜์ด ๋˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ์ง€์›์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๋‚˜์•„๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ๋ฅผ ๋„์™€์ฃผ๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์ €ํฌ GitHub์— Star ํ‘œ์‹œ๋ฅผ ํ•ด์ฃผ์‹œ๋Š” ๊ฒ๋‹ˆ๋‹ค. โญ + +![cat](https://miro.medium.com/v2/resize:fit:1400/format:webp/0*OTGGI6NNJyE-s83Z.jpeg) + +## ๊ธฐ์ดˆ๋ฅผ ๋‹ค์ ธ๋ด…์‹œ๋‹ค + +Git์ด ์—ฌ๋Ÿฌ๋ถ„์„ Peter Griffin(์•„๋ž˜ ์ด๋ฏธ์ง€)์ฒ˜๋Ÿผ ๋Š๋ผ๊ฒŒ ํ•œ ์ ์ด ์žˆ๋‚˜์š”? + +Git์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฐฐ์šฐ์ง€ ์•Š์œผ๋ฉด ๊ณ„์†ํ•ด์„œ ๊ณ ๊ฐœ๋ฅผ ๊ฐธ์›ƒ๊ฑฐ๋ฆฌ๊ฑฐ๋‚˜, ๊ฐ™์€ ๋ฌธ์ œ์— ๋ง‰ํžˆ๊ฑฐ๋‚˜, ํ„ฐ๋ฏธ๋„์— ๋˜ ๋‹ค๋ฅธ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์ด ๋‚˜ํƒ€๋‚˜๋Š” ๋‚ ์„ ํ›„ํšŒํ•˜๊ฒŒ ๋  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ๊ธฐ๋ณธ์ ์ธ Git ๊ฐœ๋…์„ ์ •์˜ํ•ด ๋ด…์‹œ๋‹ค. + +![peter griffin](https://miro.medium.com/v2/resize:fit:960/format:webp/0*WaBYfIYf-bPHRyog.gif) + +## Branches + +Git ์ €์žฅ์†Œ์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ "main" ๋˜๋Š” "master"(์ด์ œ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ)๋ผ๊ณ  ๋ช…๋ช…๋œ ์ฃผ์š” ๊ฐœ๋ฐœ ๋ผ์ธ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ์„œ ์—ฌ๋Ÿฌ ๋ถ„๊ธฐ๊ฐ€ ๊ฐˆ๋ผ์ง‘๋‹ˆ๋‹ค. ์ด ๋ถ„๊ธฐ๋“ค์€ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—… ํ๋ฆ„์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๊ฐœ๋ฐœ์ž๋“ค์ด ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์ด๋‚˜ ์ˆ˜์ •์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. + +![git branches](https://miro.medium.com/v2/resize:fit:1400/format:webp/0*fIKhQXkHzlr_yiW0.png) + +## Commits + +Git ์ปค๋ฐ‹์€ ์—…๋ฐ์ดํŠธ๋œ ์ฝ”๋“œ์˜ ๋ฌถ์Œ์œผ๋กœ, ํŠน์ • ์‹œ์ ์—์„œ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ์˜ ์Šค๋ƒ…์ƒท์„ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ปค๋ฐ‹์€ ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹์ด ๊ธฐ๋ก๋œ ์ดํ›„์— ์ด๋ฃจ์–ด์ง„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ธฐ๋กํ•˜์—ฌ, ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ ์—ฌ์ •์˜ ํฌ๊ด„์ ์ธ ๊ธฐ๋ก(history)๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. + +![git commit](https://miro.medium.com/v2/resize:fit:1400/format:webp/0*5LF0U6qy72fBCzps.png) + +์ปค๋ฐ‹์„ ์ฐธ์กฐํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„๋˜๋Š” ์•”ํ˜ธ ํ•ด์‹œ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. + +์˜ˆ์‹œ: + +```json +git show abc123def456789 +``` + +์œ„ ๋ช…๋ น์–ด๋Š” ํ•ด๋‹น ํ•ด์‹œ์˜ ์ปค๋ฐ‹์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. + +## Tags + +GIt Tags๋Š” ๊นƒ ๊ธฐ๋ก(history)์˜ ์ด์ •ํ‘œ ์—ญํ• ์„ ํ•˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ์˜ ์ค‘์š”ํ•œ milestons, ์˜ˆ๋ฅผ๋“ค์–ด, release, versions,๋ˆˆ์— ๋„๋Š” commits๋“ค์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํƒœ๊ทธ๋“ค์€ ํŠน์ • ์‹œ์ ์„ ํ‘œ์‹œํ•˜๋Š”๋ฐ ๋งค์šฐ ์œ ์šฉํ•˜๋ฉฐ, ์ข…์ข… ํ”„๋กœ์ ํŠธ ์—ฌ์ •์˜ ์‹œ์ž‘์ ์ด๋‚˜ ์ฃผ์š” ์„ฑ๊ณผ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. + +![git tags](https://miro.medium.com/v2/resize:fit:1400/format:webp/0*2sw41eQGJ3JufyA6.png) + +## HEAD + +ํ˜„์žฌ ์ฒดํฌ์•„์›ƒ๋œ ๋ธŒ๋žœ์น˜์—์„œ ๊ฐ€์žฅ ์ตœ๊ทผ์˜ ์ปค๋ฐ‹์€ HEAD๋กœ ํ‘œ์‹œ๋˜๋ฉฐ, ์ด๋Š” ์ €์žฅ์†Œ ๋‚ด์˜ ๋ชจ๋“  ์ฐธ์กฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ๋ธŒ๋žœ์น˜์— ์žˆ์„ ๋•Œ, HEAD๋Š” ํ•ด๋‹น ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ๋ธŒ๋žœ์น˜์˜ ๋์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์‹ , HEAD๊ฐ€ ํŠน์ • ์ปค๋ฐ‹์„ ์ง์ ‘ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋ถ„๋ฆฌ๋œ HEAD ์ƒํƒœ) + +## Stages + +Git Stages๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ Git ์›Œํฌํ”Œ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„๋Š” ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ €์žฅ์†Œ์— ์ปค๋ฐ‹๋˜๊ธฐ ์ „์— ๋ฐœ์ƒํ•˜๋Š” ๋…ผ๋ฆฌ์  ์ „ํ™˜์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. Git ๋‹จ๊ณ„์˜ ๊ฐœ๋…์„ ์ž์„ธํžˆ ์‚ดํŽด๋ด…์‹œ๋‹ค. +![git stages](https://miro.medium.com/v2/resize:fit:1400/format:webp/0*WkcWFYgsKpYyj2b3.png) + +### ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ๐Ÿ‘ท + +์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•ด ํŒŒ์ผ์„ ํŽธ์ง‘, ์ˆ˜์ •, ์ƒ์„ฑํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. ๋กœ์ปฌ ์ปดํ“จํ„ฐ์—์„œ ํŒŒ์ผ์˜ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. + +### ์Šคํ…Œ์ด์ง• ์˜์—ญ ๐Ÿš‰ + +์Šคํ…Œ์ด์ง• ์˜์—ญ์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ์ค€๋น„ํ•˜๋Š” ์ž„์‹œ ์˜์—ญ์ž…๋‹ˆ๋‹ค. ์ผ์ข…์˜ ๋ณด๋ฅ˜ ๊ตฌ์—ญ ๋˜๋Š” ์‚ฌ์ „ ์ปค๋ฐ‹ ๊ตฌ์—ญ์ž…๋‹ˆ๋‹ค. + +์œ ์šฉํ•œ ๋ช…๋ น์–ด: `git add` ๋˜ํ•œ `git rm`์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์Šคํ…Œ์ด์ง• ํ•ด์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### ๋กœ์ปฌ ์ €์žฅ์†Œ ๐Ÿ—„๏ธ + +๋กœ์ปฌ ์ €์žฅ์†Œ๋Š” Git์ด ์ปค๋ฐ‹๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ , ์ด์ „ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฌ๋ฉฐ, ๋™์ผํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๊ณผ ํ˜‘์—…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. + +์Šคํ…Œ์ด์ง• ์˜์—ญ์—์„œ ์ค€๋น„๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ปค๋ฐ‹ํ•˜๋ ค๋ฉด: `git commit` + +### ์›๊ฒฉ ์ €์žฅ์†Œ ๐Ÿ›ซ + +์›๊ฒฉ ์ €์žฅ์†Œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ฒ„(GitHub, GitLab ๋˜๋Š” Bitbucket ๋“ฑ)์— ํ˜ธ์ŠคํŒ…๋˜์–ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๊ณผ ๊ณต์œ ํ•˜๊ณ  ํ˜‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ์ค‘์•™ ์ง‘์ค‘์‹ ์œ„์น˜์ž…๋‹ˆ๋‹ค. + +`git push` ๋ฐ `git pull`๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ ์ €์žฅ์†Œ์—์„œ ์›๊ฒฉ ์ €์žฅ์†Œ๋กœ ์ปค๋ฐ‹๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ‘ธ์‹œ/ํ’€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Git ์‹œ์ž‘ํ•˜๊ธฐ + +์–ด๋””์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค. Git์—์„œ๋Š” `workspace`์—์„œ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์ €์žฅ์†Œ๋ฅผ ํฌํฌํ•˜๊ฑฐ๋‚˜ ํด๋ก ํ•˜์—ฌ ํ•ด๋‹น workspace์˜ ์‚ฌ๋ณธ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๋กœ์ปฌ ํด๋”์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ `git init` ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ํด๋”๋ฅผ Git ์ €์žฅ์†Œ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ๊ฐ„๊ณผํ•ด์„œ๋Š” ์•ˆ ๋  ์ค‘์š”ํ•œ ๋‹จ๊ณ„๋กœ,credentials(์ž๊ฒฉ ์ฆ๋ช…)์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. + +![git layout](https://miro.medium.com/v2/resize:fit:1400/format:webp/0*7FR2Oh-61AxXCVzW.png) + +## ์ž๊ฒฉ ์ฆ๋ช… ์„ค์ • + +์›๊ฒฉ ์ €์žฅ์†Œ๋กœ ํ‘ธ์‹œ(pushing) ๋ฐ ํ’€๋ง(pulling)ํ•  ๋•Œ๋งˆ๋‹ค ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”: + +```bash +git config --global credential.helper store +``` + +์ฒ˜์Œ ์›๊ฒฉ ์ €์žฅ์†Œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ๋•Œ, Git์€ ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋„๋ก ์š”์ฒญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ํ›„๋กœ๋Š” ๋‹ค์‹œ ์š”์ฒญํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. + +์ž๊ฒฉ ์ฆ๋ช…์€ `.git-credentials` ํŒŒ์ผ์— ํ‰๋ฌธ ํ˜•์‹์œผ๋กœ ์ €์žฅ๋œ๋‹ค๋Š” ์ ์„ ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +์„ค์ •๋œ ์ž๊ฒฉ ์ฆ๋ช…์„ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: + +```bash +git config --global credential.helper +``` + +## ๋ธŒ๋žœ์น˜ ์ž‘์—… + +๋กœ์ปฌ์—์„œ ์ž‘์—…ํ•  ๋•Œ ํ˜„์žฌ ์–ด๋Š ๋ธŒ๋žœ์น˜์— ์žˆ๋Š”์ง€ ์•„๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์–ด๋“ค์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค: + +```bash +# ๋กœ์ปฌ ์ €์žฅ์†Œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. +git branch +# ๋ธŒ๋žœ์น˜๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๋ ค๋ฉด +git branch feature-branch-name +``` + +๋ธŒ๋žœ์น˜ ๊ฐ„ ์ „ํ™˜ํ•˜๋ ค๋ฉด: + +```bash +git switch +``` + +๋˜ํ•œ ๋ธŒ๋žœ์น˜ ๊ฐ„ ์ „ํ™˜๊ณผ ๋”๋ถˆ์–ด, ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: + +```bash +git checkout +# ์•„์ง ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ๋ธŒ๋žœ์น˜๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐ”๋กœ ๊ฐ€๊ธฐ -b ํ”Œ๋ž˜๊ทธ ์‚ฌ์šฉ +git checkout -b feature-branch-name +``` + +์ €์žฅ์†Œ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด: + +```bash +git status +``` + +ํ˜„์žฌ ๋ธŒ๋žœ์น˜๋ฅผ ํ•ญ์ƒ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด๊ธฐ ์œ„ํ•ด ํ„ฐ๋ฏธ๋„์—์„œ ์ง์ ‘ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋•๋Š” ์—ฌ๋Ÿฌ ํ„ฐ๋ฏธ๋„ ์• ๋“œ์˜จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ํ•˜๋‚˜์˜ ์˜ˆ์‹œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. + +[Add Git Branch Name to Terminal Prompt (Linux/Mac)](https://gist.github.com/joseluisq/1e96c54fa4e1e5647940) + +![git terminal addon](https://miro.medium.com/v2/resize:fit:1400/format:webp/0*5_tQsZ-hqYh5jDHg.png) + +## ์ปค๋ฐ‹ ์ž‘์—… + +์ปค๋ฐ‹ ์ž‘์—… ์‹œ `git commit -m` ๋ช…๋ น์–ด๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ธฐ๋กํ•˜๊ณ , `git amend` ๋ช…๋ น์–ด๋กœ ๊ฐ€์žฅ ์ตœ๊ทผ ์ปค๋ฐ‹์„ ์ˆ˜์ •ํ•˜๋ฉฐ, ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. + +```bash +git commit -m "์˜๋ฏธ ์žˆ๋Š” ๋ฉ”์‹œ์ง€" +``` + +์ตœ๊ทผ ์ปค๋ฐ‹์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์„ ๋งŒ๋“ค ํ•„์š” ์—†์ด `--amend` ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํ…Œ์ด์ง•๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ๊ฐ€์žฅ ์ตœ๊ทผ ์ปค๋ฐ‹์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +```bash +# ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. +git add . +git commit --amend +# ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ๋ฅผ ์—ด์–ด ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +git push origin your_branch --force +``` + +> โš ๏ธ `--force`๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํƒ€๊ฒŸ ๋ธŒ๋žœ์น˜์˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ main/master ๋ธŒ๋žœ์น˜์—๋Š” ์ ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. + +์ผ๋ฐ˜์ ์œผ๋กœ ์ž์ฃผ ์ปค๋ฐ‹ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค. ์ง„ํ–‰ ์ƒํ™ฉ์„ ์žƒ๊ฑฐ๋‚˜ ์Šคํ…Œ์ด์ง•๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‹ค์ˆ˜๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„์— ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์„ ์Šค์ฟผ์‹œํ•˜๊ฑฐ๋‚˜ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ฆฌ๋ฒ ์ด์Šค(interactive rebase) ํ†ตํ•ด ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์žฌ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +> + +`git log` ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์žฅ ์ตœ๊ทผ ์ปค๋ฐ‹๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์ปค๋ฐ‹ ์—ญ์ˆœ์œผ๋กœ, ์‹œ๊ฐ„ ์ˆœ์œผ๋กœ ์ปค๋ฐ‹ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค, + +## ํžˆ์Šคํ† ๋ฆฌ ์กฐ์ž‘ + +ํžˆ์Šคํ† ๋ฆฌ ์กฐ์ž‘์—๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฐ•๋ ฅํ•œ ๋ช…๋ น์–ด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋ฆฌ๋ฒ ์ด์Šค๋Š” ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์žฌ์ž‘์„ฑํ•˜๊ณ , ์Šค์ฟผ์‹ฑ์€ ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์„ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉํ•˜๋ฉฐ, ์ฒด๋ฆฌ ํ”ผํ‚น์€ ํŠน์ • ์ปค๋ฐ‹์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. + +## ๋ฆฌ๋ฒ ์ด์Šค์™€ ๋จธ์ง€ + +๋ฆฌ๋ฒ ์ด์Šค์™€ ๋จธ์ง€๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ๋ชฉํ‘œ๋Š” ๋™์ผํ•˜์ง€๋งŒ ์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ์ฐจ์ด์ ์€ ๋ฆฌ๋ฒ ์ด์Šค๊ฐ€ ํ”„๋กœ์ ํŠธ์˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์žฌ์ž‘์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ํ”„๋กœ์ ํŠธ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ค‘์‹œํ•˜๋Š” ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•œ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ๋จธ์ง€๋Š” ์ƒˆ๋กœ์šด ๋ณ‘ํ•ฉ ์ปค๋ฐ‹์„ ์ƒ์„ฑํ•˜์—ฌ ๋‘ ๋ธŒ๋žœ์น˜์˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. + +๋ฆฌ๋ฒ ์ด์Šคํ•˜๋Š” ๋™์•ˆ, ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ์žฌ๊ตฌ์กฐํ™”๋˜๋ฉด์„œ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ HEAD๋กœ ์ด๋™๋ฉ๋‹ˆ๋‹ค. + +![rebase and merge](https://miro.medium.com/v2/resize:fit:1400/format:webp/0*K3zOgE4K_nHx89uQ.png) + +์ž‘์—… ํ๋ฆ„์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. + +๋ฆฌ๋ฒ ์ด์Šคํ•˜๋ ค๋Š” ๋ธŒ๋žœ์น˜์— ์žˆ๊ณ  ์›๊ฒฉ ์ €์žฅ์†Œ์—์„œ ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ€์ ธ์™”๋Š”์ง€(fetch) ํ™•์ธํ•ฉ๋‹ˆ๋‹ค: + +```bash +git checkout your_branch +git fetch +``` + +์ด์ œ ๋ฆฌ๋ฒ ์ด์Šคํ•  ๋ธŒ๋žœ์น˜๋ฅผ ์„ ํƒํ•˜๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค: + +```bash +git rebase upstream_branch +``` + +๋ฆฌ๋ฒ ์ด์Šค ํ›„, ๋ธŒ๋žœ์น˜๊ฐ€ ์ด๋ฏธ ์›๊ฒฉ ์ €์žฅ์†Œ์— ํ‘ธ์‹œ๋œ ๊ฒฝ์šฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ•์ œ๋กœ ํ‘ธ์‹œํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค: + +```bash +git push origin your_branch --force +``` + +> โš ๏ธ `--force`๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํƒ€๊ฒŸ ๋ธŒ๋žœ์น˜์˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ main/master ๋ธŒ๋žœ์น˜์—๋Š” ์ ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. + +## Squashing + +Git ์Šค์ฟผ์‹ฑ์€ ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์„ ๋‹จ์ผํ•˜๊ณ  ์ผ๊ด€๋œ ์ปค๋ฐ‹์œผ๋กœ ์••์ถ•ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. + +![squash](https://miro.medium.com/v2/resize:fit:1400/format:webp/0*E_aIeGBb-J-Krud_.png) + +๊ฐœ๋…์€ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ , ํŠนํžˆ ๋ฆฌ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ํ†ตํ•ฉ ๋ฐฉ์‹์ด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ, ํ”„๋กœ์ ํŠธ ํžˆ์Šคํ† ๋ฆฌ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์— ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. + +์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ฆฌ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šค์ฟผ์‹œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๋˜ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ๋„ ์šฐ๋ฆฌ๋ฅผ ๋„์™€์ค„ ๋„๊ตฌ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ์Šค์ฟผ์‹ฑ ๋ฐฉ๋ฒ•์€ ์Šคํ…Œ์ด์ง•๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์œ ์ง€ํ•˜๋ฉด์„œ HEAD ํฌ์ธํ„ฐ๋ฅผ X๊ฐœ์˜ ์ปค๋ฐ‹ ๋’ค๋กœ ์ด๋™์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. + +```bash +# ์Šค์ฟผ์‹œํ•˜๋ ค๋Š” ์ปค๋ฐ‹ ์ˆ˜์— ๋”ฐ๋ผ HEAD~ ๋’ค์˜ ์ˆซ์ž๋ฅผ ๋ณ€๊ฒฝํ•˜์‹ญ์‹œ์˜ค. +git reset --soft HEAD~X +git commit -m "Your squashed commit message" +git push origin your_branch --force +``` + +> โš ๏ธ `--force`๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํƒ€๊ฒŸ ๋ธŒ๋žœ์น˜์˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ main/master ๋ธŒ๋žœ์น˜์—๋Š” ์ ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. + +## Cherry-picking + +Cherry-picking์€ ์ „์ฒด ๋ธŒ๋žœ์น˜๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์„ ๋•Œ ํ•œ ๋ธŒ๋žœ์น˜์—์„œ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ ์„ ํƒ์ ์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํฌํ•จํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž˜๋ชป ์ ์šฉํ•˜๋ฉด ์ค‘๋ณต๋œ ์ปค๋ฐ‹๊ณผ ๋ถ„๊ธฐ๋œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +![cherry-pick](https://miro.medium.com/v2/resize:fit:1400/format:webp/0*7DjXUtEoc5D5i9a8.png) + +์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋จผ์ € `git log`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ ธ์˜ค๋ ค๋Š” ์ปค๋ฐ‹์˜ ํ•ด์‹œ๋ฅผ ์‹๋ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ฐ‹ ํ•ด์‹œ๋ฅผ ์‹๋ณ„ํ•œ ํ›„ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: + +```bash +git checkout target_branch +git cherry-pick # ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์„ ์›ํ•  ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜ํ–‰ +git push origin target_branch +``` + +## ๊ณ ๊ธ‰ Git ๋ช…๋ น์–ด + +### ์ปค๋ฐ‹ ์„œ๋ช…ํ•˜๊ธฐ + +์ปค๋ฐ‹ ์„œ๋ช…์€ Git์—์„œ ์ปค๋ฐ‹์˜ ์‹ ๋ขฐ์„ฑ๊ณผ ๋ฌด๊ฒฐ์„ฑ์„ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋Š” GPG(GNU Privacy Guard) ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹์„ ์•”ํ˜ธํ•™์ ์œผ๋กœ ์„œ๋ช…ํ•จ์œผ๋กœ์จ Git์ด ์ปค๋ฐ‹ ์ž‘์„ฑ์ž๊ฐ€ ์‹ค์ œ ์ž‘์„ฑ์ž์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด GPG ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Git์ด ์ปค๋ฐ‹ํ•  ๋•Œ ํ•ด๋‹น ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: + +```bash +# GPG ํ‚ค ์ƒ์„ฑ +gpg --gen-key + +# Git์ด GPG ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑ +git config --global user.signingkey + +# ๊ณต๊ฐœ ํ‚ค๋ฅผ GitHub ๊ณ„์ •์— ์ถ”๊ฐ€ + +# -S ํ”Œ๋ž˜๊ทธ๋กœ ์ปค๋ฐ‹์— ์„œ๋ช… +git commit -S -m "Your commit message" + +# ์„œ๋ช…๋œ ์ปค๋ฐ‹ ๋ณด๊ธฐ +git log --show-signature +``` + +### Git reflog + +Git ์ฐธ์กฐ์— ๋Œ€ํ•ด ํƒ๊ตฌํ•˜์ง€ ์•Š์•˜๋˜ ์ฃผ์ œ๋กœ, ์ฐธ์กฐ๊ฐ€ ์ €์žฅ์†Œ ๋‚ด์˜ ๋‹ค์–‘ํ•œ ๊ฐ์ฒด(์ฃผ๋กœ ์ปค๋ฐ‹, ํƒœ๊ทธ ๋ฐ ๋ธŒ๋žœ์น˜)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฐธ์กฐ๋Š” Git ํžˆ์Šคํ† ๋ฆฌ์˜ ์ด๋ฆ„์ด ์ง€์ •๋œ ์ง€์ ์œผ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ์ €์žฅ์†Œ์˜ ํƒ€์ž„๋ผ์ธ์„ ํƒ์ƒ‰ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ์˜ ํŠน์ • ์Šค๋ƒ…์ƒท์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. Git ์ฐธ์กฐ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„๋Š” ๊ฒƒ์€ ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, `git reflog`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ช‡ ๊ฐ€์ง€ ์ด์ ์ž…๋‹ˆ๋‹ค: + +- ์žƒ์–ด๋ฒ„๋ฆฐ ์ปค๋ฐ‹์ด๋‚˜ ๋ธŒ๋žœ์น˜ ๋ณต๊ตฌ +- ๋””๋ฒ„๊น… ๋ฐ ๋ฌธ์ œ ํ•ด๊ฒฐ +- ์‹ค์ˆ˜ ๋˜๋Œ๋ฆฌ๊ธฐ + +### **Interactive rebase** + +์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ฆฌ๋ฒ ์ด์Šค๋Š” ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ƒํ˜ธ์ž‘์šฉ ๋ฐฉ์‹์œผ๋กœ ์žฌ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ Git ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปค๋ฐ‹์„ ์ˆ˜์ •, ์žฌ์ •๋ ฌ, ๊ฒฐํ•ฉ ๋˜๋Š” ์‚ญ์ œํ•œ ํ›„ ๋ธŒ๋žœ์น˜์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ€๋Šฅํ•œ ์ž‘์—…์— ์ต์ˆ™ํ•ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค: + +- Pick (โ€œpโ€œ): ์ปค๋ฐ‹์„ ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค. +- Reword (โ€œrโ€œ): ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. +- Edit (โ€œeโ€œ): ์ปค๋ฐ‹ ๋‚ด์šฉ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. +- Squash (โ€œsโ€œ): ์ปค๋ฐ‹์„ ์ด์ „ ์ปค๋ฐ‹๊ณผ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. +- Drop (โ€œdโ€œ): ์ปค๋ฐ‹์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. + +![interactive rebase](https://miro.medium.com/v2/resize:fit:1400/format:webp/0*0JsQJSp-ot6C0O_x.png) + +ํ„ฐ๋ฏธ๋„์—์„œ ์ธํ„ฐ๋ ‰ํ‹ฐ๋ธŒ ๋ฆฌ๋ฒ ์ด์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์ด์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์œ ์šฉํ•œ ๋น„๋””์˜ค๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. + +[Advanced Git Tutorial - Interactive Rebase, Cherry-Picking, Reflog, Submodules and more](https://www.youtube.com/watch?v=qsTthZi23VE) + +## Git์„ ์ด์šฉํ•œ ํ˜‘์—… + +### Origin vs Upstream + +`origin`์€ ๋กœ์ปฌ Git ์ €์žฅ์†Œ์™€ ์—ฐ๊ด€๋œ ๊ธฐ๋ณธ ์›๊ฒฉ ์ €์žฅ์†Œ๋กœ, ์ €์žฅ์†Œ๋ฅผ ํด๋ก ํ•  ๋•Œ ๊ธฐ๋ณธ์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์ €์žฅ์†Œ๋ฅผ ํฌํฌํ•œ ๊ฒฝ์šฐ, ๊ทธ ํฌํฌ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ "origin" ์ €์žฅ์†Œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. + +๋ฐ˜๋ฉด์— `upstream`์€ ์ €์žฅ์†Œ๊ฐ€ ํฌํฌ๋œ ์›๋ณธ ์ €์žฅ์†Œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. + +ํฌํฌํ•œ ์ €์žฅ์†Œ๋ฅผ ์›๋ณธ ํ”„๋กœ์ ํŠธ์˜ ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด `upstream` ์ €์žฅ์†Œ์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ€์ ธ์™€ ๋กœ์ปฌ ์ €์žฅ์†Œ์— ๋ณ‘ํ•ฉํ•˜๊ฑฐ๋‚˜ ๋ฆฌ๋ฒ ์ด์Šคํ•ฉ๋‹ˆ๋‹ค. + +๋กœ์ปฌ Git ์ €์žฅ์†Œ์™€ ์—ฐ๊ด€๋œ ์›๊ฒฉ ์ €์žฅ์†Œ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”: + +```bash +git remote -v +``` + +### ์ถฉ๋Œ + +๋ธŒ๋žœ์น˜๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ฑฐ๋‚˜ ๋ฆฌ๋ฒ ์ด์Šคํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋‹นํ™ฉํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด๋Š” ์ €์žฅ์†Œ์˜ ๋™์ผ ํŒŒ์ผ์ด๋‚˜ ํŒŒ์ผ์˜ ๋‹ค๋ฅธ ๋ฒ„์ „ ๊ฐ„์— ์ถฉ๋Œํ•˜๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +![git merge](https://miro.medium.com/v2/resize:fit:800/format:webp/0*i6L16rbIkHv8dEk2.gif) + +๋ณดํ†ต ์ถฉ๋Œ ํŒŒ์ผ ๋‚ด์—์„œ Git์ด ์ถฉ๋Œ ๋งˆ์ปค <<<<<<<, ======= ๋ฐ >>>>>>>๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ์ถฉ๋Œํ•˜๋Š” ๋ถ€๋ถ„์„ ๊ฐ•์กฐ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์œ ์ง€ํ•  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฒฐ์ •ํ•˜๊ณ , ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜์—ฌ ๊ฒฐ๊ณผ ์ฝ”๋“œ๊ฐ€ ์˜๋ฏธ ์žˆ๊ณ  ์˜๋„ํ•œ ๊ธฐ๋Šฅ์„ ์œ ์ง€ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. + +์ถฉ๋Œ ํŒŒ์ผ์—์„œ ์ˆ˜๋™์œผ๋กœ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•œ ํ›„, ์ถฉ๋Œ ๋งˆ์ปค <<<<<<<, ======= ๋ฐ >>>>>>>๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ํ•„์š”ํ•œ ๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค. + +์ถฉ๋Œ์ด ํ•ด๊ฒฐ๋˜๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. + +์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์ด ์žˆ๋‹ค๋ฉด, ์ด ๋น„๋””์˜ค๊ฐ€ ์ž˜ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. + +[How to resolve merge conflicts in Git](https://www.youtube.com/watch?v=xNVM5UxlFSA) + +## ์ธ๊ธฐ ์žˆ๋Š” Git ์›Œํฌํ”Œ๋กœ์šฐ + +![git workflow](https://miro.medium.com/v2/resize:fit:1400/format:webp/0*gGKScUnzECg5XgPR.png) +๋‹ค์–‘ํ•œ Git ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ, ๋ณดํŽธ์ ์œผ๋กœ "์ตœ๊ณ "์ธ Git ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , ๊ฐ ์ ‘๊ทผ ๋ฐฉ์‹์—๋Š” ๊ณ ์œ ํ•œ ์žฅ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋‹ค์–‘ํ•œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ํƒ๊ตฌํ•˜์—ฌ ๊ฐ๊ฐ์˜ ๊ฐ•์ ๊ณผ ์•ฝ์ ์„ ์ดํ•ดํ•ด ๋ด…์‹œ๋‹ค. + +![team work](https://miro.medium.com/v2/resize:fit:958/format:webp/0*FuqVTVVErR7upZgI.gif) + +### **Feature Branch Workflow**ย ๐ŸŒฑ + +๊ฐ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ •์„ ๋ณ„๋„์˜ ๋ธŒ๋žœ์น˜์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ์™„๋ฃŒ๋˜๋ฉด ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค. + +**์žฅ์ **: ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ๊ฒฉ๋ฆฌ ๋ฐ ์ถฉ๋Œ ๊ฐ์†Œ +**๋‹จ์ **: ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹ ์ค‘ํ•œ ๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. + +### Gitflow **Workflow** ๐ŸŒŠ + +Gitflow๋Š” ๋‹ค์–‘ํ•œ ๊ฐœ๋ฐœ ์ž‘์—…์„ ์œ„ํ•œ ์‚ฌ์ „ ์ •์˜๋œ ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ€์ง„ ์—„๊ฒฉํ•œ ๋ธŒ๋žœ์นญ ๋ชจ๋ธ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. + +์—ฌ๊ธฐ์—๋Š” main, develop, feature ๋ธŒ๋žœ์น˜, release ๋ธŒ๋žœ์น˜, hotfix ๋ธŒ๋žœ์น˜์™€ ๊ฐ™์€ ์žฅ๊ธฐ ๋ธŒ๋žœ์น˜๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. + +**์žฅ์ **: ์ •๊ธฐ ๋ฆด๋ฆฌ์ฆˆ์™€ ์žฅ๊ธฐ ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. +**๋‹จ์ **: ์ž‘์€ ํŒ€์—๋Š” ๋„ˆ๋ฌด ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### **Forking** **Workflow** ๐Ÿด + +์ด ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ ๊ฐ ๊ฐœ๋ฐœ์ž๋Š” ๋ฉ”์ธ ์ €์žฅ์†Œ๋ฅผ ํด๋ก ํ•˜์ง€๋งŒ, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ง์ ‘ ํ‘ธ์‹œํ•˜๋Š” ๋Œ€์‹  ์ž์‹ ์˜ ํฌํฌ๋œ ์ €์žฅ์†Œ๋กœ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐœ๋ฐœ์ž๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ œ์•ˆํ•˜๋Š” ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฉ”์ธ ์ €์žฅ์†Œ์— ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „์— ์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ ํ˜‘์—…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +์ด ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ์˜คํ”ˆ ์†Œ์Šค Glasskube ์ €์žฅ์†Œ์—์„œ ํ˜‘์—…ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. + +**์žฅ์ **: ๋ฉ”์ธ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ์ง์ ‘ ์“ฐ๊ธฐ ๊ถŒํ•œ ์—†์ด ์™ธ๋ถ€ ๊ธฐ์—ฌ์ž์˜ ํ˜‘์—…์„ ์žฅ๋ คํ•ฉ๋‹ˆ๋‹ค. +**๋‹จ์ **: ํฌํฌ์™€ ๋ฉ”์ธ ์ €์žฅ์†Œ ๊ฐ„์˜ ๋™๊ธฐํ™”๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### **Pull Request Workflow**โฉ + +ํฌํ‚น ์›Œํฌํ”Œ๋กœ์šฐ์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ํฌํ‚น ๋Œ€์‹  ๊ฐœ๋ฐœ์ž๋Š” ๋ฉ”์ธ ์ €์žฅ์†Œ์—์„œ ์ง์ ‘ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. + +**์žฅ์ **: ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ํ˜‘์—… ๋ฐ ํŒ€์› ๊ฐ„์˜ ์ง€์‹ ๊ณต์œ ๋ฅผ ์ด‰์ง„ํ•ฉ๋‹ˆ๋‹ค. +**๋‹จ์ **: ์ธ๊ฐ„ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์–ด์— ์˜์กดํ•˜๋ฉด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### Trunk ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ ๐Ÿชต + +๋น ๋ฅธ ๋ฐ˜๋ณต ๋ฐ ์ง€์†์ ์ธ ๋ฐฐํฌ์— ์ค‘์ ์„ ๋‘” ํŒ€์ด๋ผ๋ฉด, ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋Š” ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์—์„œ ์ง์ ‘ ์ž‘์—…ํ•˜์—ฌ ์ž‘์€ ๋นˆ๋ฒˆํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค. + +**์žฅ์ **: ๋น ๋ฅธ ๋ฐ˜๋ณต, ์ง€์†์ ์ธ ํ†ตํ•ฉ ๋ฐ ์ž‘์€ ๋นˆ๋ฒˆํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ”„๋กœ๋•์…˜์— ์ „๋‹ฌํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. +**๋‹จ์ **: ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ•๋ ฅํ•œ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ๋ฐ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์ด ํ•„์š”ํ•˜๋ฉฐ, ์—„๊ฒฉํ•œ ๋ฆด๋ฆฌ์ฆˆ ์ผ์ •์ด๋‚˜ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์ด ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### fork๊ฐ€ ๋ญ”๊ฐ€์š”? + +ํฌํฌ๋Š” ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์—์„œ ํ˜‘์—…ํ•  ๋•Œ ๊ฐ•๋ ฅํžˆ ์ถ”์ฒœ๋ฉ๋‹ˆ๋‹ค. ์ €์žฅ์†Œ์˜ ์‚ฌ๋ณธ์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ œ์–ด ๊ถŒํ•œ์„ ๊ฐ€์ง€๋ฉฐ, ๋ณ€๊ฒฝ์„ ๊ฐ€ํ•˜๊ฑฐ๋‚˜, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์‹คํ—˜ํ•˜๊ฑฐ๋‚˜, ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +> ๐Ÿ’ก ํฌํฌ๋œ ์ €์žฅ์†Œ๋Š” ๋ณ„๋„์˜ ์—”ํ„ฐํ‹ฐ๋กœ ์‹œ์ž‘ํ•˜์ง€๋งŒ, ์›๋ณธ ์ €์žฅ์†Œ์™€์˜ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์›๋ณธ ํ”„๋กœ์ ํŠธ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋งŒ๋“  ์—…๋ฐ์ดํŠธ์™€ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +์ด๋กœ ์ธํ•ด ์ž์‹ ์˜ origin์ €์žฅ์†Œ๋กœ ํ‘ธ์‹œํ•˜๋”๋ผ๋„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์›๊ฒฉ์—์„œ๋„ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. + +### Git **Cheatsheet** + +```bash +bash์ฝ”๋“œ ๋ณต์‚ฌ +# ์ €์žฅ์†Œ ํด๋ก ํ•˜๊ธฐ +git clone + +# ์ปค๋ฐ‹์„ ์œ„ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์Šคํ…Œ์ด์ง• +git add + +# ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ปค๋ฐ‹ +git commit -m "Commit message" + +# ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์›๊ฒฉ ์ €์žฅ์†Œ๋กœ ํ‘ธ์‹œ +git push + +# ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๊ฐ•์ œ ํ‘ธ์‹œ (์ฃผ์˜) +git push --force + +# ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹์œผ๋กœ ๋ฆฌ์…‹ +git reset --hard + +# ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ +git branch + +# ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ ์ „ํ™˜ +git checkout + +# ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋ณ‘ํ•ฉ +git merge + +# ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ ๋ฆฌ๋ฒ ์ด์Šค (์ฃผ์˜) +git rebase + +# ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ์ƒํƒœ ๋ณด๊ธฐ +git status + +# ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ ๋ณด๊ธฐ +git log + +# ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹ ์ทจ์†Œ (์ฃผ์˜) +git reset --soft HEAD^ + +# ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ํ๊ธฐ +git restore + +# ์žƒ์–ด๋ฒ„๋ฆฐ ์ปค๋ฐ‹ ์ฐธ์กฐ ๋ณต๊ตฌ +git reflog + +# ์ปค๋ฐ‹์„ ์žฌ๋ฐฐ์น˜ํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ฆฌ๋ฒ ์ด์Šค +git rebase --interactive HEAD~3 + +``` + +### ์œ ์šฉํ•œ Git ๋„๊ตฌ ๋ฐ ๋ฆฌ์†Œ์Šค + +- ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ฆฌ๋ฒ ์ด์Šค ๋„๊ตฌ + [interactiveRebaseTool](https://github.com/MitMaro/git-interactive-rebase-tool) +- ์ƒ‰์ƒ์œผ๋กœ ๊ฐ•์กฐ๋œ ์ ์ง„์  ์ฐจ์ด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” Cdiff + [cdiff](https://github.com/amigrave/cdiff) +- ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ Git ๋ธŒ๋žœ์นญ ์—ฐ์Šต์žฅ + [Learn Git Branching](https://learngitbranching.js.org/?locale=en_US) + +์ด์™€ ๊ฐ™์€ ์ฝ˜ํ…์ธ ๊ฐ€ ๋งˆ์Œ์— ๋“œ์‹ ๋‹ค๋ฉด, GitHub์—์„œ ์ €ํฌ์—๊ฒŒ Star๋ฅผ ์ฃผ์…”์„œ ์ง€์›ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ™ + +![cat](https://miro.medium.com/v2/resize:fit:1400/format:webp/0*OTGGI6NNJyE-s83Z.jpeg)