From df18757c852c7a6eb46335c7a352409d2ef5e533 Mon Sep 17 00:00:00 2001 From: Cotidie Date: Mon, 31 Jul 2023 10:50:09 +0900 Subject: [PATCH 01/73] =?UTF-8?q?docs:=20step=201=20=EB=AA=A9=ED=91=9C=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 48 ++++++++++++++---------------------------------- 1 file changed, 14 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index fcd44c6..3ad7cc0 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,18 @@ -# Git Study -- [1️⃣️ Git 기초](#1️⃣️-git-기초) -- [2️⃣️ Git 협업](#2️⃣️-git-협업) -- [3️⃣️ 협업 중 문제상황](#3️⃣️-협업-중-문제상황) -- [4️⃣️ 동아리 협업](#4️⃣️-동아리-협업) -- [🔗️ 참조](#️-참조) +# Step 1: Git 기초 +Git 사용의 첫 단계입니다. +## 목표 +- [ ] git의 동작 과정 이해 +- [ ] rebase와 reset 이해 +- [ ] Git 저장소 Clone 하기 +- [ ] 브랜치를 만들고 커밋 쌓기 +- [ ] Pull Request와 Merge +- [ ] Markdown 문서 작성 -![learn-git](https://i0.wp.com/blog.nextstacks.com/wp-content/uploads/2021/11/Reasons-to-Learn-Git-as-a-Developer-New.png?fit=1280%2C720&ssl=1) - 동아리 Git 스터디/워크샵을 위한 리포지토리입니다. 스터디는 실습 형식으로 총 4단계로 구성되어 있으며 2~3일에 걸쳐 진행합니다. git 커맨드라인 환경에서 진행하므로 사전에 [동아리 개발환경 설정](https://github.com/ApptiveDev/.github/blob/main/docs/Dev%20Environment%20Setup.md) 문서를 따라주시기 바랍니다. 또, 스터디를 진행하면서 부족한 부분은 계속 보완해주시기 바랍니다. -- 개인의 선호에 따라 GUI 툴 활용 가능 (GitKraken, SourceTree, Github GUI 등) - -## 1️⃣️ Git 기초 -### 🎯️ 목표 -git과 github의 차이점, git이 동작하는 과정, git 기본 명령어를 알아봅시다! -### 📜️ 진행 -- `step-1` 브랜치로부터 자신의 브랜치를 생성합니다. -- `README`에 주어진 키워드를 조사하고 본인의 README를 작성합니다. -- 작성 후 `step-1` 브랜치로 Pull Request를 올립니다. +## 진행 -## 2️⃣️ Git 협업 -### 🎯️ 목표 -앞서 익힌 git 명령어를 활용해 간단한 협업을 진행해봅니다. +## 정리 -### 📜️ 진행 - -## 3️⃣️ 협업 중 문제상황 -### 🎯️ 목표 -협업 중 맞닥뜨릴 수 있는 다양한 문제상황을 git 명령어로 해결해봅니다. -### 📜️ 진행 - -## 4️⃣️ 동아리 협업 -### 🎯️ 목표 -[동아리 브랜치 관리전략](https://github.com/ApptiveDev/.github/blob/f9a2f448b57225c3921dc774e8b7800c3289e878/docs/CONTRIBUTING.md)을 지키며 협업을 진행해봅니다. -### 📜️ 진행 - -## 🔗️ 참조 -- [누구나 쉽게 이해할 수 있는 Git 입문](https://backlog.com/git-tutorial/kr/) +## 추가 목표 +Markdown 문서를 작성할 수 있게 되었으니, 본인의 Github 프로필을 꾸며봅시다. 아래 참고 블로그나 잘 꾸며진 프로필을 보면서 본인의 프로필을 만들어보세요. 연습을 위해 로컬 git에서 작업하시기 바랍니다. +- **참고**: [(노션) 깃허브 프로필 꾸미기!](https://80000coding.oopy.io/865f4b2a-5198-49e8-a173-0f893a4fed45) \ No newline at end of file From f8964a6d5514f38849cce4e26f2735c42b7113f0 Mon Sep 17 00:00:00 2001 From: Cotidie Date: Mon, 31 Jul 2023 11:41:09 +0900 Subject: [PATCH 02/73] =?UTF-8?q?docs:=20step=201=20=EC=A7=84=ED=96=89?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 +++++++++++++++--------- git-basics/README.md | 0 2 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 git-basics/README.md diff --git a/README.md b/README.md index 3ad7cc0..566129e 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,24 @@ -# Step 1: Git 기초 -Git 사용의 첫 단계입니다. +# 1️⃣️ Git 기초 +![git-basics](https://digitalvarys.com/wp-content/uploads/2019/06/Git-Basics-and-Beginners-Guide-1.png) +Git과 Github 사용의 첫 단계입니다. -## 목표 +## 🎯️ 목표 - [ ] git의 동작 과정 이해 - [ ] rebase와 reset 이해 -- [ ] Git 저장소 Clone 하기 +- [ ] Github 저장소 clone 하기 - [ ] 브랜치를 만들고 커밋 쌓기 - [ ] Pull Request와 Merge - [ ] Markdown 문서 작성 -## 진행 +## 📜️ 진행 +1. 이 리포지토리를 로컬에 clone 합니다. +2. 이 브랜치(`step-1`)에서 본인의 브랜치를 만듭니다. + - 브랜치명은 `step-1/<이름>`으로 생성 +3. `git-basics/README.md`를 복사하고, 빈 항목들을 조사해 채워넣습니다. + - 복사한 파일명은 `REAMDE-<이름>.md`로 변경 + - 채우면서 최소 5개의 커밋 쌓기 +4. 본인 브랜치를 push하고 `step-1` 브랜치로 Pull Request를 올립니다. -## 정리 - -## 추가 목표 -Markdown 문서를 작성할 수 있게 되었으니, 본인의 Github 프로필을 꾸며봅시다. 아래 참고 블로그나 잘 꾸며진 프로필을 보면서 본인의 프로필을 만들어보세요. 연습을 위해 로컬 git에서 작업하시기 바랍니다. +## ➕️ 추가 목표 +이제 Markdown 문서를 작성할 수 있게 되었으니, 본인의 Github 프로필을 꾸며봅시다. 아래 참고 블로그나 잘 꾸며진 프로필을 보면서 본인의 프로필을 만들어보세요. 연습을 위해 로컬 git에서 작업하시기 바랍니다. - **참고**: [(노션) 깃허브 프로필 꾸미기!](https://80000coding.oopy.io/865f4b2a-5198-49e8-a173-0f893a4fed45) \ No newline at end of file diff --git a/git-basics/README.md b/git-basics/README.md new file mode 100644 index 0000000..e69de29 From 25dbc560c5419aef4e977a72d5b6d5b1ec9fc02d Mon Sep 17 00:00:00 2001 From: Cotidie Date: Mon, 31 Jul 2023 13:16:50 +0900 Subject: [PATCH 03/73] =?UTF-8?q?docs:=20git=20basics=20=EC=A1=B0=EC=82=AC?= =?UTF-8?q?=20=ED=85=9C=ED=94=8C=EB=A6=BF=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-basics/README.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/git-basics/README.md b/git-basics/README.md index e69de29..2c0820a 100644 --- a/git-basics/README.md +++ b/git-basics/README.md @@ -0,0 +1,33 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +(git과 github는 같은 의미가 아닙니다. local, remote와 연관지어 적어주세요.) + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +(위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. Git Merge, Git Fetch는 생략해도 됩니다.) + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +(git이 동작하는 기본 단위는 commit과 branch입니다. branch와 HEAD, git checkout을 포함하여 작성 바랍니다. branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요.) + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +(reset에는 3가지 타입이 있습니다. 각 타입에 대해 작성 바랍니다.) + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +(Pull Request와 Merge에 대한 내용을 적어주세요. 특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요.) + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +(rebase는 매우 유용한 커맨드입니다. rebase란 무엇인지, 어떤 때에 유용한지, interactive rebase 등에 대해 작성 바랍니다.) + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +(git stash를 활용하는 방법에 대해 적어주세요.) + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. \ No newline at end of file From 8d6cd5424d0ee7cbf3c48822b0b8d833c1282c5a Mon Sep 17 00:00:00 2001 From: Cotidie Date: Mon, 7 Aug 2023 10:30:25 +0900 Subject: [PATCH 04/73] Adds clone, init, origin part --- git-basics/README.md | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/git-basics/README.md b/git-basics/README.md index 2c0820a..831510a 100644 --- a/git-basics/README.md +++ b/git-basics/README.md @@ -3,31 +3,44 @@ Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 ## Git != Github ![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) -(git과 github는 같은 의미가 아닙니다. local, remote와 연관지어 적어주세요.) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. ## Git Workflow ![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) -(위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. Git Merge, Git Fetch는 생략해도 됩니다.) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. ## Branch, HEAD ![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) -(git이 동작하는 기본 단위는 commit과 branch입니다. branch와 HEAD, git checkout을 포함하여 작성 바랍니다. branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요.) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 ## reset ![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) -(reset에는 3가지 타입이 있습니다. 각 타입에 대해 작성 바랍니다.) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. ## Pull Request, Merge ![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) -(Pull Request와 Merge에 대한 내용을 적어주세요. 특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요.) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. ## rebase ![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) -(rebase는 매우 유용한 커맨드입니다. rebase란 무엇인지, 어떤 때에 유용한지, interactive rebase 등에 대해 작성 바랍니다.) +rebase란 무엇인지, 어떤 때에 유용한지, interactive rebase 등에 대해 작성 바랍니다. ## stash ![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) -(git stash를 활용하는 방법에 대해 적어주세요.) +git stash를 활용하는 방법에 대해 적어주세요. ## Questions 조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. \ No newline at end of file From d3c5155a02280750e311b8a4ed6b23709084c0fa Mon Sep 17 00:00:00 2001 From: Cotidie Date: Mon, 7 Aug 2023 12:47:21 +0900 Subject: [PATCH 05/73] =?UTF-8?q?docs:=20Advanced=20=EC=A3=BC=EC=A0=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-basics/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/git-basics/README.md b/git-basics/README.md index 831510a..4380937 100644 --- a/git-basics/README.md +++ b/git-basics/README.md @@ -42,5 +42,11 @@ rebase란 무엇인지, 어떤 때에 유용한지, interactive rebase 등에 ![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) git stash를 활용하는 방법에 대해 적어주세요. +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- 리포지토리의 두 타입인 bare, non-bare +- `reset --hard`와 `push/pull --force`의 적절한 사용법 +- 브랜치 이름은 `parent/child-1`, `parent/child-2`는 가질 수 있지만 `parent`, `parent/child`는 가질 수 없다. 무슨 이유 때문인지. + ## Questions 조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. \ No newline at end of file From fab5139dcd691b11294f54da13f984318ecc77bf Mon Sep 17 00:00:00 2001 From: Cotidie Date: Mon, 7 Aug 2023 15:53:22 +0900 Subject: [PATCH 06/73] =?UTF-8?q?docs:=20=EA=B0=9C=EC=9D=B8=20=EB=B8=8C?= =?UTF-8?q?=EB=9E=9C=EC=B9=98=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 566129e..21bb0d8 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Git과 Github 사용의 첫 단계입니다. ## 📜️ 진행 1. 이 리포지토리를 로컬에 clone 합니다. 2. 이 브랜치(`step-1`)에서 본인의 브랜치를 만듭니다. - - 브랜치명은 `step-1/<이름>`으로 생성 + - 브랜치명은 `step-1-<이름>`으로 생성 3. `git-basics/README.md`를 복사하고, 빈 항목들을 조사해 채워넣습니다. - 복사한 파일명은 `REAMDE-<이름>.md`로 변경 - 채우면서 최소 5개의 커밋 쌓기 From 4187beb314b4da4e30a7c2d92d8d330bcb34a1db Mon Sep 17 00:00:00 2001 From: Cotidie Date: Mon, 7 Aug 2023 21:59:32 +0900 Subject: [PATCH 07/73] =?UTF-8?q?docs:=20=EC=B6=94=EA=B0=80=EC=A1=B0?= =?UTF-8?q?=EC=82=AC=20=ED=95=AD=EB=AA=A9=202=EA=B0=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-basics/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/git-basics/README.md b/git-basics/README.md index 4380937..525a4f7 100644 --- a/git-basics/README.md +++ b/git-basics/README.md @@ -45,6 +45,8 @@ git stash를 활용하는 방법에 대해 적어주세요. ## Advanced 다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. - 리포지토리의 두 타입인 bare, non-bare +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) - `reset --hard`와 `push/pull --force`의 적절한 사용법 - 브랜치 이름은 `parent/child-1`, `parent/child-2`는 가질 수 있지만 `parent`, `parent/child`는 가질 수 없다. 무슨 이유 때문인지. From 47c8d516d9fc539e132aa86bbc8be327b9f18e36 Mon Sep 17 00:00:00 2001 From: Cotidie Date: Tue, 8 Aug 2023 10:38:27 +0900 Subject: [PATCH 08/73] =?UTF-8?q?docs:=20--interactive=EB=8A=94=20advanced?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-basics/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/git-basics/README.md b/git-basics/README.md index 525a4f7..7cecd12 100644 --- a/git-basics/README.md +++ b/git-basics/README.md @@ -36,7 +36,7 @@ Pull Request와 Merge에 대한 내용을 적어주세요. ## rebase ![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) -rebase란 무엇인지, 어떤 때에 유용한지, interactive rebase 등에 대해 작성 바랍니다. +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. ## stash ![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) From c72a9f428abcb5f0aabc1de23caf1b2367e92b8b Mon Sep 17 00:00:00 2001 From: Cotidie Date: Tue, 8 Aug 2023 12:58:37 +0900 Subject: [PATCH 09/73] =?UTF-8?q?=EC=8B=A4=EC=8A=B5=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=EA=B2=BD=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 21bb0d8..352591e 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,8 @@ Git과 Github 사용의 첫 단계입니다. 1. 이 리포지토리를 로컬에 clone 합니다. 2. 이 브랜치(`step-1`)에서 본인의 브랜치를 만듭니다. - 브랜치명은 `step-1-<이름>`으로 생성 -3. `git-basics/README.md`를 복사하고, 빈 항목들을 조사해 채워넣습니다. - - 복사한 파일명은 `REAMDE-<이름>.md`로 변경 +3. `/git-basics/README.md`를 복사하고, 빈 항목들을 조사해 채워넣습니다. + - 복사한 파일명은 `/git-basics/REAMDE-<이름>.md`로 변경 - 채우면서 최소 5개의 커밋 쌓기 4. 본인 브랜치를 push하고 `step-1` 브랜치로 Pull Request를 올립니다. From 9630afaeeb20d87a172ed12bf7f889921246766f Mon Sep 17 00:00:00 2001 From: Cotidie Date: Tue, 8 Aug 2023 23:53:47 +0900 Subject: [PATCH 10/73] =?UTF-8?q?Advanced=20=EC=A3=BC=EC=A0=9C=EB=A1=9C=20?= =?UTF-8?q?.gitignore=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-basics/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/git-basics/README.md b/git-basics/README.md index 7cecd12..49a4b4e 100644 --- a/git-basics/README.md +++ b/git-basics/README.md @@ -44,11 +44,12 @@ git stash를 활용하는 방법에 대해 적어주세요. ## Advanced 다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. -- 리포지토리의 두 타입인 bare, non-bare - `git rebase --interactive`란? - branch의 upstream이란? (`git push --set-upstream`) - `reset --hard`와 `push/pull --force`의 적절한 사용법 +- `.gitignore` 사용법 - 브랜치 이름은 `parent/child-1`, `parent/child-2`는 가질 수 있지만 `parent`, `parent/child`는 가질 수 없다. 무슨 이유 때문인지. +- 리포지토리의 두 타입인 bare, non-bare ## Questions 조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. \ No newline at end of file From 07494f99aa9ec778dacba9214eebc8fb4230b3d9 Mon Sep 17 00:00:00 2001 From: Cotidie Date: Tue, 8 Aug 2023 23:55:18 +0900 Subject: [PATCH 11/73] =?UTF-8?q?Advanced=20=EC=A3=BC=EC=A0=9C=EB=A1=9C=20?= =?UTF-8?q?git=20fetch=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-basics/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/git-basics/README.md b/git-basics/README.md index 49a4b4e..0bd69c4 100644 --- a/git-basics/README.md +++ b/git-basics/README.md @@ -46,6 +46,7 @@ git stash를 활용하는 방법에 대해 적어주세요. 다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. - `git rebase --interactive`란? - branch의 upstream이란? (`git push --set-upstream`) +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 - `reset --hard`와 `push/pull --force`의 적절한 사용법 - `.gitignore` 사용법 - 브랜치 이름은 `parent/child-1`, `parent/child-2`는 가질 수 있지만 `parent`, `parent/child`는 가질 수 없다. 무슨 이유 때문인지. From a74bf4b4ae3e4d3aa6dbed0556fa31eb14a0053b Mon Sep 17 00:00:00 2001 From: Cotidie Date: Wed, 9 Aug 2023 00:05:05 +0900 Subject: [PATCH 12/73] =?UTF-8?q?Advanced=20=EC=A3=BC=EC=A0=9C=EB=A1=9C=20?= =?UTF-8?q?fork=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-basics/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/git-basics/README.md b/git-basics/README.md index 0bd69c4..9f30d49 100644 --- a/git-basics/README.md +++ b/git-basics/README.md @@ -46,6 +46,7 @@ git stash를 활용하는 방법에 대해 적어주세요. 다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. - `git rebase --interactive`란? - branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. - `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 - `reset --hard`와 `push/pull --force`의 적절한 사용법 - `.gitignore` 사용법 From 7a80743909679ea7ad7b0148a9185b5ba04e2c49 Mon Sep 17 00:00:00 2001 From: Cotidie Date: Wed, 9 Aug 2023 21:41:46 +0900 Subject: [PATCH 13/73] =?UTF-8?q?docs:=20=EB=8F=84=EC=9B=80=EB=A7=90=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/README.md b/README.md index 352591e..e6c8f26 100644 --- a/README.md +++ b/README.md @@ -12,12 +12,44 @@ Git과 Github 사용의 첫 단계입니다. ## 📜️ 진행 1. 이 리포지토리를 로컬에 clone 합니다. +```bash +# 적당한 폴더 생성 및 이동 (linux의 경우 ~/repositories 추천) +mkdir ~/repositories +cd ~/repositories + +# 현재 리포의 우측 상단에서 git clone URL 복사 후 붙여넣기 +git clone + +# 클론된 폴더로 이동 +cd study-git +``` 2. 이 브랜치(`step-1`)에서 본인의 브랜치를 만듭니다. - 브랜치명은 `step-1-<이름>`으로 생성 +```bash +# step-1 브랜치로 이동 +git checkout step-1 + +# 본인 브랜치 생성 및 이동 +git checkout -b step-1-<이름> +``` 3. `/git-basics/README.md`를 복사하고, 빈 항목들을 조사해 채워넣습니다. - 복사한 파일명은 `/git-basics/REAMDE-<이름>.md`로 변경 - 채우면서 최소 5개의 커밋 쌓기 +```bash +# (README-<이름>.md를 채우면서) +git add . +git commit -m "<커밋 메시지>" +``` + 4. 본인 브랜치를 push하고 `step-1` 브랜치로 Pull Request를 올립니다. +```bash +# 브랜치를 처음 push하는 경우 원격 브랜치 등록 +# 현재 브랜치를 origin의 step-1-<이름> 브랜치와 연동한다. +# step-1-<이름> 대신 다른 브랜치명을 사용하면 해당 원격 브랜치와 연결됨. +git push --set-upstream origin step-1-<이름> +# 첫 push 이후에는 git push만 사용하면 됨 +git push +``` ## ➕️ 추가 목표 이제 Markdown 문서를 작성할 수 있게 되었으니, 본인의 Github 프로필을 꾸며봅시다. 아래 참고 블로그나 잘 꾸며진 프로필을 보면서 본인의 프로필을 만들어보세요. 연습을 위해 로컬 git에서 작업하시기 바랍니다. From 6221c45e84f5254d325ada34b8e53b5ef0d23a85 Mon Sep 17 00:00:00 2001 From: Cotidie Date: Fri, 11 Aug 2023 02:33:49 +0900 Subject: [PATCH 14/73] =?UTF-8?q?docs:=20Advanced=20=EC=A3=BC=EC=A0=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(detached=20HEAD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-basics/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/git-basics/README.md b/git-basics/README.md index 9f30d49..ea69ffd 100644 --- a/git-basics/README.md +++ b/git-basics/README.md @@ -50,8 +50,8 @@ git stash를 활용하는 방법에 대해 적어주세요. - `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 - `reset --hard`와 `push/pull --force`의 적절한 사용법 - `.gitignore` 사용법 -- 브랜치 이름은 `parent/child-1`, `parent/child-2`는 가질 수 있지만 `parent`, `parent/child`는 가질 수 없다. 무슨 이유 때문인지. -- 리포지토리의 두 타입인 bare, non-bare +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지 ## Questions 조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. \ No newline at end of file From 7f8550cf55ce23ed30e1d990e71534bff738af64 Mon Sep 17 00:00:00 2001 From: Cotidie Date: Fri, 11 Aug 2023 02:38:00 +0900 Subject: [PATCH 15/73] =?UTF-8?q?docs:=20=ED=8C=8C=EC=9D=BC=20=EB=B3=B5?= =?UTF-8?q?=EC=82=AC=20=EB=8F=84=EC=9B=80=EB=A7=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index e6c8f26..e228f3e 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,9 @@ git checkout -b step-1-<이름> - 복사한 파일명은 `/git-basics/REAMDE-<이름>.md`로 변경 - 채우면서 최소 5개의 커밋 쌓기 ```bash +# /git-basics/README.md 복사 +cp git-basics/README.md git-basics/README-<이름>.md + # (README-<이름>.md를 채우면서) git add . git commit -m "<커밋 메시지>" From 3cd49305388f8a63f44e1058ed7e6cc76007f773 Mon Sep 17 00:00:00 2001 From: Cla6Shade <111969754+cla6shade@users.noreply.github.com> Date: Mon, 14 Aug 2023 00:04:41 +0900 Subject: [PATCH 16/73] =?UTF-8?q?docs:=20README-=EC=9D=B4=EC=84=B8?= =?UTF-8?q?=ED=98=95.md=20=EC=9E=91=EC=84=B1=20(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 step 1 완료 --------- Co-authored-by: 이세형 --- ...E-\354\235\264\354\204\270\355\230\225.md" | 237 ++++++++++++++++++ 1 file changed, 237 insertions(+) create mode 100644 "git-basics/README-\354\235\264\354\204\270\355\230\225.md" diff --git "a/git-basics/README-\354\235\264\354\204\270\355\230\225.md" "b/git-basics/README-\354\235\264\354\204\270\355\230\225.md" new file mode 100644 index 0000000..da2fc3b --- /dev/null +++ "b/git-basics/README-\354\235\264\354\204\270\355\230\225.md" @@ -0,0 +1,237 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. + +> git은 로컬 소스코드의 버전 관리 시스템이다. github은 git으로 관리하는 소스코드를 업로드하여 +> 다른 사용자와 공유할 수 있는 원격 저장소이며, PR, Fork, Clone 등 협업에 필요한 기능을 제공하는 서비스이다. + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. + +> __Working Directory__: 현재 작업 중인 로컬 git 프로젝트의 디렉토리 +> __Staging Area__: commit 이전에 변경 사항을 임시로 저장하는 공간. +> +> __Local Repo__: 사용자의 개인 컴퓨터에 위치한 git 저장소. +> +> __Remote Repo__: 원격 서버에 위치한 git 저장소. +> +> __Git Add__: Working Directory에서 변경 사항이 있는 파일들을 commit 이전에 Staging Area에 추가하는 것. +> +> __Git Commit__: Staging Area에 추가된 변경 사항을 Local Repo에 영구적으로 저장하는 것. 변경 사항을 저장하는 하나의 기본 단위이다. +> +> __Git Push__: Local Repo의 commit을 Remote Repo에 업로드하는 것. +> +> __Git Pull__: Remote Repo의 최신 commit들을 Local Repo에 불러와 변경 사항을 합치는 것. + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + +> __commit__ 은 프로젝트의 변경 사항을 저장하고 관리하는 기본 단위. 현재 작업 중인 커밋의 지시자를 HEAD라고 한다. +> __branch__ 는 코드의 특정 commit을 가리키는 지시자이자, 배포 가능한 코드의 안정성을 유지하면서 독립적인 개발 흐름을 만들 수 있도록 해준다. +> +> 프로젝트를 진행하던 도중 새로운 기능을 만들어야 하는 경우를 가정해보자. +> 기존 프로젝트에 새로운 기능을 추가하려면, 배포 가능한 현재 코드와 독립된 개발 흐름을 만들기 위해 브랜치를 생성해야 한다. +> feature/new-feature (이하 feature 브랜치) 이라는 이름의 브랜치를 생성하려면 Working Directory에서 해당 명령을 실행하면 된다. +> ```bash +> git branch feature/new-feature +> ``` +> 브랜치를 생성했다면, master브랜치가 아닌 new-feature 브랜치에 변경 사항(커밋)을 저장하기 위해 feature 브랜치로 이동해야 한다. +> 아래 명령어를 통해 feature 브랜치로 이동할 수 있고, 이동한 시점 이후의 커밋은 모두 feature 브랜치에 쌓인다. +> ```bash +> git checkout feature/new-feature +> ``` +> +> 위의 과정을 한 번에 통합할 수도 있다. +> ```bash +> git checkout -b feature/new-feature +> ``` +> 새로운 기능이 완성되고 변경사항을 모두 커밋했다면, 안정성 테스트를 거친 후 master 브랜치로 다시 돌아와 feature 브랜치와 병합하여 +> 변경 사항을 적용할 수 있다. +> +> ```bash +> git checkout master(main) +> git merge feature/new-feature +> ``` +> 위 명령어가 실행되면 HEAD에 해당하는 feature 브랜치의 모든 변경사항이 master브랜치에 적용된다. +> 기능구현이 모두 끝난 후 생성했던 브랜치를 삭제할 수 있다. 이는 권장 사항이며 필수는 아니다. +> +> ```bash +> git branch -d feature/new-feature +> ``` + + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +> __git init__ 은 현재의 디렉토리를 git 레포로 초기화하는 것이다. +> 주로 빈 git 프로젝트를 새로 생성하거나 기존의 프로젝트를 git을 사용하여 관리하고 싶을 때 사용한다. +> +> __git clone__ 은 이미 존재하는 원격 git 레포를 복제하여 로컬에 저장하는 것이다. 이때의 원격 저장소를 origin이라고 하고, +> origin은 git clone 명령어를 실행한 시점에 자동으로 설정된다. +> +> origin이 지정되지 않은 로컬 저장소의 경우 아래 명령어로 프로젝트에 origin을 추가할 수도 있다. +> ```bash +> git remote add origin <원격 레포 url> +> ``` +> +> 또는 기존에 존재하던 origin이 다른 url을 가리키도록 변경할 수도 있다. +> ```bash +> git remote set-url origin <새로운 원격 리포지토리 url> +> ``` +> +> 변경 사항을 조회하려면 `git remote -v` 명령어를 사용할 수 있다. + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. + +> git reset 명령어는 기본적으로 HEAD를 특정 커밋으로 이동시키는 명령어이다. +> +> ```bash +> git reset [] [] +> ``` +> git reset의 mode 인자에는 세 가지 값이 들어갈 수 있는데, --hard, --soft, --mixed이다. +> 지정되지 않은 경우 기본값으로 --mixed가 적용된다. +> commit 인자는 이동하려는 커밋 식별자(커밋 해쉬, 브랜치, 태그 이름)를 값으로 가진다. 기본값은 HEAD이다. +> +> `--soft`는 HEAD를 지정된 커밋으로 이동시켜 현재 작업중인 커밋을 해당 커밋으로 설정하지만 Staging Area와 Working Directory의 +> 변경사항은 그대로 남는다. 예를 들어, HEAD A라는 시점으로 --soft 모드를 사용하여 이동한 경우 A 이후의 변경 사항이 Staging Area에 올라간 +> 상태가 되고, 그 상태에서 커밋할 경우 A 시점 이후의 커밋들이 하나로 합쳐지게 된다. +> +> `--mixed`는 HEAD와 Staging Area를 지정된 커밋으로 이동시키지만 Working Directory의 변경사항은 그대로 유지된다. 따라서 +> Working Directory의 변경사항은 Unstaged 상태가 된다. +> +> `--hard`는 HEAD와 Staging Area, Working Directory를 모두 지정된 커밋의 상태로 이동시킨다. 로컬에서 지정된 커밋 이후의 +> 모든 변경 사항은 삭제된다. + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. + +> __Pull Request__ 는 하나의 브랜치에 다른 브랜치를 병합(Merge) 하기 위해 요청하는 기능이다. 주로 Github, GitLab등의 서비스에서 제공하는 +> 기능이다. +> +> __Merge__ 는 서로 다른 두개의 브랜치를 합치는 것이다. Fast-Forward Merge, 3-Way Merge라는 병합 방식이 사용된다. +> +> __Fast-Forward__ 는 기존 브랜치보다 병합하려는 브랜치의 커밋이 더 앞서는 경우 사용되는 방식으로, 별도의 병합 커밋이 생성되지 않고 +> 변경 사항이 그대로 브랜치에 적용된다. +> +> 3-Way Merge는 병합하려는 두 브랜치에서 특정 시점 이후로 서로 다른 변경사항이 발생한 경우 사용하는 병합 방식이다. +> 가장 최근의 _공통된_ 커밋을 기준으로 두 브랜치의 변경 사항을 비교하여 병합된 하나의 새로운 커밋을 생성한다. +> 두 브랜치에서 서로 같은 파일의 같은 라인을 다르게 수정했거나, 한 브랜치에서 삭제한 파일을 다른 브랜치에서 수정한 경우에는 충돌이 발생하게 된다. +> +> 충돌이 발생한 경우 git은 병합을 중지하고 개발자에게 수정을 요청한다. Staging 영역에 수정이 완료된 파일을 올리고 commit하면 병합 과정이 완료되고 +> 병합 커밋이 생성된다. + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. + +> __rebase__ 는 한 브랜치의 커밋을 다른 브랜치 위로 적용하는 과정이다. merge의 경우 변경사항이 한 번에 통합되지만, rebase는 +> 변경 사항까지의 커밋 내역이 대상 브랜치의 최신 커밋 위에 순차적으로 적용된다. +> +> a라는 브랜치를 생성하여 로컬에서 작업하던 도중 다른 브랜치인 b에서 변경 내용이 발생했고 a 브랜치에 적용해야 하는 경우, +> rebase 명령어를 통해 로컬의 작업 내용을 유지한 채로 b 브랜치의 커밋을 하나씩 적용할 수 있다. +> +> 위에서 설명한 Merge와 마찬가지로 충돌이 발생할 수 있다. Merge의 경우 두 브랜치를 병합하는 도중 한 번만 충돌이 발생하지만, Rebase의 경우 +> 순차적으로 커밋을 검토하므로 충돌이 여러 번 발생할 수 있다. + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. + +> git stash는 Git에서 제공하는 임시 저장 기능으로, Staging Area와 Working Directory에 저장된 변경 사항을 임시로 저장하고 +> HEAD 상태로 되돌리는 기능이다. +> +> 이 기능은 특정 브랜치에서 작업하던 도중 다른 브랜치로의 전환이 필요한 경우 유용하게 쓰일 수 있다. +> 가령 a 브랜치에서 작업하던 도중 b 브랜치에서 수정해야 할 부분이 생긴 경우, a의 변경 사항을 stash로 임시 저장하고 +> b 브랜치로 이동해서 작업할 수 있다. 작업이 끝나면 a 브랜치에서 stash를 통해 임시 저장된 내용을 복원하여 계속 작업할 수 있다. +> +> git stash : 현재의 변경 사항을 스택에 저장 +> git stash list: 저장된 stash 목록을 보기 +> git stash apply: 가장 최근에 저장된 stash의 변경 사항 적용. 적용된 stash는 스택에서 제거되지 않음 +> git stash pop: 가장 최근에 저장된 stash의 변경 사항을 적용하고 해당 stash를 스택에서 제거 +> git stash drop [stash@{n}]: 지정된 stash를 스택에서 제거 +> git stash clear: 스택에 존재하는 모든 stash 제거 +> git stash branch : 새로운 브랜치를 생성하고 해당 브랜치에 stash의 변경 사항 적용 + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push/pull --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 `parent/child-1`, `parent/child-2`는 가질 수 있지만 `parent`, `parent/child`는 가질 수 없다. 무슨 이유 때문인지. +- 리포지토리의 두 타입인 bare, non-bare + +### ChatGPT를 통해 생성한 답변을 바탕으로 이해한 내용 +> **`git rebase --interactive`:** +> - interactive rebase는 사용자가 커밋의 순서를 변경하거나, 커밋을 합치거나, 커밋을 삭제하거나, +> - 커밋 메시지를 수정하는 등의 작업을 수행할 수 있게 해주는 도구입니다. +> +> **branch의 upstream:** +> - 브랜치의 upstream은 로컬 브랜치가 추적하는 원격 브랜치를 의미합니다. `git push --set-upstream` (또는 `-u` 옵션)을 사용하여 +> 로컬 브랜치와 원격 브랜치 간의 추적 관계를 설정할 수 있습니다. +> +> > 원래라면 자동으로 origin/branch-1이라는 원격 브랜치와 branch-1이라는 로컬 브랜치가 연결되어 있지만, 자동으로 연결된 브랜치 외의 +> > 다른 브랜치로 변경 사항을 커밋하고 싶다면 upstream을 변경하면 되는 것 같다. 근데 안써봐서 와닿지는 않는다. +> +> **Fork와 PR:** +> - Fork는 다른 사람의 리포지토리를 자신의 계정으로 복사하는 것을 의미합니다. Fork는 원본 리포지토리에 직접적인 변경 권한이 없을 때 유용하며, +> - Fork한 리포지토리에서 변경 사항을 만든 후 원본 리포지토리에 Pull Request를 통해 변경 사항을 제안할 수 있습니다. +> +> > push/merge 권한이 없는 제 3자가 자신의 계정으로 레포를 복제하여 +> > 개발을 이어나갈 수 있도록 하는 중요한 기능이라고 알고 있다. +> +> **`git fetch` vs `git pull`:** +> - `git fetch`는 원격 리포지토리의 변경 사항을 로컬로 가져오지만 자동으로 병합하지 않습니다. +> > 궁금해서 찾아본 결과, git fetch로 가져온 변경 사항은 Staging area나 Working directory에는 영향을 주지 않고 +> > 로컬 레포의 원격 브랜치 참조에 저장된다고 한다. +> +> > 원격 브랜치 참조는 원격 레포의 상태를 로컬에서 추적하기 위해 있는 포인터라고 하는데 써본적이 없어서 왜 있는지 와닿지는 않는다. +> +> - `git pull`은 `git fetch`와 `git merge`의 조합으로, 원격 리포지토리의 변경 사항을 가져와서 자동으로 현재 브랜치에 병합합니다. +> - `git fetch`는 원격 변경 사항을 확인하고 싶지만 아직 병합하고 싶지 않을 때 사용됩니다. +> +> **`reset --hard`와 `push/pull --force`:** +> - `git reset --hard`는 HEAD, Staging Area, Working Directory를 특정 커밋 상태로 되돌립니다. +> - `--force` 옵션은 Git의 안전 장치를 무시하고 강제로 push나 pull을 수행합니다. 주의해서 사용해야 합니다. +> +> > `git reset --hard`는 특정 시점 이후의 모든 것이 완전히 잘못돼서 정말 복구할 수 없게 됐을 때 써본 경험이 있다. +> > 특정 커밋 이후의 모든 변경 사항이 사라지므로 주의해서 사용해야 한다는 것은 이미 알고 있었다. +> +> **`.gitignore`:** +> - `.gitignore` 파일은 Git이 추적하지 않아야 할 파일 또는 디렉토리 패턴을 지정하는 데 사용됩니다. +> +> > 변경 사항이 있는 모든 파일을 스테이징 영역에 추가하는 git add -A를 실행하더라도, .gitignore에 존재하는 패턴을 갖는 파일 또는 디렉터리는 +> > 스테이징 영역에 추가되지 않는다. +> +> > node로 채팅봇을 개발하던 도중 .gitignore에 node_modules 폴더를 깜빡하고 추가를 안 한 채로 모든 파일을 스테이징 영역에 추가한 후 +> > 커밋했다가 변경 사항에 파일 수백개가 있었던 경험이 있었다. 끔찍했다. +> +> **브랜치 이름 제한:** +> - `parent/child-1`와 같은 브랜치 이름은 가능하지만, `parent`와 `parent/child`를 동시에 가지는 것은 불가능합니다. +> - 이는 `parent`가 파일로도, 디렉토리로도 해석될 수 있기 때문에 혼란을 초래할 수 있습니다. +> +> **리포지토리의 두 타입: bare, non-bare:** +> - **bare 리포지토리**: 워킹 디렉토리가 없는 Git 리포지토리. 주로 서버에서 사용됩니다. +> - **non-bare 리포지토리**: 워킹 디렉토리가 있는 일반적인 Git 리포지토리. 개발자들이 일반적으로 사용하는 리포지토리 형태입니다. + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From 0ff3ace233011fddff3a6e21cf4c138580b32cca Mon Sep 17 00:00:00 2001 From: junhyeong Park <64734115+pnu201924480@users.noreply.github.com> Date: Mon, 14 Aug 2023 00:07:05 +0900 Subject: [PATCH 17/73] Step 1 parkjunhyeong (#18) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 새로 구현한 기능 및 주요 변경점 # 버그 해결 💊 해결한 버그 # 리팩토링 🛠 리팩토링 내역 # 스크린샷 🖼 변경된 부분에 대한 스크린샷 # 비고 ✏ 리뷰어에게 전하는 말 등
사용하지 않은 항목은 모두 지워주세요. --- git-basics/README-parkjunhyeong.md | 141 +++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 git-basics/README-parkjunhyeong.md diff --git a/git-basics/README-parkjunhyeong.md b/git-basics/README-parkjunhyeong.md new file mode 100644 index 0000000..ff53d69 --- /dev/null +++ b/git-basics/README-parkjunhyeong.md @@ -0,0 +1,141 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. + +# git +git은 본인의 코드와 그 수정내역을 기록하고 관리하도록 돕는 버전 관리 프로그램이다 로컬에서 프로젝트의 기록을 스스로 +관리할 수 있도록 해준다 git을 통해 브랜치를 생성하고 이전 브랜치로 복구, 삭제 병합이 가능하다 하지만 +로컬 저장소를 사용하기 때문에 다른 개발자와 실시간으로 작업을 공유할 수 없다 + +# git hub +gihub는 git 저장소를 관리하는 클라우드 기반 호스팅 서비스이다 git 저장소 호스팅 서비스는 클라우드 기반으로 다른 +사람과 소스코드 공규가 가능하며 git의 기본적인 기능을 확장하여 제공한다. +github같은 클라우드에 저장하는 git을 remote git이라고 부른다. + + + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. + +## git 동작 + +working directory는 작업 공간으로 아직 git에 기록될 준비가 되지 않은 파일들이 위치하는 공간
+Staging Area는 대기 공간으로 Git에 기록될 준비가 된 파일들이 위치하는 공간
+Logal Repository는 .git폴더이다.
+Remote Repository는 원격 저장소이다 github라고 생각하면 된다.
+git add를 하면 Staging Area에 올라간다. 여기서 git commit을 하면 Local Repository에 저장된다 commit만 하면 자신의 컴퓨터 자체에만 기록되고 Remote Repository에는 저장이 안된다
+push를 해주면 Remote Repository에 저장이 된다.
+ + + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + +**브랜치란** 독립적으로 어떤 작업을 진행하기 위한 개념 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행할 수 있다. +여러명이 동식에 작업을 할 때 다른 사람의 작업에 영향을 주거나 받지 않도록, 메인 브랜치에서 자신의 작업 전용 브랜치를 만들고 각자 작업을 진행한 후 작업이 끝난 사람은 메인 브랜치에 자신의 브랜치의 변경 사항을 적용한다. +**HEAD란** 해당 브랜치의 마지막 커밋을 뜻한다. +``` +git checkout -b test 는 test 브랜치를 생성후 바로 test브랜치로 이동 +git checkout main은 main브랜치로 이동하고 +git branch -d test를 하면 test 브랜치를 삭제한다. +``` + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +**git init**을 하면 .git이라는 하위 디렉토리를 해당 디렉토리 위치에 만든다. +init은 아직 버전관리를 하지 않은 로컬 디렉토리 하나를 선택해서 Git저장소를 적용하는 방법이다 +`사용법 : git init` +**git clone**이란 이미 만들어진 git 저장소를 복사하고 싶을 때 사용한다 저장소로 부터 프로젝트를 복제한다. +`사용법 : git clone <저장소 위치>` + +**origin**이란 원격 저장소의 이름을 뜻한다. +`git remote add origin <주소>` + + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. + +## git reset +**git reset**은 과거의 commit으로 돌아가고 이후의 커밋은 삭제하는 명령어 이다.
+`git reset-hard : 해당 커밋ID의 상태로 이동하고, Working Directory와 index영역 모두 초기화`
+`git reset-mixed : 해당 커밋ID의 상태로 이동하고, Index영역은 초기화되고 Working Directory는 변경되지 않음`
+`gir reset-soft : 해당 커밋ID의 상태로 이동하고 Index영역과 Working Directory 모두 변경되지 않고 commit된 파일들을 staging area로 돌려놓는다.`
+ +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. + +**pull request**는 저장소를 fork한 뒤, 포크한 저장소에서 변경 사항을 가지고 원래 저장소의 소유자에게 병합 해달라고 요청하는 것이다. + +여기서 fork는 다른 사람의 깃허브 저장소에서 내 깃허브 저장소로 그대로 복제하는 기능이다. +fork한 저장소는 원본 저장소와 연결되어 있다. 연결 되어 있다는 의미는 original repository에서 새로운 commit이 생기면 이는 그대로 forked된 repository로 반영할 수 있다. 이 때 fetch나 rebase의 과정이 필요하다. + +**Merge**란 git branch를 다른 branch로 합치는 과정이다.
+### Fast Forward Merge +커밋이 생기지 않고 현재 브랜치의 HEAD가 대상 브랜치의 HEAD까지로 옮기는 merge이다 +어떤 경우에 사용 할까? +예로 들자면 master vranch에서 새로운 브랜치 하나를 생성 한 후에 master branch는 더이상 커밋하지 않고, 생성된 +브랜치에서만 커밋을 하는경우 merge하면 master브랜치의 Head가 새로운 브랜치 Head commit 이후로 이동된다. + +### 3 way merge +병합하려는 두개의 브랜치의 공통 조상을 base로 두고 base와 다른 두개를 비교하며 충돌하거나 병합 시켜준다. + +![스크린샷 2023-08-13 012841](https://github.com/ApptiveDev/study-git/assets/64734115/e914759d-155a-43d8-ba54-1126b10cb266) + +1. 위 사진에서 Base를 기준으로 Me와 other을 비교한다 A는 Me와 base가 같으므로 수정된 Other을 사용해서 자동으로 삭제 시켜주고 +2. B는 셋다 같으므로 B +3. C는 Me와 other,base다 다르므로 충돌 +4. D는 Base와 Other이 같고 Me에서만 다르므로 병합할 때 D코드는 삭제한다 + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. + +**rebase**란 말 그대로 재설정한다는 의미로, 하나의 브랜치가 다른 브랜치에서 파생되서 나온 경우, 다른 브랜치에서 진행된 커밋을 다시 가져와서 base를 재설정하는 것이다. 새로운 커밋을 기반으로 작업을 함으로써 파생된 브랜치는 병합시에 conflict없이 자신의 브랜치에 진행된 커밋을 반영할 수 있다. +### rebase의 장점 + 커밋 히스토리가 시간순서대로 반영되어 시간순서대로 관리하거나 merge를 통해 발생하는 불필요한 병합 커밋을 제거할 때 사용하면 좋다. + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. + +### stash란 +자신이 어떤 작업을 하던 중에 다른 요청이 들어와서 하던 작업이 완료되지 않앗지만 잠시 멈추고 다른 브랜치로 변경할 일이 있으면 완료되지 않은 일을 commit하기엔 껄끄러울 때 잠시 스택에 저장할 수 있도록 하는 명령어이다.
+`git stash 또는 `
+`git stash save를 하면 된다.`
+`git stash list를 하면 stash 목록을 확인할 수 있다.`
+`git stash apply를 가장 최근의 stash를 가져와 적용한다.`
+`git stash apply [stash 이름] 해당 stash를 적용한다.`
+`git stash drop 가장 최근의 stash를 제거한다.`
+`git stash drop [stash 이름] 해당 stash를 제거한다.`
+ +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push/pull --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From 8bd92a3baa84ea75790aaac8cd6cf5dae9b5a8e3 Mon Sep 17 00:00:00 2001 From: k-kmw <100478309+k-kmw@users.noreply.github.com> Date: Mon, 14 Aug 2023 00:27:50 +0900 Subject: [PATCH 18/73] =?UTF-8?q?Step=201=20=EA=B9=80=EB=AF=BC=EC=9A=B1=20?= =?UTF-8?q?(#17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit step-1 셀프 스터디 Co-authored-by: Cotidie --- ...E-\352\271\200\353\257\274\354\232\261.md" | 278 ++++++++++++++++++ git-basics/images/image-1.png | Bin 0 -> 17286 bytes git-basics/images/image-2.png | Bin 0 -> 4933 bytes git-basics/images/image-3.png | Bin 0 -> 22199 bytes git-basics/images/image-4.png | Bin 0 -> 25570 bytes git-basics/images/image.png | Bin 0 -> 17211 bytes 6 files changed, 278 insertions(+) create mode 100644 "git-basics/README-\352\271\200\353\257\274\354\232\261.md" create mode 100644 git-basics/images/image-1.png create mode 100644 git-basics/images/image-2.png create mode 100644 git-basics/images/image-3.png create mode 100644 git-basics/images/image-4.png create mode 100644 git-basics/images/image.png diff --git "a/git-basics/README-\352\271\200\353\257\274\354\232\261.md" "b/git-basics/README-\352\271\200\353\257\274\354\232\261.md" new file mode 100644 index 0000000..86154ff --- /dev/null +++ "b/git-basics/README-\352\271\200\353\257\274\354\232\261.md" @@ -0,0 +1,278 @@ +# Git 기초 + +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github + +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. + +**개인 컴퓨터에서 사용하는 git을 local git이라 부르며, github나 gitlab과 같은 클라우드에 저장하는 git을 remote git이라고 한다.** + +### Git + +git은 본인의 코드와 수정내역을 기록하고 관리하는 버전 관리 프로그램으로 로컬에서 프로젝트의 기록을 스스로 관리할 수 있도록 해줌
+git을 통해 브랜치 생성, 삭제, 복구, 병합이 가능하지만 로컬 저장소를 사용하기 때문에 협업시 사용이 불가능함 + +### GitHub + +github는 git저장소를 관리하는 호스팅 서비스로 다른 사람과 소스코드 공유가 가능하며 한 프로젝트에 여러 명의 사람이 참여하여 버전 제어 및 공동 작업이 가능하다.
즉, git으로 관리하는 프로젝트를 올려둘 수 있는 사이트로 github외 gitlab, bitbucket 등 여러가지 사이트가 있다. + +## Git Workflow + +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. + +### Working Directory + +사용자의 현재 작업 공간으로 실제 파일을 수정하거나 생성하는 공간 + +- 2가지 상태 + +1. untracked - 아직 tracking이 되지 않은 파일 : 새로 생성한 파일이거나 변경된 상태가 없는 파일 +2. tracked - unmodified/modified로 나눌 수 있음 : modified는 수정사항이 있지만 스테이지 영역으로 옮겨지지 않은 파일로 modified된 파일만 스테이징 영역으로 갈 수 있다. + +### Git Add + +Working Directory상의 변경 내용을 스테이징 영역에 추가한다. + +### Git Commit + +현재 버전의 코드(스테이징 되어 있는)를 로컬 저장소에 기록한다. + +### Git Push + +로컬 저장소에 저장된 변경 이력을 원격 저장소에 반영한다. + +## Branch, HEAD + +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + +### Commit + +git에서 commit은 프로젝트의 현재 스테이징된 변경 사항의 스냅샷을 캡처한 것이다. + +### branch + +branch는 독립적으로 특정 작업을 진행하기 위해 하나의 버전에서 분기되어 생성된 것으로 여러 작업을 동시에 진행 할 수 있게 한다. + +- branch 생성 + git branch [branch 이름] + git checkout -b [branch 이름] +- branch 삭제 + git branch -d [branch 이름] +- branch 이동 + git checkout [branch 이름] + +### HEAD + +모든 branch에는 HEAD가 존재하는데, HEAD는 해당 브랜치의 마지막 commit을 가리킨다. + +## clone, init, origin + +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. + +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +
+ +**git 저장소 생성 방법에는 git init과 git clone이 있음** + +### git init + +현재 디렉토리를 git local 저장소로 설정하는 명령어
+local -> remote 방향
+이용 방법: git으로 관리하기를 원하는 디렉토리에서 $git init + +### git clone + +이미 만들어진 remote 저장소를 들고오는 명령어
+remote -> local로 git repository를 복제해온다.
+이용 방법: $git clone [로컬 저장소 경로] + +### origin + +origin은 원격 저장소의 경로 이름을 의미한다.
+git remote add origin [url]형식으로 원격 저장소를 추가하거나
+git clone을 통해 원격저장소를 복사하면 자동으로 origin이라는 이름의 원격 저장소가 등록된다. + +## reset + +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. + +**사용법: $ git reset [commitId]** + +### --hard + +해당 commitId의 상태로 이동하고, **Working Directory와 스테이징 영역을 모두 초기화**한다. 해당 commitId 이후의 모든 내용을 지운다. + +### --mixed + +해당 commitId의 상태로 이동하고, **스테이징 영역은 초기화되고 Working Directory는 변경되지 않는다.** 즉 **git add가 실행되기 직전의 상태**로 돌아간다. + +### --soft + +해당 commitId의 상태로 이동하고, **스테이징 영역과 Working Directory모두 변경되지 않는다.** 즉 **git add가 실행된 직후의 상태**로 돌아간다. + +## Pull Request, Merge + +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. + +### Pull Request + +Pull Request란 다른 사용자가 작성한 저장소에서 변경 사항을 병합(merge)하기 위한 요청을 의미한다. + +Pull Request는 다음과 같은 기능을 제공한다. + +- 원본 저장소 소유자에게 코드 변경 사항을 알린다. +- 변경 사항의 리뷰를 받는다. +- 코드 변경 사항이 다른 사람들과 공유될 수 있다. + +### Merge + +git branch를 다른 branch로 합치는 과정이다. + +1. Fast Foward Merge
+ 가장 기본적인 merge로 현재 branch의 HEAD를 대상 branch의 HEAD까지 옮기는 merge이다.
+ 사용 방법:
+ git switch [현재 branch]
+ git merge [대상 branch] + ![Alt text](images/image.png) + 사진의 bugfix 브랜치의 이력은 master branch의 이력을 모두 포함하고 있기 때문에 master branch 상태가 변경되어 있지 않으면 master branch는 단순히 이동하기만 해도 bugfix branch의 내용을 적용할 수 있다. + ![Alt text](images/image-1.png) + + 하지만 bugfix branch로 분기한 후에 master branch에 여러 변경 사항이 적용되는 경우 master branch의 변경 내용과 bugfix branch의 변경 내용을 하나로 통합해야 한다. + ![Alt text](images/image-3.png) + 따라서 양쪽의 변경을 가져온 merge commit을 실행하게 된다. (이게 3-Way-Merge로 진행되는 것인가...?) + ![Alt text](images/image-4.png) + + 만약 두 branch가 같은 부분을 수정했다면 conflict가 생기게 되는데
+ ![Alt text](images/image-2.png)
+ conflict를 해결하기 위해 변경 사항을 잘 반영해서 commit을 해주어야 한다. + +2. 3-Way Merge
+ merge할 때 각 branch의 마지막 commit과 branch의 공통 조상(base) commit 총 3개의 commit을 비교하여 새로운 commit을 만들어 병합을 수행한다.
+ 하나의 branch와 다른 branch의 모든 변경 이력을 합치는 방식으로 진행된다.
+ base를 기준으로 변경사항이 있는 파일들을 merge commit에 반영한다. 만약 두 commit 모두에서 변경사항이 발생하여 충돌이 발생하면 충돌을 해결한 후 commit 해주면 된다. + +## rebase + +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. + +Git에서 한 branch에서 다른 branch로 합치는 방법은 Merge와 Rebase가 있다.
+Rebase는 두 개의 공통 base를 가진 branch에서 한 branch의 base를 다른 branch의 최신 commit으로 base를 옮기는 작업이다.
+Merge와 Rebase의 실행 결과는 같지만 commit 히스토리가 달라진다.
+Merge는 쉽고 안전하지만 commit 히스토리가 지저분할 수 있다. Rebase를 사용하면 commit 히스토리를 깔끔하게 관리할 수 있다. 특히 분기한 branch가 많을수록 commit 히스토리를 심플하게 유지하여 commit 추적을 용이하게 한다.
+ +Rebase의 위험성 +사람들이 사용하고 있는 commit을 Rebase하면 문제가 생긴다.
+push하기 전에 로컬에서만 rebase를 사용하자. + +## stash + +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. + +**하던 작업을 스택에 임시로 저장하고 나중에 다시 꺼내올 수 있다.** + +어떤 작업을 하던 중 다른 요청이 들어와 작업을 멈추고 브랜치를 변경해야 하는데 아직 완료되지 않은 경우 commit을 하지 않고 stash를 사용할 수 있다. (checkout을 하기전에 꼭 commit을 해야하기 때문)
+ +사용 방법 + +- $ git stash: 변경 내용 임시 저장하기 +- $ git stash list: stash한 list 보기 +- $ git stash apply: 가장 최근 stash 가지고 오기 +- $ git stash apply [stash 이름]: 특정 stash 가지고 오기 +- $ git stash drop: 가장 최근 stash 지우기 +- $ git stash drop [stash 이름]: 특정 stash 지우기 +- $ git stash clear: stash 모두 지우기 +- $ git stash pop: 가장 최근 stash를 적용하고 동시에 stack에서 지우기 (apply + drop) +- $ git stash pop [stash 이름]: 특정 stash를 적용하고 동시에 stack에서 지우기 (apply + drop) +- $ git stash save [stash 이름]: stash 이름 지정하여 저장하기 + +## Advanced + +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. + +- `git rebase --interactive`란?
+ + 불필요한 commit 이력을 제거하여 commit 추적을 용이하게 한다.
+ +- branch의 upstream이란? (`git push --set-upstream`)
+ + upstream은 local 저장소와 연결된 remote 저장소를 의미한다.
+ $ git push --set-upstream A B: 로컬 A 저장소의 원격 저장소를 B로 지정하여 B에 push + +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지.
+ + fork를 하면 원본 저장소의 복사본이 만들어지고 복사본에서 작업을 하기 때문에 branch를 새로 만들지 않고 master에서 작업이 가능하다.
+ 원본 저장소에 변경분을 반영하기 위해 PR을 요청하고 승인되면 원본 저장소에 기여자로 등록된다.
+ +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지
+ + fetch는 원격 저장소에 변경사항이 있는지 확인만 하고 변경된 데이터를 로컬로 가져오지 않음 - 원격 저장소에서 commit된 코드를 임시 branch로 모두 내려받은 후 해당 branch로 checkout하여 변경된 내용을 확인, Working Directory에 변화X
+ pull은 원격 저장소에서 변경된 메타데이터 정보 확인과 최신 데이터를 복사하여 로컬로 가져옴. (fetch + merge)
+ +- `reset --hard`와 `push/pull --force`의 적절한 사용법
+ + **push -f**
+ 원격 저장소의 내용을 로컬 저장소의 내용과 일치하도록 강제로 덮어쓴다. 원격 저장소에 저장된 commit 내용 중 일부가 유실될 수 있음.
+ 적절한 사용법 + + - 덮어쓰기 하려는 변경사항을 현재 사용자 외에 다른 사람들이 pull하지 않은 경우
+ - push -f를 수행한 이후, 모든 사용자로 하여금 pull하여 변경 사항을 새로운 버전으로 재적용하기로 합의가 된 경우
+ - -force-with-lease 옵션 사용 : 덮어쓰기 하기 전 수정사항이 없을 때만 덮어쓰기가 수행된다.
+ + **pull -f**
+ 로컬 branch의 변경 사항을 무시하고 원격 저장소의 최신 변경사항으로 로컬 branch를 강제로 업데이트하는데 사용
+ + **reset --hard를 사용하여 덮어쓰기와 같은 효과를 만들 수 있다**
+ + 1. git fetch --all : git pull 받을 목록을 저장소에서 업데이트
+ 2. git reset --hard origin/[작업중인 branch 이름]: git reset --hard로 head를 최신 버전으로 가리킨다
+ 3. git pull
+ +
+ +- `.gitignore` 사용법
+ + git에 추가되지 말아야 할 파일을 정의한다.
+ [folder name]/ : 특정 폴더에 있는 전체 파일 무시
+ \*.[확장자] : 특정 확장자 전체 무시
+ [디렉터리명]/[파일명] : 특정 파일 무시
+ +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지.
+ + git은 파일시스템과 유사한 계층 구조를 가지고 있다.
+ branch는 파일로 존재하는데, 만약 parent/child인 branch가 있고, parent인 brach를 생성하려고 한다면 parent라는 파일이 생성되어야 하는데 디렉토리 이름과 겹치기 때문에 생성할 수 없다. + +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지 + **detached HEAD**
+ https://devcamus.tistory.com/6 - 그림으로 이해하기 쉬운 설명이 있어서 참조하였습니다.
+ head가 branch로부터 떨어져 있는 상태를 뜻한다. branch를 통해서가 아니라 head가 직접 commit을 참조하고 있는 상태.
+ (보통 attacehd 상태이면 head -> branch -> commit의 참조 순서를 가진다.)
+ git checkout [revision number]명령어를 사용해, 특정 commit으로 checkout하여 head가 변경된 경우 detached head 상태가 된다.
+ + **detached HEAD상태에서 commit**
+ detached HEAD 상태에서 commit을 하면 어떤 branch도 commit을 가리키지 않으므로 branch로부터 분리된 상태로 남게된다.
+ 이 commit에 접근하기 위해서 git branch -f [branch 명] HEAD 와 같이 branch를 HEAD가 가리키는 commit으로 강제 이동시키고 git checkout [branch 명]을 하여 head가 해당 branch를 참조하게끔 checkout 해주면 된다.
+ 즉, 핵심은 head -> branch -> commit의 참조 순서를 만들어주면 된다!
+ +## Questions + +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. + +git에 대해 잘 모르고 있다는 것을 느낄 수 있었다.
+특히 Rebase부분은 아직 잘 이해가 안된 것 같다. 스터디를 진행하면서 더 이해를 해봐야겠다. diff --git a/git-basics/images/image-1.png b/git-basics/images/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..6c55a1d998072d3a631605e3ad592352e382f8da GIT binary patch literal 17286 zcmdVCbx>SU*XA1tE+IgG;DJUGoZxhDX&i#P256k%PH+p2OK=J9?w&w!m*DR1&K&Z7 zU)9Xiy?@Qrt-4(WG{vF&oPG9Md#&gB?G90pgJ7Z&p}lzV0#i~#RPn_N_ygd1GYS&$ zec&vT1o#1GuLu!-Q94Aj1N?$uDkLlP;zdOS`n>@n@H?ulgogc#7q7aWzuzZ^-g9fNeNXz%Wu4C!`0FW; z4LOm^56HGa~nV#QMhD*^uW$nn^^!&qqWh7(r?Oy`0_u$%~v3vK0^8B;F3$D^A^KPB^AS z&BDgV{_4?ofgYx^aXbB1sc9J0R=d!t*qn;K{I(u95}hupHY-!EA>-IuAT--=e7Eor z{?X(ynU0r1+HkNTVgEgmz?FyReKF+ue65R#ab_Vs;$QUhmFP6FBwhOr%yyYL4GM&A zgTOgUB;;hIk*sGa1@|5=sYe84;2%1v*jdCWeWR&(a42>;CBrqDAH6zOjUGWsy??eN ztFKgd8`KPjT54ORc1SH*w~P`nFr0T9w&cF)NEIweYxF`0I> z+B6~d% z%gK2)c{Y_+v?+Y@O}p4z)_hjJ@6UF|#dha%YWkNRbB(C`@-ICHk?-wCgPlE|??3){ zmcP?E3f8NuKadT9IQtrANhP(4i$4hDE>WCu4ZO^Ogq~cYTayzH7at?Vl82jG-@GpS}chB*w z&lWZf6V54<&Y?uS%)3UVwmyX01avp3SAPNrXltgQg9%#U@~IkhoYCl&yNP(_8ix@f zmxdOzt)3afJ(kU75%7__JriB_<$V_o;~_E8&bT=r(+fAGex2F3y_CgD1|0wa?y5B>kmMp4@gIVfpm)02H2oxrh zGK;eDA zKX`*^b@Wzn5$j4=)E&AdFn0H+g7GX!L5Ja z6)-=)#K>y;jpr(KZ)rj-PgWn!75#?S(B+ zG@-T9_eK>VoR#Huo*_fr9OJ=s3H21;?~;z$I9^aVP}D;ZsHJ3kQ1=>!I8mDAl+;4L z{IcX6mNar{L}gEk^vpa|Y1tP3M*eYy>(hI=PCwjgDKExsqwF#82;Cj?(}*^ES|av1}`@KmV2gSyR_Z@`L-TcIA_VtMV!+e#aH= zPRi?DPWX`q-w|8a{nNdF(?$ID`)U|(-Z;B+!k@ph3wGDL5k1TbCso<dw{tC2rZ|3K8Tub#g}G=mFLm5{q9jV5U@nL1XP^U~a%9o{zKzAS0J`GyKnD>jwc zG=f*R6^wmDwU`aZJYc+wp-C;3d}%frZ_UK*tN>Sbz|9EEcuGj0SD}?cmC)q9#{t<6 zndQf;lr6F;3H_Hpo3Fu+AEPY5GD`|Ur9rlQz^E%o3aDI2^C+EJJP_`m5viOfmRlY~ zK@#iohL%rSJ5{`?aj8vXA%yU=9aw|45e0J<(^6k(W@8T#Pe&y&)DEc~hW9oBW{GlS|J)0+^E7yI~itwS#;F(?JE>Ft~V!~8@dQx;@ z;=uqzCFcqZ%qtB@>bSpZu7~E5S%*X7k9W34=O8Dp8k?DuH+vN2LbyY1g;PenE8UI` zRGQ7@+YZL3d9>jlNQn-n9Z3&p&a)SSfUNjO>C+gQef_=}rrI_w^7#v+lbr|pC+$-l zr-lO~WCV(8u4aebIlCOQ^ag=qy)bj0VmVKl+I0^RMM||jPv?8?(FLQI6La$ z6+(f(_oeRrOqH&2g|)fF|8>@PYkK%ezCrnlxFpS}>>C*UQC%Aneu?EQX|~p+IO!zA zjHXbaXUz1%Y14bIdFt2M2#sIpLw}yPo@oP^>&fnRJ@n{@{gF`WClTN#tfP{l9x$if z#s@OHV}R%q`(q9htaz4^Ca^x?317zLJ~RfGx2~mdm=9C5h%gduD`idfHJ%UmcMp`Q z>#Z!F^m!+A(bU(S$7(>fRejAqZsRT`oi*{6j$#=R4SJ(YAxk~UIrG=J_ZtaUeKFq6 zwu3Al$)o+{oF0Km-5P*po$PMZsq zVTQ@Ek`sedhY%Q9wspFh;yr2J-`pZ>BT3Q6kWU48LG9buNIg|4N$?I!wvou#Uo~1hMhMLXhJ3&! zl0QeIV`dV}9toVER^Zx!aFvi#`cU1fwMI80plw>vPeOO#(y|)J9Dx&}}E zTj*f4?Mm=y_zaydCed9NG&H3%StCb)Lcr_m(~|uQ^u=W*q)ONyIvU1 zY#Ab3Nri1$@kZCl2p~t3ZoS$AYs>neKbBOPJjGXB%fpBRj1Vc6<@*8xI3>fy& z)oXQO@GQ=(JAF>YSv0E1Pysnq+U4fFZX=JJ|9u()bd;!%&Ewzp*H- z&OvV_O9>cPO$XrefQBKbs!SEa+c<7O)@35IZ46l;RWRuJ^M@06vjRlz7Mj|9epXnU z&HJ}2^)v3h=^pTgFFB?9!rPQMjUQ@(m2P?}wg4$8b!$}SsIOj_SWQB3{ijyB_phJ5 zY|yZd1`Z{6jKvQ`#Hl2ktXVi#y#LboDv-XzW3^2UjZA9o8zE(mUn*-C?F#m|Ef#PO zKyo44pdHraZkxANL4!8>GYFu4nUL_NA&^!m!?kFP;?1xs@1@TeY}#OoS!RJ3+L$NOrQx5EN=_Wd*%E} ztnUs$U<$(uJl@Qu!DrgerD*S<_a<+L$KQ`kid1N#u<23(D1DqoZ zmrO^U{4V0RZ+5mwqY57rg7#L&T;uJY!z%JZQh7dM+(kH{yrj@-i>iV%6MXnb0uO$s z7@ga|xg11vh>l6!Fv8YW&Mnuv@IsLrSgT4)PWe$-VAdU3-%TdVDB!ZbDft0*MnVt+ z6x-NumdpP;E}cXd>^CDEI>-v+zU_VyA29h_voBw5c&LdgR?qLULC!%!fsk2tUA6Zl zX}5Y*p2oUj`&WKlaAzqZC~Huotz?Ctr&8kRj_`J4Bhmgh`?q!mn}7SHZPox6ugN zwX|K-@1S42Xkfe}j!v+hj>U{0F!tfO(&c%u`d~F%q-0{bH{SMBfZ6H%xiCFN0799K zgSpQDH?8~zGb8+k(OYu5TMLc&>)sPdmT!b}v~+2coCu$2!Iw_Bhfh$&*L8T)Z6CvSd z(c*L|zb-ZIg_}Z)?~kA3B~B0f!KzgP+BPj4`JJ1H;HNQz!g;cS*yv(Ir#z$O-uJVp zP3S0_k&=_42cb~81*?b7%NqX9er??3Me>T};G=vc>t0=M0OKjsmbqRufxOpvFVJGsol$myra@EG`=bE``v3B3#`T#^*4-+#2?cqLb*EY=s%Hf?fnuq zy*hp%>FDK^VyAl7$IA=1MYG7tt9Dm;Gwt&r`Z zxE2*;lKSvoX!7>-AzeI27n?^aN~G{&L^AY|s0ch7NSt#}B4Qw^$?Rz^zImD20nB!t z_x@BeC_Fk3%@eihBv=;E{*DP)abgJ$d0JV|_NLEe!c6%mE5^T(CqH$!2k~d%!al1} z2^6b*ZQ3FsaFAU{aEvn3>G_cQe(gizwC=Q*=Frq(JRl9k%-VJO;rwLT5h^)<)`nc8 zdxYKH223O)7W3E0byRA-sCww1blhivvXkko%G56^BEM9(@F_fnHFKecix7^P>683N zqdG|kXuM;rHIn*u$nJG+ao!h;p(Ats^nOai;skYTVJ~6POw?m+pdz)WQBN;%{Y=!z zB&T^~+foj#%{)s!6FUd}n0$XXsuaGB%$hCB`$R zeS0{%yUqc5EcM2l>IT(WT0(y!1s<$F4_aL4=$5Ge)iYXG$^F_Z^Ie9Y5q1_k@G*BdNxE)k%!krpi*!1P-*@k|2|`|BIPT7d zuuZnbpVct`2peXLnUa68XrLK)YPMk0zJyiQ|4-FR+o%Z0=k(7#jTf;4O7fDdSFf(r zBe*li(nuOK6|<*y4f(!rbg>SsiOaLmw7nFF-_)nq@u(Se<+WJ0wI!mvgoz7zW@OJAv! zlo}P2Ii*RY!rmKX8bgZ^bnng%P8{HN=YicGnO05Hp57FX@bwrE81m0pu z$My&UB=c9`rn!2LtN&T=;=AISI+@|7&9t$Th0j)({0Q|ZGtmzmRzSHTSx5FSi#Lm* z9@L`OxUYY?uvc8PQxJy);Wwi=`bHozREz4rx(AjIY2jaXd#swf3XB387t*Oq5mF6j zhQn-IX{0ko!uIR6DP_{SowU_C&z%yKmC+muahC?vwKrVN)Om$ZB3h=OSTC{BH7Y2^ zH-U7oIf0bA5q?QTDQJPWxKLm&P};JsmV70@C(@>?K9WS*Br=ujEu=^pHqh{v^@z*^ zSZcCvG$%%0y*&%&3(JW5DWn z-^5DQKWYAT6YU#l2%@|9=n>e(xLihP5gcIO(lMWK3&9+oBs|G)!Nq2zet39LR8j(M z4W-6hUOEwy>0V1L(YcotEPwmmE#tC!@2H6~VAo@)BEwnOBQ9CPJgn}j7k3&Ah-kTc)Fhi( z*bn=nqS6|!t_>vIwt|b^PoBVnAZ%!uWx3d_LFTqiu?M^vxipma6lriFVMC9pPZeI z6Z6xaI{j1htJn2uZVB41#Tu>_-KqK0?rb8j{%QVM)W{%wwNmX5JUl!&`1mHI)Tg>B z<8spYTYz~mI81EQOwr_gRC~xMV{2P(y+DqKmy=CpWMo9m!lH0{cbC)BqGQ^TO+-dS zR2ad<&Mu*%5(k6)G7+s`u^3&1x3aQQR8ym6WMp(>;N#QLBX5EkuFC4^rB6&vN!i<1 zc`d{dD}v;yOWn*%MVH#I&u%Z;2Dh`1JBUW(xu0ZR)nOw=xqEximu+qoZ_RTq+?`^ zlTKjLxWcF5<<*=j(__}Evz|N-v$~%y*2wnZVPcY_1c8jlb7d>tF3d{;gZ%v^WM#v> z4gxWWzx2RJZ!cUde~02lr=%47v^F(qwOy7r9ggXUqobo!b8)Gio}RL|gA(&{a(0Za z2|YYLFKSL|-ZlkqExK-{Y6kR7zq<#uukG2wRah_ZV%|$iO5RqjftWt-r(02wd0iXq zv1RSdkUgsnTqI6#;UOWTk!k7aWdsNt8yjvOlZ7gkR&$&swrkvU8!oS`fBg7CbUYfQ ztD*4$8H;QJ9km(1^;KO~7Ue@Q-A#c~-umkAuvz#j`z^WNzP>SYFC(MuAqWJot+iE` z{?6q9Lhh+dzvCi1ub{Kk>e)2!b$38Ca^i`GhIa0oSy!i~hfIJb8W#S~K;q{_=|`Dz zzdDSoTk_Hp;T67^EK=JTs1@DTTkB3 zS}T06qwUns8;zlr?_(SO1RCbQD{i&c(D;!8c9s)yH#N;m;jtGl+CbSjUI`-aYxTTa zpH$PEOh+wY$-mAnL9!(mz|}pAQ`3#2S1aBAn)UnFzcr4WxH{(@3rKq{u-#g%O-oDb z0_4j9&oirh%tLpSA9^%fBTeSA42Lwc;{k?FQP=um%HHlhS}dA|iaP z$Z5#X5Fs%#Jg=rQvN*T%ChuLP^fA@9)x+<~*Lc2-z#iSs|E`(-+QVk#{O6qA&dg|C zHx2!6_w+aSw`VvPEr-0T^K&#e-@T?(`a}?>fQ*cMVR7Pdo}Mn?txJCjtq_VMd)R^g z5VEZ!_#qdN-jTKhvyCY08vgbT_B+>!yJy(X8RhuxXn5zp%i=;*o;zR-N4W^XB9EWe z^VZ30dsh##&8CBSIV-P^;#YY;dGWZN=U=87t$Yv$^TP{s(e0sZ=O3$D zw#4eV*?~+R+e7XR6h6XSnkEX85HNb-=C(V;=GG{JFLwgPsm?(<;LP6zj_e6YrXP*|Js1}pyx9|zOrNPoGHEfO++(PO zU{+ly!xxwVlj4SfpxF>oBVz246OZb8eIw9$fl)CCKh6*yQ=BcU59UNDN?P5PA%-+= zr0^Lcjp4R-K<4~CLUg9bSLx2QJ>bRdOhrE4+WV6h79}zj&wG#hOv9rO^V%UMT_Zrc z1FmoM-sNL8GXgwUC$}(%AqGwTGCvHY4w?t;gS4}A5Ql~6zw^0vn_RW81=_;eBaAM8 z5;gPV*Hf-9pi z@T;>95PcT-1Iz04p2QKIvi{%FIN;!ZrJ!Tf&<>X3>N|$EIh;>Q90`Vhtk-O!w&dz9hj}KZ-oga0x+?ij5T9qG1u8&bGm2mFoM9YPf6<|@UTV4b zP8@mUIN|ah2;Q`?v{b&8>^J;NNwoIOlBMH!<+N47X-} zD*~VO3-DyOM;s*WisL8pYXC?vSa zc#3v4rDm0h#e7ICREil4K~zii8M7udNIOzQAFd{d=6D4kL&!2{A??Gcz8Hk z-;QQOjEB?srr3IMS)9p|c}jGerg(+fQ9{*qhUWjzKX5M5j zP?Q0uS%Zn;EbX}W*|luFY+d`He{90D7j1v~GdUsgq*GvS8cu;VICs)LB?6jBkyMyn zrph$g#&o26Yu{kb^agxeX#C}k6~mdpRri;PdzfWZ;1Igvq}M=-GpnW}7W&uiT#=b? zC~I#j3`QqdL)o44%Z+*_!H4xC@yvRq_A4PKol;;%jS@cN)39v$#(RV0;`bM9m8@qU zfDZ5rDMgZw^c7yi{533=^B|@X#x^D}pD8qlt8nuji#c+?evVpT1veVI>aUx>#Luja zNNwv``VB_ppP6gT-=Rylolni#j5L4@s#SxAa}Je+jNI1bABJm&z3r^bE>=>D?D1SZT#Q@@qB z@~=r((j0sR25>;rtyJRc1F>E0rkL4wBa}21Oms1%Vzae^(ge5DUwvE(cN1n|0hGU#>zC~j^2}>U zj>eV)jW|CFgbKSu}n+1ILh zo~nnsk4wLYgKRX$23|YJsXRyx{jf*n`&C+A{|5c$b)o{b{C9N~n)c^O4Tu=+*kH>K15#26=Uh z>+Xs|6YcG+S+B4}ddn?pXxqz_Ub^p9)(Zi0=+@u zs*v3=j+@*Gn>2}<_+xAFk?1PC9p|>I_r;`IP2b|!m?3GZ2GA{7&Q?ouTF<{fIoUM5 zTshLABqqojiw+pUC3$P*dp9>Wsb>SsHT$Xu&zICZb{E%w*eH{kc&)%pJ#>$!juy58FI1@MNnAQ7ylRC-s1ltq}tOZIlJ^$QOB%#>|U?pY5;?!uuKY-4$-eSMYsJl@8 z6O`kfcfjD3(d~+-FFY_?P5VWq4-`#S(?K{R3l)B!M8CD?4@DRLA`z;(?T(!6xEqDJ zgxhkQDO6#9$eNqH1W-2GR*!;mDtx9b(oke4?-11fQN;5A$*W`qos2lZ|3CAw=lCO_ z&5ZK3>p|7NbPoOU>!DHM=m<33DQZ;4S9H11+S-AlRXw19VAILFOC_2>V>K(;YjqP+@^+@B$(;eLpxf|O|3BF;~1zo&fm-FE_vBTx@#*n0v8lgl$WKG@}; zYT}}6?MzKhDKQc3>BRv0(wBjah1BhG44wCl6l;Xq81fFHKHT3Q1C-PjP-X^(30)`E=@64{ zpcEmi-4$oHlXl+ud5J_^sL9BeGn-68mXhI}@^-$U6;RK{C0Pju_)PU75}{%0G~lx~ zMoCy)<7-=&pL%|rg{SKG--#DHPPn$Bs*F24YET6e=SR&u-_rDK+Ye0hXyLtX_F%8i z&f@2uFA38**dYTMi2!ZNTF9pRSV>v^iYzH(s91lkU>i%XbiLNyz-OzT2EWLKzj~(D zH8c)fJ4^+SUP9xY&1bGPxASQ}CLPu-P;}8SeCrh<)LUzSrTKx+wU3UN(o_HbH&_Ve zu#^`Jc3j!Uw6<@NhZjSYhViP|YtVT4e;yqh@Aj(R|XcNfeM! zzvsf^B<#@Y7+j#fRb_SKYoMo&;~lVP@&SW%jyxn3y7qlNX=Fz=5s@xhN z-!;*#&lC=E#Nobrfy>K6XLnVw6k~+h!Ht=G6oeRza>aShzP6?Q zqWuXri|5T)H<>h_fiK&>)1qG`D9*F(0hB7xGzwR^NShzl&EnY^&siflJJ+ub^{Vk-FuxW&#Ut7Bhd{uyUzO)`{^e+ zX=J*Ei&R|C{o3nbk5umU*(TV#^mN-gR6aA!2hou+I?n^^J;E%wVgR9Q;NG9=0r}z% z-qcHv$-GV;fYAOfmPsQSsyKvKQM7!!X`Rh-DwjaKG?{9z<=%fm+G5es;1ge5%m2yy zw9Q^_{(z>wj4fR@#r?V^o~UNg-`d;LQ+r#bhLnTAGv}6j^Y^k&Mqh2j0FO>_Sp+r= zaO&lXQr1$KB&oWl##;8MK!CTwvfxt#YNqM!osn^*w=j(f6j5!ul+xr{KBoY zm}Xj#jk97AJp(wzFBze+gjK)qeYEmA`beAcz6)4xnLG7IRi;C0a2YYG&ojaixuzH7 z0D~4twu3+WxHD4Gj)sbdT@q z#ptQc!vT3m_N{&Enx9iZYll~H31Q_o^%(Ej&ABn4vCIR$oYlT!$ z5RZhw?%BconO~G2$=-4-4PzL)Lpj_SB;Rd7%Fgc6RIxcK7(rJ^DXLg$h$eJT=22Ta z=P6z7JfrHU@VNhkgzzxbO5{m97FZ7Ra@s#`aNJXM-Oda;2f57{85&m01~LZz=i2o{ zF&?)wTV61t=F2qr30USwrxm-&Em^mYHS0YcQ;v*}`RLG|4297by9Q%9w~blq;B2HqIik{Y6 z0>$rY0 zjrO!t%4ob`3cVW95^-5{5aMqOpe4*G-HK-%5t#oJ&w9}L=IE5&QK$Bh=kD+5t#1ab z)v@~5&zu}d+w!~7NKtmKeKXq1cQQP}itI8Mm^J2j3k?f@zFc>Ogpf8`WZW19>?TB% zr9Wo=HUf~PpnU@^_F{J_1xMQUbI`s(>sC zkW1651mCSihwE<+GA&HuA4DAOA}xyWhN3_l0;4(#2l^2it#lXII@kNwir6%0D;&qx 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 B`CtG5 literal 0 HcmV?d00001 diff --git a/git-basics/images/image-2.png b/git-basics/images/image-2.png new file mode 100644 index 0000000000000000000000000000000000000000..eec9eb41e794b9404e8d8d907201f0608a6c70e7 GIT binary patch literal 4933 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 XYh3NKXzk^7>5B-arlVQ`g@^qQ8S_r% literal 0 HcmV?d00001 diff --git a/git-basics/images/image-3.png b/git-basics/images/image-3.png new file mode 100644 index 0000000000000000000000000000000000000000..f2f5e60b63d0e677f7a80eb6102f446b29315b13 GIT binary patch literal 22199 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 BvI_tJ literal 0 HcmV?d00001 diff --git a/git-basics/images/image-4.png b/git-basics/images/image-4.png new file mode 100644 index 0000000000000000000000000000000000000000..ebd31d7d25288748d724dfa0edb63d0af03203b6 GIT binary patch literal 25570 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
W;nlMzbw^%=vpq zUp$MRC;1J8X#*w&fmoOXd+6Nc9NpTArrQZwWvUG(Itn}YA)V!~{ymHZ>u+vIj?;Y&m;C#Xyp$*w&49 zT(aDylBC-A%gJY4QPbS>P1K56^kW)t3NR$%|q^@)tH4r5{qGCHLr{M2Lz`@|8H2Z7bVdC1%c1Z_#$qgT4Yf2sfm1l_=DdCNttaKptMb+6_0 zia|6gaqxlK9TG;Mr32;;lRYUv^2H3hz(=%M918_&&&?r4?3!1naCPGSF`KOx0nX}Z zaYVyXk~fw@^t$_4&ga`uZlvP+jgwx>$FqcDZ@Fe@>{+I73IulZfj7yK^susyw&JO& z;}(wZVB2?Ft~tX(!^fB4`GlD+zmd5{drz;BN2fGG8jpe9O7neeQv(F~_PJ;W zZxE{(IU6kX5q~5?s`1`lTN>>>><9cVCQWi(vb5qg+yXLo_^QYu&1=A3&HvgOSV-MjX7liZK?%>ovF)9VH546c3iI{`u?2TQ;b z2Pw+w+oWt=r5;sB-)UDB&+BJ{dVqHPvNFdDZ?=W&uHGPyL#azHyxRh7(TYXFDP*tX zkgnI2 zm(u#(Nc0AE^xKQpZmzsDI00cp{GM>aHKy zhfW>fnSPw`drF-|NTJ} zUMj!Q2AXGH_qqr4i7p-s?ev`sYuYF+a6UlDHJQ8TzP9eHYny;cqk7h?m{V02miN5& zDfN~$wXZtpJkwUU%Blh^r)AM?eWdpY#B8Ope`sbN4C`>S7Xpj(7#8}-{DhZDSGCG` z@2I*n#Qn}WLA33X3jd~|Wi!H|WGV&-mM9PyXaqmJsw-IQ0j~1#R<_i5rVEvKtYqq8 zzKD)m?lJPvIs!gzkDSjGRX>_ADcNPB4ztxodUhYEKDM(ls?fO$WOuuA%<3Eg*eE^d z$z63VZ8faJ>72 zL4lpLw%bcRR~&2- z*!|n%C1$X1mg690q~ZZ-3!gaRq`{x9N{J#CSC&|ntj<9NT!B`!|Khgkqx68U+4OaH zbIHEX{j~EqhJf9GnYi(2wKJGQL7=X8`K%c01kN)HYHUpBYkAsF#SU;f96C5SJQL<@ zKo)8R$f%U+~S6~*ey3VDu8~28+`;3 z$+H{rYa);P6oM=Qc}Z#Ym(!pDqTV22t0OU&w0l{DXwrQhP>!acaT}#FfPkj3~qes#%6F% zbocV_n$gX5jLc0V`z`-7>MTwAhsK(^xwj`4lkjbUXrqsSw%@u8MFy2qGkz0!4s0H< z!)4ANx20-aqPL5+(mgFD4?ozh{)~vWR94^obpKv%*P|Bs5VfzDdQp$?qS+Y&U+u0f zKk12xkLI@%aV8OdYb15tX8b@f4pXNjMChgJOH9BpuByK{8e@kngSyqn(~lCKaH4eb z3!K}X#3COJ)j`V(olwv`c3HePV}if&Cc>m>=FfIbW1J*rG`B(kcqH6F4mb5ZMM$A~ zcz)aM`pYj|*^GnL#Kh%*7WMRxUYItAWUsZQ!Hf0bzg!)s0JwIN&VAY7!yRDWA$3@X z@F5`7rZQeZMEkGz1RS{+jg*ztX;=ukUjr#t>Lm)-iy=8k=@&Z34&VDOou@MGQ%Pn z**BYFUUR7je%_sFxY=@SWia%~Ta|6#&UNO02x+9}p>Juf8Ls7P+PgbCsz-e=!qW#< zg&8)#-k-u#_EhOGcBG*O|I&2?2sJrL@>&l)ETwI+H65cV^_G@HBh&RkNQ~*bdK+y5nh@vyn=H3+wR4O>$6 zbau24jGDjyt;Z$iR?Ku|X_bdKy91e1TFL&0j;2EPYIep=n9a2T;o)+;X32o2>bC{} zAL`^=`)Jj|`~O5s)Ecw*_w(!{c_AXN8acTk)8Bsm8qx*JyRoyg&&&o~5oEqDh^OZ_ z4GwO($G~9h==g1gkx3~WVQ`asD0q;%ct&Ejj(`;>3X-L8Swo4OAmP7+#uo@d+zrJIsazbe`xBCnPH(F%Zp=mu1nDE^?gB(Z3Zh* zng8&!)FN9>SZ@G;y?ECEmu>n_h}V)`yRCj%}0ReG#?n27KVgb8;~(-VT0L~*g?^3Ji`QTI-<9bp~-V=E6~xWP{X=FfFD->UgiK1p-tSghnVP=GabPc?!Z;Fk(AoApj%O~UprC+xB1)IG(Ybc{ z4soJDvx$HT{i%MZe15=B`CUYCZ2#oha4d$VfdAIpbWyJ;CyC-yVh`%%}m# z%GM*9){7Z4`1L_$0D<*LuJ}J}JV`Rh;P|*tzkmK=)o(EZ$;*6N6@}27>3075u|^@B zZAckz-s@XHB0%+PS zl#!8f0Y@gTC@$`K_UxJ5y`2=IR5*j zUm&_-AGy$aqf)E5zq)LZSl#Yn>7Nm!wh$x6aB3%%q_ud2xML?<~ z5=!VrAVDDTF8Y0Eo`2z)d49{xX6N3$_wJ{jbGCgr6d*7j61L7is%yupi`^6Ex|4FX ze9EJB8Xt4;ap4=SFb6^~a$+V$;((O0zgNOsZ~LV9MXi=qumMxR2}Kp{NmqXi@NYGAev4)x%MS%m2u}n8p3&h1M0MWISszzA z4(xZkBaRZz${bQIF|4nz`>M|_qQi-TzCO=!0e2-D=(g$WCICKh1Fq@TSZo3)~vA38WR z=(n#ZDJi)R=j*K3YyJ{Y^8Mz!fm>ss+IW@}RtERqe8&e6`r}_n^GaO;WDt}^(DCR< z$XPoA()!p){V($y7(1WiFcE%K*L?W~CI!gLU7wD(64-C&{ z(bNOjw!=7-tKUWqf;VPV6*&TqM%WM< z?IXNbt((RLIMpmI{@Mp%JNbMa`ZJd3Yq<_yI;gXS0<`)}dCv}WbMr&LNLW4Dn=!6S z;ny>$uE5s7!Js&rV8ax>L{dlC)YzKLLm%%<@?K zVIur64OINZ>L&KgV6Eeuo5O`MWJggdE7a-2(o!-Rnu=AV6=nd1;3BH{CsDt7nG!F9 z7QB$56ra|_9qfCNLNH-cO6X9X&wn)?OyE7gGP&AP>Jf);c+uMAm>=SQTjMYVtj5A7 zE`7W@aI{*)(|D~cJ~$Nha#r^XduGU`J&n!Uni|aZ;TQ>hHIJ_4nVU>?WT?h zvc#EK2Xx2#MuF`)|Cz}Q+8nB!u%<(&3Q6^j?AUg$H3RU~NJ#oW_d=j?I@R#->zSba zrGhme9N1-^(bbn)QdC2i$NtB(24DWix%Onu;$(}c+q?WxVgzcrOlK!#!1{Lx!a21A zoxl|$k=V1rVG-7MM5cn7rX~~b!lgeG_&s;gSO0y7* zgz&QdIc*1V>P-a`TmVQ5^~O7OC|~}{b2=@mIKL$_{HL%rgRgCyVBOgfxuF*ehE`VY zH*o$r?4lPcgzbRaARu6%=o3dpa8dW5ES@XOd2`bOdM~4_G-S;c*BL4=b=H4(`3GrG zo!!jA!Ql{>bm6VwT{;_C$c3C!v7yr7eG}mmw?qZHZ-CmgypXL)_yV}Q$w~7QnU&YC zUUeN;WTgQT58_r0Bk`_`fdj4~TX^;eLX;e(TpDV=*hRXkC-d4jXd=P( z=l>lPc?AUp+^*yIYz>uOW-Z!mNL_yZrzsaEp-TIC1Z`=&3{c5 zo7O~o{zu5~5A(zNVwia(c1AHQ)af#gC-MTbk*6FrUGnR|_ULCm?!Nf38{HmOy-1wQ zuu4;|FzOEaYe9KV&nTagd(b_fN!+JzYSv}8GzXG1RlXN(Un|ZR96s}Eemwg( z?+4ZsBK=9wYq31#rfcdK)VV(uvR5ZpjUnv_xKIgeR}7bk!Xcojw3_$f)v2!aXVuvm zIWKgI#aOI{;Bn_#eT0y~HqV*Kyt0p>r_{S6x zLt(WIX%4KDvlOpU0v)f*q_&6`0NKj@c2Hf*b^N1DV<)kq->}m!k|l&hC35pVjFIGg zCewTFO?{0qU)#+o@x2B*!nNE%2BkT3S{>r$74VNT3~au3Om<#+s1uhoYwB7{@ixh! z%nTpQk}c6)p)T2mH_^6FX}NV*Y@QpjeUnM`bc!3vYc3ct6hob6Bf+lJV}@(}g;Qj-~Oa(VtkD-yo`KJNHNCdJAv^ zqGS`KIwrt|%{B}QWC=WDMxE(AGX&=nR740djvGnIOp11OE_I}^ZzW4xrt)#fW zRv~W!rD{TSG}T!D6ZmqWU&i+;gvEcq7UM(~?hC^eNXhguUlVv^;UZva^pWcw7x95+ zVu;_J2<3{Bc3mbhc%l8*q9^VSo;Ad6L*19y0Bb>h__V#IMWY+Ou)l15vUA^c zyW#Z%e}SO^{tTpx-#y7Vyx2#P#C4Y{$rj%c91Nw18VJz(+z{XrMj^2#E8o}4J(H}$ zgFcpsgwS=2^-KlA#O>e7#(l(98mD8I(%;8TciHIG9gG}_9-zQSrF_oSpPnCu^M$oG z)U@H0TfeQR8@k=NCs8(kKcJ=zHpUuO7-fdiVPl}CZ>iL-prB9-j(00aI2Aywp;g7K zwjf-8a1dvoH?d@#lI$?C^m`{yIOc7mB@4>&PIE!JPh|B=P&dJkF6pR0K*X2)jZnt6 z?G7*>#4inastcM2Rd3NCM}Jx(gUlq3ZriWi^&c3v#lp^x-Y7&oR9Je{7U#-{?_p+4 zrzmZl6MPNc3MD28TUaG;;1jjP0jmcQ&Ap}K_bxz{T`XX-d%_u|RWzLq0Y%EwtP0@d z7cRp=IUqK>uCcY@xYg-xZAyndl8;4OabHg_4OHLYZ~rx-{3$41fX@8kqv*UC^2|HU zO-(aIu}(t5sNko3`mIkl2UaweRmW0O+2n$r!*TnVJ%Zrw1mA$csE{4pG%w(jGdd=`hJrGZ%w#0jR0Pz}e$s5U&VA`#T24-h)=uvpVmK zajV5{xK`YFZoRl0v$JUx>~uRy>C8yJ+%8ZHv4cFOdIA|z2s=Cq8>+ngkzivXqks=x zPT=IY%JX|aw5H&DOKo*~w?Y{Lyy|b{%ze<_JzrCF9UruZ{Gux2qMy(G@Xt+a-pI4{ zqp|Miwps{lA{A2gQp4KwOLxwi(xfj>uJ$OMUn>-3xL|5cpXQ89BjQU7tNr@LeG-rI z5E2ta^hI%|4pgB2LcLE4gt`r4Gceb@bz~1i*Ph{Jh5zI@Xo=ky=_E%R&QyLV3W2}4 znG(2&%mQ~l?c>-0F+Q|g_YsbeD{r=AVy8Qd!!(u;zv{Jb`3s`8nRXyISpikVb9BWY`s-#8l_RXEQlj< zL*|gRY1zDAam;XH>ioE7iqUvM>4%oKEl&W+FwlBh%#FuGoa=DIZE^Dzww>uCvkY`% zH+efmLg&c?&0GL_$b1V^GQR zvawARq?wt!*oW<(_V6Vp<;NMbkirqBU^lZU;~x3P49+?C2+8_2A;HQI(#Gk1A~lQU(M z77k_qc6rI9SKNR(j{@>MrDt^8^gwkxir%Zus>jes1dh*Q`zwc+KDgM@2gjk6cf#l-iZ&L<`c(FDYhuBD1eDU@MTp!dDWSusx z)Hv>#ijbNi&$zRaI{Ba!avyZE^IYGy+LO^!r9CrSdDT5Xv3}^!8_@v# zilwk?xM|}%K0@yZm{ud;a5D4NAko;1tCl z92KPNV_JGEx zwS~ENkLLC66qK+=Q?JBuRma&tnmlal{S@ykv`mQ92%>|B!h{zOy~+v=>yJ%1CK(7t#)Ao$7>!?-8i@FD*Y;&4KPK%fwGteo-VSA1(FSlWI!^wyFeRl_S(Y zWj=J#kK1IL`-i&dg1uvL$0>rpw0Pq7n*lsLA=FFi+*DBi#*L9Espiz(mrXn4W4-i_ zdbUQ$@R>gg<-;mB8zc^oJe1DCd>GO4-=P>ExwdPhSEsX?KXWiNWOJ}`r?P)T^Bjjm;sms#(S) zJ2qQbE0+z2TF**%8FU@$Lu>yu0URgWy%*u!QWdJR`a8l28YugMh>cK?aSxw&%$>j( z@?q3&ji7yF=XMPcx3ADMbV!Pq?(pKW0xOdbrg=vp91%`K(Bnj>ps}VQW>}kDa2skn zapk#%g&#H)ulF+f5fB#5B)yw!_k6ktRc2+sMx*Se-@^X~=_&>a$OX>B(HYV&tIBs z;|n|P|M2@-Q+eA|XG@OID;m)Z)~-+>)u!<`18?p;DoDJZjhW)1EuESxqfXv$&;PcN z04io_jo<3Qx1dIv3t|turyLs|XX8n#WtWp@2V4ava5jzS56CMR!@d3#Hthx!&_M_i@vj>^hvK;rLkc$RJXVtTo@0$iY6d>H}BTH zrH_UZLkwayr-cc}D)M9WBi(KG+C+g-lPW{b^5bp|ZqkI{A>+BZ*DMN?r2@{?c$C{f z{VUd_w^Hbp@dd>S)Q6gHaPinaH4^=zgSJ*j?6)vdn1&}} zN09D)9m!}eH%M#--;y=z!1d5-#o%J4(Q~biPWQ+ea|{BgZhcFF_E zvdq?N!ZXI!5V$o>>DNhKi-`XkGRmS)bvrZ(eKH<(9HAHQ`1ngt>itP*ib;S8JT&QBkKq@5D#BojcV)heE4ez*0V7a`8R z4F&oyXb{rGc*gV)kfEcRk&PgP2I2Yc;u{-r;3b;rp6j%|3Er5er785ir6fg^xQYL^9-{!_BV)k=J$PaM(mR)o)H ze$r_~tNW9(hiti`-bM-&DvuTEFd+@UgM+qDZ7e0Gri{d&FW{<^jukp}(i0Rrzg*nn zz8Q;AJ>OOWoot#f&~n#0Yd^X3xOr*Qbi>9+lB2N>xrgnLs+k~-&IUzLTt~{;F zw#?dSA-&4t20W&cp@1`U&Io@&A{y8o4#- z@IuxL!(29{do_*z0_gnb)p`8KR9H-4qT2?p>>`WA+X}i%k<@0xBc%IGVX2l ze_|E|LDgcgH)Q)v=uBlwd0TuV807lM%VB*{Wzfu5*9)xP&P&YL?iq#*xQrqd1izve?J zTJdDlf<7q5T=A&M<7Qfj%fo6o5s8C6!sCrMC@oub{o;K!$KKmU0#k{O*OP#{LlBU} zlY=z(H10fGhx?!6VEJ;2AM3qCnyA^oez33*D1ZPJ^StE@o;jMJi2h+?=v+Ele%(nL zU%w?baJx29qGZQaUd=1i(9wU58; z*pn%Gb|&TCL7ygh{FdllXl`_f!~JK?q55g(Q`9|02v{G@#84Hb@Liz$eXj-ya(z9* zE!5TfE`wGm(w{l&C?d9Ljwo7D(lU)15Bl;fLhFsR&^eD)E19@8+=K|J?WaMbS71_~ zxDxzZe7m*ZUCFA0&RJLtae?7NmQo>_(_`azVB-P%S|4; z$Rr}5Zi};9{JCAy2VJ#DUp}Z_L)-{oL4QghPXI?Q zs7WUH3`fk5>OWgS-Tn(nK(PAbnUBi6Lb*f+iZb^c536pw2DRdY3q}#S{-A*Jj54oE zs>*R&k?8!Qp9hAp;$f~|{73^NeXVyJP!0BwX3?rM5IaP#+svs%j2mXHEeIXsRa!jKlT90EF3bsRrBFGZMcMS z;+jiUsRzs!IyF%0c<%h*ucx;dxk{LXZl&DDGN1Tb&=#N^#JO>WKIpt|Ri@a}F3vl) z3%FZ>e{`#cR;!o|WF_bg(2Gag^SeGZ%~{jKXezG=?`MEI=_B$t36jypq;n4e%P!{5%u@+Lmk0;3@P8($ys>f*DwerY%K=HudpO z4LiXn0*097a>$Ih_>@X-*0)H^Y`9)7!-&tE<0rZsK7u~(#HkKDUf~g4-<`lCxU+4* zQgXCAo!%>yEF?pc*J;a#{Ow58Vy;_%);wN~=atr8 zcZ!pS0aQj8Ms(`?pzSG-6>NR+l>wES;-M6i`9@nI1Lg$yC|@U*MCbW@F>w@R6;|gF z>XlmUo9UU8bcq_?`Epxs($P`bs-#}V7ye1CyQwNYWL>pVxq_1Gmtwaj+JSIkisCo| z$~+>6Q4o>$zf3?vAEoh=mLB*ia}N)Gr4R`@D2MLrOJ6Fu@7Lo9m7?(L)ybm?jOj`x z3TW8{4Z#+i{G`i4xW5t~orUn?RfA`}8^_;@TpHcYXSnlx(B$Hc!ig%wtXk~J=eosapupTZwXoqGyRHR-^hO-<98MPxg!TT%UlcqIcqtIj8p>; z!Q4stegk5=B+R#LpvKOBQe(HH6YL3eRKMy@V4S)a_=WDzkqMJ<$rZ_I+}TK;WFwvw zV&KgJFo&jjqx9&(+@nq zhsfBUs5nV``nSYd7XkgS!u6sQKDv+@=zGI= zJhp~EQM=lAH@bR^SoknDO}V%+q3RT7c!16(TN?nNtTimdEbgaoM65)DbN)6PAR2mg zjVl+URX=Fb)?io5a!RbMq2RDZK=JC)l{;cyR-2Mc9oU1&I!h@D=q%(;Os|r7C zpS6QTTH)EkH>R(2DgqVphhHOpwK{8u^)V6PN><%-YX4Ks|3T4TJ$6u%@P9~(|N8}? io&FcC#_2bdW6($Vl7&}z67XFPs@od(5FgcS!v7yaTgKu5 literal 0 HcmV?d00001 diff --git a/git-basics/images/image.png b/git-basics/images/image.png new file mode 100644 index 0000000000000000000000000000000000000000..5c2d2449e1932af0696b309c53ebc4e42eb59a01 GIT binary patch literal 17211 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 literal 0 HcmV?d00001 From d4d3cbf0ae1f294cc3f5d97f1f9c0d420115aefe Mon Sep 17 00:00:00 2001 From: jinseohyun1228 <121755257+jinseohyun1228@users.noreply.github.com> Date: Mon, 14 Aug 2023 00:37:17 +0900 Subject: [PATCH 19/73] Step 1 jin seo hyun (#6) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit step-1 자료 조사 내용 Co-authored-by: Cotidie --- git-basics/README-JinSeoHyun.md | 441 ++++++++++++++++++++++++++++++++ 1 file changed, 441 insertions(+) create mode 100644 git-basics/README-JinSeoHyun.md diff --git a/git-basics/README-JinSeoHyun.md b/git-basics/README-JinSeoHyun.md new file mode 100644 index 0000000..7654589 --- /dev/null +++ b/git-basics/README-JinSeoHyun.md @@ -0,0 +1,441 @@ +노션 링크 첨부 +https://www.notion.so/Git_Hub-Study-09e13a1415214a4f9523a1e63071b7cd + +### **1️⃣️ Git 기초** + +🎯 스터디 목표 + +- git과 github의 차이점 +- git이 동작하는 과정 +- git 기본 명령어 + +## 📌 Git이란? + +```kotlin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 +``` + +--- + + 🔖 **Git** + +개인 컴퓨터에서 돌아가는 `분산 버전 관리 시스템`이다. + +> **“버전 관리 시스템”** +> +> - 파일 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전을 다시 꺼내올 수 있는 시스템이다 +> +> **“분산 버전 관리 시스템”.** +> +> - 저장소 자체를 히스토리와 더불어 전부 복제한다. + +🔖 **Github** + +Github는 Git 소프트웨어를 지원하는 **일종의 클라우드 서비스**이다. + +> 🤔 단순히 고양이 클라우드 서비스인 줄 알았는데 분산 처리 구조와 협업에서 병합 문제를 해결할 수 있는 도구로 깃허브가 필수인 이유를 알게 되었다. +> + +[➕ Git에서 병합 충돌을 해결하는 방법](https://docs.github.com/ko/pull-requests/collaborating-with-pull-requests/addressing-merge-conflicts/resolving-a-merge-conflict-on-github) + +📍 Git은 병렬 개발이 가능하다. 👉 `branch` + +## 📌 **Git 동작흐름** + +![Untitled](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/0a7c3af7-4db2-4864-827b-443f9a368543/Untitled.png) + +```kotlin +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. +``` + + 📒 **Working Directory**  + +작업할 파일이 있는 디렉토리이다. **** + +- untracked - 정보가 아직 없고 트래킹하지 않은, +- tracked - (수정된/수정된) + + 📒 **Staging Area**  + + ****커밋(Commit)을 수행할 파일들이 올라가는 영역이다. + +- 고유한 해시코드 , 작성시간, 작성자의 정보를 가진다. + + 📒 **Local repository** + +개발자는 로컬 저장소에서 작업한다. 로컬저장소는 개발자 개인의 작업 공간이다. + + 📒**Remote repository** + +원격저장소는 인터넷 상의 서버에 위치한 Git 저장소이다. 여러 개발자가 협업을 위해서 사용하고, 코드의 변경사항을 받아올 수 있다. + +### ⌨️ 명령어 설명 + +- ✍️ `git add 명령어` + + 작업 디렉토리상의 변경내역을 스테이징 영역에 추가하기 위해 사용하는 명령어이다. + + ```bash + git add + + git add * + + git add . (모든 파일을 포함해서) + + git add *.css (css파일들만) + ``` + + > 다음 변경을 기록할 때까지 변경분을 모아놓는 작업으로 `git commist`명령어를 통해 명시적으로 기록을 남기기 전까지는 Git 저장소의 변경 이록에 아무런 영향을 줄 수 없다. + > + +- ✍️ `git status 명령어` + + 작업 디렉토리(working directory)와 스테이징 영역(staging area)의 상태를 확인하기 위해서 사용하는 명령어이다. + + ```bash + git status + ``` + + > **Changes to be committed** + > + > + > 이 영역은 스테이징 영역에 넘어가 있는 변경 내용을 보여줍니다. + > + > **Changes not staged for commit** + > + > 이 영역은 아직 워킹 디렉토리에 있는 변경 내용을 보여줍니다. + > + > **Untracked files** + > + > 이 영역도 아직 워킹 디렉토리에 있는 아직 한 번도 해당 Git 저장소가 관리한 적이 없는 새로운 파일을 보여줍니다. + > + +## 📌 **Branch, HEAD** + +```kotlin +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. +``` + +--- + +📒 **Commit** + +코드의 변경 사항을 저장하는 작은 단위이다. + +🧾 Commit 메시지 + +- 변경사항을 간결하고 명확하게 설명해야한다. + +```bash +git commit -m "Commit message" +//커밋 메시지를 지정하는 옵션입니다. 커밋 메시지는 해당 커밋의 변경 사항을 간결하게 설명하는 역할을 합니다. 메시지는 반드시 작성되어야 한다. + +git commit -a -m "Commit message" +//-a: 변경된 모든 파일을 자동으로 스테이징하고 커밋하는 옵션입니다. 이 옵션을 사용하면 git add 명령을 사용하여 파일을 스테이징할 필요 없이 수정된 파일들이 자동으로 커밋됩니다. 하지만 새로 생성된 파일은 스테이징되지 않으므로 주의해야 합니다. + +git commit --amend +//--amend: 이전 커밋을 수정할 때 사용하는 옵션입니다. 만약 이전 커밋의 메시지를 수정하거나 변경 사항을 추가하려면 이 옵션을 사용합니다. 이 경우, 변경 사항을 스테이징하고 --amend 옵션을 사용하여 커밋을 수정합니다. + +git commit --amend -m "New commit message" +//--amend -m "New commit message": 이전 커밋의 메시지를 수정할 때, 새로운 커밋 메시지를 지정하는 옵션입니다. + +``` + +📒 **Branch** + +Branch는 코드 변경 사항을 분리하여 관리하는 방법입니다. + +- 기본적으로 'main' 또는 'master'라는 기본 브랜치가 있으며, 새로운 브랜치를 만들 수 있습니다. + +```bash +//새로운 브랜치 생성 +git branch + +//브랜치 삭제 +git branch -d + +//브랜치 이동 +git checkout + +//브랜치 생성 후 이동 +git checkout -b +``` + +📒 **HEAD** + +현재 작업 중인 Commit을 가리키는 포인터이고, 현재 체크아웃된 브랜치의 가장 최신 커밋을 가리킨다. + +[더 알아보기](https://charles098.tistory.com/24) + +## 📌 **clone, init, origin** + +```kotlin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 +``` + +--- + +📒 **`git clone`과 `git init`의 차이점과 이용 방법** + +- **`git init`** + - 새로운 디렉토리를 Git 리포지토리로 초기화하는 명령어입니다. 이 방법은 기존 프로젝트를 버전 관리하려는 경우에 유용합니다. 초기화 후에는 **`git add`**, **`git commit`** 등의 명령어를 사용하여 변경 사항을 관리할 수 있습니다. + +- **`git clone`** + - 원격 저장소에서 전체 리포지토리를 복제하여 로컬 환경에 가져오는 명령어입니다. 다른 사람이나 팀과의 협업이나 기존 프로젝트의 포크(Fork)를 생성할 때 주로 사용됩니다. + +📒 **`origin`이란 키워드와 설정 방법** + +- **`origin`** + + 리모트(원격) 저장소의 닉네임으로, 원격 저장소의 URL을 가리킵니다. 기본적으로 Git에서 원격 저장소를 참조할 때 사용되는 이름입니다. + + **`origin`** 설정 방법 + + - **`origin`**을 설정하려면 **`git remote add`** 명령을 사용합니다. 이 명령을 통해 원격 저장소의 URL과 **`origin`**이라는 이름을 연결합니다. + + ``` + git remote add origin + ``` + + 이후에는 **`git push`**, **`git pull`**, **`git fetch`** 등의 명령을 사용하여 원격 저장소와의 데이터 교환을 할 때 **`origin`**을 사용합니다. **`origin`**은 원격 저장소의 URL과 닉네임을 편리하게 관리하도록 도와줍니다. + + +[더 알아보기](https://git-scm.com/book/ko/v2/Git%EC%9D%98-%EA%B8%B0%EC%B4%88-%EB%A6%AC%EB%AA%A8%ED%8A%B8-%EC%A0%80%EC%9E%A5%EC%86%8C) + +> ➕ **`git clone`** 명령어를 실행하면, 원격 저장소의 URL을 **`origin`**이라는 이름으로 자동으로 설정해줍니다. 이렇게 함으로써 나중에 원격 저장소와의 상호작용 시 간편하게 사용할 수 있습니다. +> + +## 📌 **reset** + +![Untitled](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/49b458e8-7f71-4ab8-a1a9-2a6dd6a0e9e0/Untitled.png) + +```markdown +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. +``` + +--- + +**`reset`** 명령은 커밋을 조작하거나 작업 디렉토리의 상태를 변경하는 데 사용되는 중요한 명령어입니다. + +| HEAD | 마지막 커밋 스냅샷, 다음 커밋의 부모 커밋 | +| --- | --- | +| Index | 다음에 커밋할 스냅샷 +git commit 명령을 실행하면 Index는 새 커밋으로 변환된다. | +| 워킹 디렉토리 | 샌드박스 | + +📒 **Mixed Reset (`git reset [--mixed] `)** + +![Untitled](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c3f6abe1-b581-4759-940b-710f8c9bccb7/Untitled.png) + +```bash +git reset +``` + +- 가리키는 대상을 가장 최근의 `커밋` 으로 되돌리는 것은 같다. 그러고 나서 ***Staging Area*** 를 비우기까지 한다. `git commit` 명령도 되돌리고 `git add` 명령까지 되돌리는 것이다. + +📒 **Soft Reset (`git reset --soft `)** + +![Untitled](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/097ef8bb-24ca-4641-a404-712e2d71b71a/Untitled.png) + +```bash +git reset --soft +``` + +- 이 리셋은 **`-mixed`**와 유사하지만, 변경 사항을 스테이징 영역에 남겨둡니다. 이전 커밋으로 되돌아가기 위해 사용됩니다. +- 선택한 커밋으로 돌아가고, 해당 커밋 이후의 변경 사항을 스테이징 영역에 남겨둡니다. + +📒 **Hard Reset (`git reset --hard `)** + +![Untitled](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/3521e3be-79cb-40cb-b568-56b4b6450e21/Untitled.png) + +```bash +git reset --hard +``` + +- `reset` 명령을 통해 `git add` 와 `git commit` 명령으로 생성한 마지막 커밋을 되돌린다. 그리고 **워킹 디렉토리의 내용까지도 되돌린다.** +- 변경 사항이 모두 제거되고, 선택한 커밋의 상태로 작업 디렉토리와 스테이징 영역이 강제로 덮어씌워집니다. +- 주의: 이 모드는 변경 사항을 완전히 삭제하므로 조심해서 사용해야 합니다. + +## 📌 **Pull Request, Merge** + +![Untitled](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/afa84c89-23f6-4e84-9603-4a7aea7a279b/Untitled.png) + +```kotlin +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. +``` + +--- + +📒 **Pull Request (풀 리퀘스트)** + +Pull Request는 코드 변경 사항을 다른 브랜치에 병합하도록 요청하는 기능입니다. + +1. 개발자는 자신의 변경 사항이 포함된 브랜치에서 작업을 완료하고 커밋합니다. +2. 원격 저장소에 해당 브랜치를 푸시합니다. +3. 해당 브랜치에서 GitHub, GitLab, Bitbucket 등의 웹 기반 플랫폼에서 Pull Request를 생성합니다. +4. 다른 팀원들은 Pull Request를 검토하고 논의할 수 있습니다. 변경 사항이 품질과 표준을 준수하는지 확인합니다. +5. 리뷰가 완료되면 Pull Request를 병합(Merge)할 수 있습니다. + +📒 **Merge (병합)** + +Merge는 두 개의 다른 브랜치의 변경 사항을 하나의 브랜치에 통합하는 작업입니다. 주로 Pull Request를 통해 수행되며, 두 가지 주요 Merge 타입이 있습니다. + +🗒️ **Fast-Forward Merge** + +- Fast-Forward Merge는 히스토리 분기가 없을 때 사용됩니다. 즉, 브랜치가 포인터처럼 일렬로 나열되어 있는 상황입니다. +- 변경 사항을 통합하기 위해 기준 브랜치(주로 **`main`** 또는 **`master`**)를 병합하려는 브랜치의 최신 커밋으로 이동시킵니다. +- 이로써 변경 사항이 기준 브랜치에 빠르게 통합됩니다 + +🗒️ **3-Way Merge (3-way 병합)** + +- 3-Way Merge는 두 브랜치가 서로 다른 변경 사항을 가지고 있을 때 사용됩니다. +- 기준 브랜치, 통합하려는 브랜치, 그리고 공통 조상 커밋을 비교하여 변경 사항을 통합합니다. +- Git은 변경 사항을 가능한 한 자동으로 병합하고, 충돌(conflict)이 발생하면 사용자에게 해당하는 부분을 해결하도록 안내합니다. + +## 📌 **rebase** + +```kotlin +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. +``` + +--- + +📒 **rebase** + +Git에서 브랜치의 커밋 히스토리를 다시 구성하거나 변경하는 작업을 의미합니다. 주로 브랜치를 다른 브랜치에 더 적절하게 통합하거나 더 선형적인 히스토리를 유지하기 위해 사용됩니다. + +✅ **Rebase의 기본 작동 방식** + +1. 현재 브랜치에서 다른 브랜치의 변경 사항을 가져옵니다. +2. 현재 브랜치의 커밋 히스토리를 다른 브랜치의 커밋 히스토리 위로 이동시킵니다. +3. 충돌이 발생하면 충돌을 해결하고 계속 진행합니다. +4. 브랜치의 히스토리가 재정렬되고, 변경 사항이 적용됩니다. + +✅ **Rebase가 유용한 상황** + +1. **브랜치 통합**: 다른 브랜치에서 작업한 변경 사항을 현재 브랜치에 더 효율적으로 통합하고 싶을 때 사용됩니다. **`merge`** 대신 **`rebase`**를 사용하여 더 선형적인 히스토리를 유지할 수 있습니다. +2. **커밋 히스토리 정리**: 커밋 히스토리를 깔끔하게 유지하기 위해 사용됩니다. 커밋 메시지를 수정하거나 불필요한 중간 커밋을 합치는 등의 작업을 수행할 수 있습니다. +3. **충돌 해결**: 충돌이 발생할 경우, **`rebase`**를 통해 충돌을 더 명확하게 보면서 해결할 수 있습니다. +4. **Upstream 변경 통합**: 원격 저장소의 변경 사항을 받아오거나 업스트림 변경을 반영할 때 사용됩니다. 기존 커밋 히스토리 위로 변경 사항을 적용할 수 있습니다. + +> ⚠️ 주의할 점 + **`rebase`**를 남들과 함께 작업하고 있는 브랜치에서 사용할 때, 히스토리가 변하기 때문에 주의해서 사용해야 한다. +> + +## 📌 **stash** + +```kotlin +git stash를 활용하는 방법에 대해 적어주세요. +``` + +--- + +📒 **stash** + +Stash 명령을 사용하면 워킹 디렉토리에서 수정한 파일들만 저장한다. Stash는 Modified이면서 Tracked 상태인 파일과 Staging Area에 있는 파일들을 보관해두는 장소다. + +아직 끝내지 않은 수정사항을 스택에 잠시 저장했다가 나중에 다시 적용할 수 있다(브랜치가 달라져도 말이다). + +**✅ git stash 활용 방법** + +**1. 변경 사항 저장:** + +```bash +git stash +``` + +이 명령을 실행하면 스테이징 영역에 있는 변경 사항과 작업 디렉토리의 변경 사항이 모두 저장됩니다. 작업 디렉토리는 이전 커밋 상태로 되돌아가며, 변경 사항은 일시적으로 스태시(stash) 스택에 저장됩니다. + +**2. 스태시 리스트 확인:** + +```bash +git stash list +``` + +이 명령을 실행하면 스태시 스택에 저장된 스태시들의 리스트를 확인할 수 있습니다. + +**3. 스태시 적용:** + +```bash +git stash apply +``` + +가장 최근에 저장한 스태시를 현재 브랜치에 적용합니다. 스태시는 스택에 남아있으므로 나중에도 다시 적용할 수 있습니다. + +➕ Git은 Stash를 적용할 때 Staged 상태였던 파일을 자동으로 다시 Staged 상태로 만들어 주지 않는다. 그래서 `git stash apply` 명령을 실행할 때 `--index` 옵션을 주어 Staged 상태까지 적용한다. 그래야 원래 작업하던 상태로 돌아올 수 있다. + +**4. 특정 스태시 적용:** + +```bash +git stash apply stash@{n} +``` + +특정 스태시를 적용할 때는 위와 같이 스태시 인덱스(**`stash @{n}`**)를 명시합니다. + +**5. 스태시 적용 및 제거:** + +```bash +git stash pop +``` + +가장 최근에 저장한 스태시를 적용하고, 스태시 스택에서 제거합니다. + +**6. 스태시 제거:** + +```bash +git stash drop stash@{n} +``` + +`apply` 옵션은 단순히 Stash를 적용하는 것뿐이다. Stash는 여전히 스택에 남아 있다. `git stash drop` 명령을 사용하여 해당 Stash를 제거한다. + +특정 스태시를 제거할 때는 위와 같이 스태시 인덱스(**`stash@{n}`**)를 명시합니다. + +**7. 모든 스태시 제거:** + +```bash +git stash clear +``` + +스태시 스택에 있는 모든 스태시를 제거합니다. + +> **`git stash`**를 활용하면 현재 작업 중인 변경 사항을 임시로 저장하고 나중에 다시 적용할 수 있어 편리합니다. 이를 통해 다른 브랜치로 이동하거나 작업을 정리하는 동안 변경 사항을 보존하면서 유연하게 작업할 수 있습니다. +> + +[더 알아보기](https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Stashing%EA%B3%BC-Cleaning) + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push/pull --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 `parent/child-1`, `parent/child-2`는 가질 수 있지만 `parent`, `parent/child`는 가질 수 없다. 무슨 이유 때문인지. +- 리포지토리의 두 타입인 bare, non-bare + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push/pull --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 `parent/child-1`, `parent/child-2`는 가질 수 있지만 `parent`, `parent/child`는 가질 수 없다. 무슨 이유 때문인지. +- 리포지토리의 두 타입인 bare, non-bare + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. \ No newline at end of file From 7fa520b8bb79b69653e8de44848c1c55c808563f Mon Sep 17 00:00:00 2001 From: Wonseok Date: Mon, 14 Aug 2023 00:41:33 +0900 Subject: [PATCH 20/73] =?UTF-8?q?LeeJiEun=20step-1=20=EC=99=84=EB=A3=8C=20?= =?UTF-8?q?(#30)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 새로 구현한 기능 및 주요 변경점 # 버그 해결 💊 해결한 버그 # 리팩토링 🛠 리팩토링 내역 # 스크린샷 🖼 변경된 부분에 대한 스크린샷 # 비고 ✏ 리뷰어에게 전하는 말 등
사용하지 않은 항목은 모두 지워주세요. --- git-basics/.idea/.gitignore | 8 ++ git-basics/.idea/.name | 1 + git-basics/.idea/git-basics.iml | 9 ++ git-basics/.idea/modules.xml | 8 ++ git-basics/.idea/vcs.xml | 6 ++ git-basics/README-LeeJiEun.md | 182 ++++++++++++++++++++++++++++++++ git-basics/images/img.png | Bin 0 -> 15041 bytes git-basics/images/img_1.png | Bin 0 -> 18506 bytes git-basics/images/img_2.png | Bin 0 -> 19112 bytes git-basics/images/img_3.png | Bin 0 -> 49257 bytes 10 files changed, 214 insertions(+) create mode 100644 git-basics/.idea/.gitignore create mode 100644 git-basics/.idea/.name create mode 100644 git-basics/.idea/git-basics.iml create mode 100644 git-basics/.idea/modules.xml create mode 100644 git-basics/.idea/vcs.xml create mode 100644 git-basics/README-LeeJiEun.md create mode 100644 git-basics/images/img.png create mode 100644 git-basics/images/img_1.png create mode 100644 git-basics/images/img_2.png create mode 100644 git-basics/images/img_3.png diff --git a/git-basics/.idea/.gitignore b/git-basics/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/git-basics/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/git-basics/.idea/.name b/git-basics/.idea/.name new file mode 100644 index 0000000..3f308f0 --- /dev/null +++ b/git-basics/.idea/.name @@ -0,0 +1 @@ +README-LeeJiEun.md \ No newline at end of file diff --git a/git-basics/.idea/git-basics.iml b/git-basics/.idea/git-basics.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/git-basics/.idea/git-basics.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/git-basics/.idea/modules.xml b/git-basics/.idea/modules.xml new file mode 100644 index 0000000..9c07b06 --- /dev/null +++ b/git-basics/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/git-basics/.idea/vcs.xml b/git-basics/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/git-basics/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/git-basics/README-LeeJiEun.md b/git-basics/README-LeeJiEun.md new file mode 100644 index 0000000..7293237 --- /dev/null +++ b/git-basics/README-LeeJiEun.md @@ -0,0 +1,182 @@ +# Git 기초 + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. +- git + - local에서 프로젝트 기록을 스스로 관리할 수 있다. + - 다른 개발자와 코드를 실시간으로 공유할 수 없다. + - **버전 관리 '프로그램'** +- github + - 클라우드 서버를 사용하여 local에서 버전 관리한 코드를 업로드하여 공유 가능하다. + - **버전 관리, 소스 코드 공유, 분산 버전 제어 등이 가능한 원격 저장소** + + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. +- Working Directory + - 실제 코드를 수정&추가하여 변경이 이루어지는 영역 + - git 이력과 관련된 정보가 저장되어 있는 .git 을 제외한 모든 영역 +- git add + - 현재 Working Directory 상의 변경 내용을 Staging Area로 이동시키는 명령어, 새로운 파일이 생겼다는 것을 알리는 행위 + - Staging Area : Working Directory 에서 Repository로 정보가 저장되기 전 준비 영역 + +- git commit + - 파일 및 폴더의 변경 사항을 Local Repository에 기록하는 명령어 + - 특정 작업이 완결된 상태로 바뀌었다는 것을 의미함 + +- git push + - 변경 사항을 Remote Repository에 기록하는 명령어 + + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. +- branch : 독립적으로 작업을 진행하기 위한 개념 +- HEAD : branch의 가장 최신 commit을 가리키는 포인터 +- branch와 HEAD + - commit을 하면 HEAD가 가리키는 branch가 최신 commit으로 이동한다. + - + + - 여기서 highlevel branch를 만들면 highlevel branch은 HEAD가 가리키던 커밋을 가리키게 된다. + - + + - **git checkout highlevel**을 입력하면 HEAD가 highlevel branch를 가리키게 된다. + - + + - 여기서 commit을 2번 진행하면 아래와 같이 된다. + - + +- [출처 : https://charles098.tistory.com/24] + + + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 + - git clone : 저장소로부터 프로젝트를 복제하는 명령어 + - git init : 해당 폴더를 git으로 관리할 수 있게 해주는 명령어 + - git clone은 **기존 저장소를 복제하는 것** / git init은 **기존에 사용하던 디렉토리를 Git 저장소로 만드는 것** +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + - origin : 깃허브 저장소 주소를 가리키는 키워드 + - git remote add origin {원격 저장소 주소} : 로컬 저장소에 원격 저장소를 등록 + - git remote remove origin : 원격 저장소를 git의 설정에서 삭제 + + + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. +- git reset <커밋ID> : 과거 commit 지점으로 이동하고, 이동된 이후의 commit은 삭제하는 명령어 + 1. git reset –hard : 해당 커밋ID의 상태로 이동하고, Working Directory와 Index영역 모두 초기화한다. + 2. git reset –mixed : 해당 커밋ID의 상태로 이동하고, Index영역은 초기화되고 Working Directory는 변경되지 않는다. + 3. git reset –soft : 해당 커밋ID의 상태로 이동하고, Index영역과 Working Directory 모두 변경되지 않고, commit된 파일들을 staging area로 돌려놓는다. + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. +- Pull Requst(PR) + - 사용자가 원격 저장소에 push했을 때, 다른 사용자에게 push된 상황을 알리는 것을 말한다. + - PR를 보내면 여러 동료들에게 리뷰를 받을 수 있고, 내가 올린 코드에 동료가 병합하여 진행할 수도 있다. +- Merge + - git branch를 다른 branch로 합치는 과정 + - 기본 단위는 branch + - 종류 + - Fast-Forward + - ![fast-forward](https://wikidocs.net/images/page/153693/05.03.01.jpg) + - Fast-foward 상태 : master와 dev1이 각각 가리키는 commit은 동일 선상에 위치하고 있다. 이때 두 branch는 Fast-foward 상태에 있다고 한다. + - 새로운 commit을 만들지 않는다. + - 빨리 감기(fast-forward) : 뒤에 쳐진 branch(master)의 참조 개체가 앞서있는 branch가 가리키는 개체를 참조하도록 이동한다.(마치 브랜치가 점프 하듯) + - 사용 예 : master로 개발을 진행하다 어떤 내용을 수정해야 하는데, master에서 테스트하기 힘든 경우 다른 branch로 해당 내용을 수정하고 후에 합병할 때 사용 + - 3-Way Merge + - ![3-way merge](https://wikidocs.net/images/page/153693/05.03.03.jpg) + - 두 브랜치 모두 base에서 commit을 진행해서 분기해 나간 상태가 되었다. 두 브랜치 중 어느 것도 base에 위치하지 않는다. + - 새로운 commit을 만든다. + - 3-way : 내용을 병합할 때, base와 각 브랜치 2개가 참조하는 commit을 기준으로 병합을 진행하기 때문이다. + + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. +- rebase + - git rebase [브랜치명] : 현재 브랜치가 해당 브랜치(브랜치명)에부터 분기하도록 재배치 + - 새로운 commit을 만들지 않는다. + - commit 이력을 명확하게 남기고자 한다면 merge, 간결하게 정리된 것을 원한다면 rebase를 사용하면 좋다. + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. +- git stash + - 파일의 변경 내용을 일시적으로 기록해두는 영역 + - 명령어 + - git stash save "message" : 메세지O + - git stash : 메세지X + - 활용 : 현재 내가 하고 있는 업무보다 우선순위가 높은 새로운 업무를 받거나, 버그를 당장 고쳐야할 때 + - 다시 불러오는 명령어 : + - git stash pop : 목록에서 사라지고 불러옴 + - git stash apply : 목록에서 사라지지 않고 불러옴 + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- `git rebase --interactive`란? + - 이미 커밋한 히스토리를 변경하거나 또는 삭제하거나, 내용을 추가해야하는 상황에 사용 + - git rebase -i ${수정할 커밋의 직전 커밋} + - vim 에디터로 로그 메시지를 수정 +- branch의 upstream이란? + - upstream : 물줄기가 위에서 밑으로 내려올 때, 그 위에서 원천이 되는 source + - ![upstream, orgin](https://velog.velcdn.com/images/rkio/post/013929f9-e277-48d7-bd6d-0bae04291209/image.png) + - git push --set-upstream : 위계 질서를 정립하기 위해서 origin을 main 브랜치의 upstream으로 설정하는 명령어 + - == git push -u origin main + - 매번 -u를 할 필요없이 처음 push에만 해주면 된다. +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. + - fork + - 다른 사람의 레포지토리에서 어떤 부분을 수정하거나, 추가 기능을 넣고 싶을 때 사용한다. + - fork 한 저장소는 원본 레포지토리(내가 연결한 레포지토리)와 연결되어 있다. + - clone + - 원본 레포지토리의 내용을 내 로컬 레포지토리로 완전히 복사한다. + - clone한 프로젝트는 원본 레포지토리의 로그를 볼 수 없다. + - 원본 작업의 변화를 알고 싶거나 원본 작업을 수정해서 반영하고 싶다면 fork, 단순히 원본의 코드를 복사해서 작업하는 것이라면 clone +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 + - git pull + - 원격 서버에서 최신 커밋들을 내려받아서 현재 로컬 브랜치와 자동 병합 + - pull 자동 병합이 문제가 발생할 때, fetch 방식을 사용해야 한다. + - git fetch + - 원격 저장소에서 커밋된 코드를 임시 브랜치로 다 내려받고, merge 명령어를 이용해서 수동 병합한다. + - 현재 브랜치와 자동 병합 X +- `reset --hard`와 `push/pull --force`의 적절한 사용법 + - git reset --hard + - 파일과 커밋 모두 명시된 시점으로 돌리는데, 파일을 되돌릴 수 없다. + - soft: uncommit changes, changes are left staged (index). (과거로 돌아가서 Staging Area도 현재와 같이 유지하고 싶을 때. git add 안해도 돼서 편하네) + - mixed (default): uncommit + unstage changes, changes are left in working tree. (과거 시점으로 돌아가고 Staging Area에 있는 파일도 모두 제거하고 싶을 때. git add도 내가 다시 할래) + - hard: uncommit + unstage + delete changes, nothing left. (현재의 코드, 커밋에 미련없이 과거로 돌아가고 싶을 때. 현재에 미련없음. 나 돌아갈래.) + - push --force + - 원격 저장소와 호환이 되지 않아 오류가 생겼을 때, 원격 저장소의 내용이 로컬 저장소의 내용과 일치하도록 원격 저장소의 내용들을 강제로 덮어쓰게 하는 명령어 + - 사용을 지양하라 + - 변경된 내용들을 현재 사용자 이외에는 pull 할 경우가 없을 때(원격 저장소를 혼자서 사용할 때) 사용하는 것이 좋다. + - pull --force + - local이 날라가도 괜찮을 때 +- `.gitignore` 사용법 + - git init 을 한 폴더에 .gitignore 이라는 이름으로 파일을 하나 만든다. + - 그 안에 한 줄씩 제외할 파일 혹은 폴더 이름을 쓴다. +- 브랜치 이름은 `parent/child-1`, `parent/child-2`는 가질 수 있지만 `parent`, `parent/child`는 가질 수 없다. 무슨 이유 때문인지. + - 슬래시로 계층적인 구조로 만들어서 사용할 수 있는데 + - parent를 생성한 후 parent/child를 생성하면 브랜치가 아닌 child라는 파일이 생성된다. +- 리포지토리의 두 타입인 bare, non-bare + - bare repository + - (벌거 벗은) + - 작업 공간이 없고 변경 사항만 추적하는 저장소 + - git init --bare + - non-bare repository + - git clone, git init을 하게 되면 기본적으로 생성되는 repository + - 작업 공간을 함께 생성 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. \ No newline at end of file diff --git a/git-basics/images/img.png b/git-basics/images/img.png new file mode 100644 index 0000000000000000000000000000000000000000..f567d7c0215f106a2a75a8e512a67512c51a9d63 GIT binary patch literal 15041 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 literal 0 HcmV?d00001 diff --git a/git-basics/images/img_1.png b/git-basics/images/img_1.png new file mode 100644 index 0000000000000000000000000000000000000000..28155acd1390747795ab37f6a307d4fd46bdc35d GIT binary patch literal 18506 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 literal 0 HcmV?d00001 diff --git a/git-basics/images/img_2.png b/git-basics/images/img_2.png new file mode 100644 index 0000000000000000000000000000000000000000..49a22f6e6c558c0a28aa813520f03ea2634a8ffd GIT binary patch literal 19112 zcmd>lRaBf^vu1D&5*l|+;~pTmYoM_J!95UMg1ftGa0%`S?ry;)xVyWln_yP^9B;|<_&}aJS_MV$MUSY zH*cgYB}D|49JLNo;T!>zkN!TvZz1H-c0}nifFA(dyT3K>eqSx#J!m)W{>~uz0F9LI zd9Hst1id^k00N%Bfq;t$^ZZ!I|Nr`9323W2Y04H( zaTLIQ{NTNLC9OluKAZQ`+7T3t%X%caij=18LkTm2pZD`V(G%tP zX9^Y+izu!iJ@C%tb_jto&I84tvJG5@oT;hpx3&8|fPl}s;ctcR@0#<73o2^47~K}< z!}#oxz4?WJjxWQ5U0ooP1gst!2xHyl!O*1-$Te)IlTjvn?$PF4-*P9+%c_K56e$6- zY!>p{C83a&_1wSdBP+x2h@Aa2OIQAy$GD=mFFIcJ(KC*sIJnpB&T}_6896|6WlYgj zP_mJD+MR@a5%Q>2JwbHixA0u_8ujktTLmo3bc>L_WB?)Q7j zk^T936y%$xi!)x}t#0*VR;kEG$GXwrY0Hs%t$q# z3gW*hy$Ec=(Q2hoHOW^^+3HW|`97N)COOLU{w2a-ueMYp`DVtLdTch$@brsS>|Cf{ z#AC{~of`PN>SG}y)z{V2`BC5JedTm}f8!Wj;F%gD=@E9<- z6%Wkb7La~Sg_rF06^Tp2S9YjX6CU3csM%y|Ibglo8A_!7Q8>>=$Dyy^P-^`g5bOQ*CePk%9z z@qLq;#bQ^YvUcCJ;!;#vwsyiOZF6izfwp8sR9Te<8WLPvB%S|j0QtoWy7)L=4ka_+Dp*70k0B{Qb{Sn`_gn$0{pr>T(@qw z63h;x4uc6Cg4IA5h1uKg}CExnvMS(*E#RoxLt*-GsM z3Z~)W6WaGzNb;|f_%iRSgk)o7}gG83D_cWDl5<>7fK0%yN}WthG% z3OWCAqZ>_+lu?nAu)dydGxqb3h_ zhbp=(WIcI+UEuT%W4!q@t|ffu0^__6daye2Ug4uTY}uLCBD^r{(2h<0{n-lb#-7QM z!~@1|e--h(;$muF`983flXX>=uCC#yX6DW3rEDt&Dwn>31B-Vc@2kg~Z49z{H z*VN@n0ECQupJvmiKWlBfw=~}O`Oq+4ID$Unvt%HN=1C8OhMOkVAmUV<`6zs_FF^x% z3Ab_c7xx!qBWS^LVog7tfoXf+%h=4u1a4)V)Fp)tg-+JFpQ6P+-D4vLDq5UC{M!ry zI@ExyQ>Ybe&6t!awm|>)Zd7?`3t#Zq3KI|7@k`BvfPs` zd1Zt1Od3*Bgtt`i+%ImJ9c6xi++<6}{*0~(;xbOa57JoIm2G{)rVXaNJY~S*qxPR3 zoTk&G4FR0Rn@3!(tV{IMMb9l>A!`f#y5&OFNgky2$zkHC@NNgrW?ju4zQ%idS{hkK z$@vd)SEtXRh798HLp>$!nIt)fFii6L&v;o6vny z=ZLmtv}AnRIrDvo`@nsR=xeg}7-#B6{`S>_Q{-8d$)GHoCJAF-#AZr6e<31nK4-

pE~ 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ⅅ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 literal 0 HcmV?d00001 From a8ccacb7329166c265009922f7ec2cd6415e5953 Mon Sep 17 00:00:00 2001 From: Wonseok Date: Mon, 14 Aug 2023 00:45:00 +0900 Subject: [PATCH 21/73] =?UTF-8?q?LeeJisu=20step-1=20=EC=99=84=EB=A3=8C=20(?= =?UTF-8?q?#31)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 새로 구현한 기능 및 주요 변경점 # 버그 해결 💊 해결한 버그 # 리팩토링 🛠 리팩토링 내역 # 스크린샷 🖼 변경된 부분에 대한 스크린샷 # 비고 ✏ 리뷰어에게 전하는 말 등
사용하지 않은 항목은 모두 지워주세요. --- git-basics/README-LeeJisu.md | 113 +++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 git-basics/README-LeeJisu.md diff --git a/git-basics/README-LeeJisu.md b/git-basics/README-LeeJisu.md new file mode 100644 index 0000000..fec73f9 --- /dev/null +++ b/git-basics/README-LeeJisu.md @@ -0,0 +1,113 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. +### git +- 오픈 소스 '버전 관리' 시스템 +- local에서 버전 관리 +- branch 생성 및 이전 branch로 복구, 삭제, 병합 가능 +- 로컬 저장소를 사용하기 때문에 **다른 개발자와 실시간으로 작업 공유 불가능** +### github +- git repository를 위한 웹 기반 '호스팅' 서비스 +- 클라우드 서버를 사용해서 local에서 버전 관리한 소스 코드를 업로드하여 **공유 가능** + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. +### Working Directory +개발하는 위치(=어떤 프로젝트를 진행할 때 그 프로젝트가 위치하고 있는 공간)이다. +### Staging Area +commit을 수행할 대상 파일들이 위치하는이다. Working directory에 존재하는 파일을 'git add [파일명]'을 통해서 Staging Area으로 위치시킨다. +### Local Repo +로컬에 존재하는 Git directory(.git 폴더)로, 프로젝트의 메타 데이터나 commit 등의 정보가 저장되는이다. +### Remote Repo +실제 Github에 존재하는 Repository이다. + +### Git Add +다음 변경(commit)을 기록할 때까지 변경분을 모아놓는 작업이다. +### Git Commit +Staging Area에 저장되어 있는 변경 사항들을 로컬저장소에 등록하는 것이다. => 변경사항 확정 +### Git Push +commit된 파일들을 원격(remote) 저장소에 모두 업로드하는 것이다. + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. +### branch +branch는 독립적으로 어떤 작업을 진행하기 위한 개념이다. 필요에 의해 만들어지는 각각의 branch는 다른 branch의 영향을 받지 않기 때문에 여러 작업을 동시에 진행할 수 있다. 다른 branch와의 병합(Merge)을 통해 작업한 내용을 다시 새로운 하나의 branch로 모을 수도 있다. +- 생성 : git branch [브랜치명] +- 삭제 : git branch -D [브랜치명] +- 이동 : git checkout [브랜치명] +- 생성 + 이동 : git checkout -b [브랜치명] + +### HEAD +HEAD는 현재 checkout된 branch의 '가장 최신' commit을 가리킨다. 따라서 branch를 변경하게 되면 변경한 branch의 가장 최신 commit을 가리키게 된다. + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +### git init +기존 프로젝트에 git을 초기화하는 명령으로, 로컬 저장소가 생기며 원격 저장소에 대한 정보(remote)는 없다. + +### git clone +반대로 'git clone'은 원격 저장소의 정보를 불러와 로컬 저장소를 생성하는 것이기 때문에 원격 저장소에 대한 정보가 있다. + +### origin +원격 저장소를 의미한다. + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. +### git reset –hard +- Working Directory와 Staging Area 모두 초기화 + +### git reset –mixed +- Working Directory 변경 X +- Staging Area 초기화 O + +### git reset –soft +- Working Directory와 Staging Area 모두 변경 X + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. +### Pull Request +사용자가 원격 저장소에 push하여 새로운 사항이 적용됐을 경우, 이를 다른 사용자에게 알리는 것을 말한다. + +### Merge +git branch를 다른 branch로 합치는 것이다. +- Fast-Forward : +- 3-way Merge : + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push/pull --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 `parent/child-1`, `parent/child-2`는 가질 수 있지만 `parent`, `parent/child`는 가질 수 없다. 무슨 이유 때문인지. +- 리포지토리의 두 타입인 bare, non-bare + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. \ No newline at end of file From 9f63ed171d44cb4d479f0e0e470cc04a6bcdc3ee Mon Sep 17 00:00:00 2001 From: Cotidie Date: Mon, 14 Aug 2023 00:45:56 +0900 Subject: [PATCH 22/73] =?UTF-8?q?step-1=20git-basics=20=ED=8F=B4=EB=8D=94?= =?UTF-8?q?=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-basics/.idea/.gitignore | 8 -------- git-basics/.idea/.name | 1 - git-basics/.idea/git-basics.iml | 9 --------- git-basics/.idea/modules.xml | 8 -------- git-basics/.idea/vcs.xml | 6 ------ git-basics/{ => 19th}/README-JinSeoHyun.md | 0 git-basics/{ => 19th}/README-LeeJiEun.md | 0 git-basics/{ => 19th}/README-LeeJisu.md | 0 git-basics/{ => 19th}/README-parkjunhyeong.md | 0 .../README-\352\271\200\353\257\274\354\232\261.md" | 0 .../README-\354\235\264\354\204\270\355\230\225.md" | 0 git-basics/{ => 19th}/images/image-1.png | Bin git-basics/{ => 19th}/images/image-2.png | Bin git-basics/{ => 19th}/images/image-3.png | Bin git-basics/{ => 19th}/images/image-4.png | Bin git-basics/{ => 19th}/images/image.png | Bin git-basics/{ => 19th}/images/img.png | Bin git-basics/{ => 19th}/images/img_1.png | Bin git-basics/{ => 19th}/images/img_2.png | Bin git-basics/{ => 19th}/images/img_3.png | Bin 20 files changed, 32 deletions(-) delete mode 100644 git-basics/.idea/.gitignore delete mode 100644 git-basics/.idea/.name delete mode 100644 git-basics/.idea/git-basics.iml delete mode 100644 git-basics/.idea/modules.xml delete mode 100644 git-basics/.idea/vcs.xml rename git-basics/{ => 19th}/README-JinSeoHyun.md (100%) rename git-basics/{ => 19th}/README-LeeJiEun.md (100%) rename git-basics/{ => 19th}/README-LeeJisu.md (100%) rename git-basics/{ => 19th}/README-parkjunhyeong.md (100%) rename "git-basics/README-\352\271\200\353\257\274\354\232\261.md" => "git-basics/19th/README-\352\271\200\353\257\274\354\232\261.md" (100%) rename "git-basics/README-\354\235\264\354\204\270\355\230\225.md" => "git-basics/19th/README-\354\235\264\354\204\270\355\230\225.md" (100%) rename git-basics/{ => 19th}/images/image-1.png (100%) rename git-basics/{ => 19th}/images/image-2.png (100%) rename git-basics/{ => 19th}/images/image-3.png (100%) rename git-basics/{ => 19th}/images/image-4.png (100%) rename git-basics/{ => 19th}/images/image.png (100%) rename git-basics/{ => 19th}/images/img.png (100%) rename git-basics/{ => 19th}/images/img_1.png (100%) rename git-basics/{ => 19th}/images/img_2.png (100%) rename git-basics/{ => 19th}/images/img_3.png (100%) diff --git a/git-basics/.idea/.gitignore b/git-basics/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/git-basics/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/git-basics/.idea/.name b/git-basics/.idea/.name deleted file mode 100644 index 3f308f0..0000000 --- a/git-basics/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -README-LeeJiEun.md \ No newline at end of file diff --git a/git-basics/.idea/git-basics.iml b/git-basics/.idea/git-basics.iml deleted file mode 100644 index d6ebd48..0000000 --- a/git-basics/.idea/git-basics.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/git-basics/.idea/modules.xml b/git-basics/.idea/modules.xml deleted file mode 100644 index 9c07b06..0000000 --- a/git-basics/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/git-basics/.idea/vcs.xml b/git-basics/.idea/vcs.xml deleted file mode 100644 index 6c0b863..0000000 --- a/git-basics/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/git-basics/README-JinSeoHyun.md b/git-basics/19th/README-JinSeoHyun.md similarity index 100% rename from git-basics/README-JinSeoHyun.md rename to git-basics/19th/README-JinSeoHyun.md diff --git a/git-basics/README-LeeJiEun.md b/git-basics/19th/README-LeeJiEun.md similarity index 100% rename from git-basics/README-LeeJiEun.md rename to git-basics/19th/README-LeeJiEun.md diff --git a/git-basics/README-LeeJisu.md b/git-basics/19th/README-LeeJisu.md similarity index 100% rename from git-basics/README-LeeJisu.md rename to git-basics/19th/README-LeeJisu.md diff --git a/git-basics/README-parkjunhyeong.md b/git-basics/19th/README-parkjunhyeong.md similarity index 100% rename from git-basics/README-parkjunhyeong.md rename to git-basics/19th/README-parkjunhyeong.md diff --git "a/git-basics/README-\352\271\200\353\257\274\354\232\261.md" "b/git-basics/19th/README-\352\271\200\353\257\274\354\232\261.md" similarity index 100% rename from "git-basics/README-\352\271\200\353\257\274\354\232\261.md" rename to "git-basics/19th/README-\352\271\200\353\257\274\354\232\261.md" diff --git "a/git-basics/README-\354\235\264\354\204\270\355\230\225.md" "b/git-basics/19th/README-\354\235\264\354\204\270\355\230\225.md" similarity index 100% rename from "git-basics/README-\354\235\264\354\204\270\355\230\225.md" rename to "git-basics/19th/README-\354\235\264\354\204\270\355\230\225.md" diff --git a/git-basics/images/image-1.png b/git-basics/19th/images/image-1.png similarity index 100% rename from git-basics/images/image-1.png rename to git-basics/19th/images/image-1.png diff --git a/git-basics/images/image-2.png b/git-basics/19th/images/image-2.png similarity index 100% rename from git-basics/images/image-2.png rename to git-basics/19th/images/image-2.png diff --git a/git-basics/images/image-3.png b/git-basics/19th/images/image-3.png similarity index 100% rename from git-basics/images/image-3.png rename to git-basics/19th/images/image-3.png diff --git a/git-basics/images/image-4.png b/git-basics/19th/images/image-4.png similarity index 100% rename from git-basics/images/image-4.png rename to git-basics/19th/images/image-4.png diff --git a/git-basics/images/image.png b/git-basics/19th/images/image.png similarity index 100% rename from git-basics/images/image.png rename to git-basics/19th/images/image.png diff --git a/git-basics/images/img.png b/git-basics/19th/images/img.png similarity index 100% rename from git-basics/images/img.png rename to git-basics/19th/images/img.png diff --git a/git-basics/images/img_1.png b/git-basics/19th/images/img_1.png similarity index 100% rename from git-basics/images/img_1.png rename to git-basics/19th/images/img_1.png diff --git a/git-basics/images/img_2.png b/git-basics/19th/images/img_2.png similarity index 100% rename from git-basics/images/img_2.png rename to git-basics/19th/images/img_2.png diff --git a/git-basics/images/img_3.png b/git-basics/19th/images/img_3.png similarity index 100% rename from git-basics/images/img_3.png rename to git-basics/19th/images/img_3.png From 045aadf036a14f2491580822196238d1b19ae688 Mon Sep 17 00:00:00 2001 From: Wonseok Date: Sun, 17 Dec 2023 18:00:39 +0900 Subject: [PATCH 23/73] =?UTF-8?q?docs:=20advanced=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-basics/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/git-basics/README.md b/git-basics/README.md index ea69ffd..d0aec18 100644 --- a/git-basics/README.md +++ b/git-basics/README.md @@ -48,10 +48,10 @@ git stash를 활용하는 방법에 대해 적어주세요. - branch의 upstream이란? (`git push --set-upstream`) - PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. - `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 -- `reset --hard`와 `push/pull --force`의 적절한 사용법 +- `reset --hard`와 `push --force`의 적절한 사용법 - `.gitignore` 사용법 -- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. -- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 ## Questions -조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. \ No newline at end of file +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From 05d14be9985ec3cd726367bd0663879fcc66aa93 Mon Sep 17 00:00:00 2001 From: HYUNTAEZZANG <163402707+HYUNTAEZZANG@users.noreply.github.com> Date: Fri, 22 Mar 2024 15:00:04 +0900 Subject: [PATCH 24/73] Step 1 jang hyun tae (#56) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 새로 구현한 기능 및 주요 변경점 # 버그 해결 💊 해결한 버그 # 리팩토링 🛠 리팩토링 내역 # 스크린샷 🖼 변경된 부분에 대한 스크린샷 # 비고 ✏ 리뷰어에게 전하는 말 등
사용하지 않은 항목은 모두 지워주세요. --- README - JangHyunTae.md | 59 +++++++++ git-basics/REAMDE-JANGHYUNTAE.md | 201 +++++++++++++++++++++++++++++++ 2 files changed, 260 insertions(+) create mode 100644 README - JangHyunTae.md create mode 100644 git-basics/REAMDE-JANGHYUNTAE.md diff --git a/README - JangHyunTae.md b/README - JangHyunTae.md new file mode 100644 index 0000000..de7e65a --- /dev/null +++ b/README - JangHyunTae.md @@ -0,0 +1,59 @@ +# 1️⃣️ Git 기초 +![git-basics](https://digitalvarys.com/wp-content/uploads/2019/06/Git-Basics-and-Beginners-Guide-1.png) +Git과 Github 사용의 첫 단계입니다. + +## 🎯️ 목표 +- [ ] git의 동작 과정 이해 +- [ ] rebase와 reset 이해 +- [ ] Github 저장소 clone 하기 +- [ ] 브랜치를 만들고 커밋 쌓기 +- [ ] Pull Request와 Merge +- [ ] Markdown 문서 작성 + +## 📜️ 진행 +1. 이 리포지토리를 로컬에 clone 합니다. +```bash +# 적당한 폴더 생성 및 이동 (linux의 경우 ~/repositories 추천) +mkdir ~/repositories +cd ~/repositories + +# 현재 리포의 우측 상단에서 git clone URL 복사 후 붙여넣기 +git clone + +# 클론된 폴더로 이동 +cd study-git +``` +2. 이 브랜치(`step-1`)에서 본인의 브랜치를 만듭니다. + - 브랜치명은 `step-1-<이름>`으로 생성 +```bash +# step-1 브랜치로 이동 +git checkout step-1 + +# 본인 브랜치 생성 및 이동 +git checkout -b step-1-<이름> +``` +3. `/git-basics/README.md`를 복사하고, 빈 항목들을 조사해 채워넣습니다. + - 복사한 파일명은 `/git-basics/REAMDE-<이름>.md`로 변경 + - 채우면서 최소 5개의 커밋 쌓기 +```bash +# /git-basics/README.md 복사 +cp git-basics/README.md git-basics/README-<이름>.md + +# (README-<이름>.md를 채우면서) +git add . +git commit -m "<커밋 메시지>" +``` + +4. 본인 브랜치를 push하고 `step-1` 브랜치로 Pull Request를 올립니다. +```bash +# 브랜치를 처음 push하는 경우 원격 브랜치 등록 +# 현재 브랜치를 origin의 step-1-<이름> 브랜치와 연동한다. +# step-1-<이름> 대신 다른 브랜치명을 사용하면 해당 원격 브랜치와 연결됨. +git push --set-upstream origin step-1-<이름> +# 첫 push 이후에는 git push만 사용하면 됨 +git push +``` + +## ➕️ 추가 목표 +이제 Markdown 문서를 작성할 수 있게 되었으니, 본인의 Github 프로필을 꾸며봅시다. 아래 참고 블로그나 잘 꾸며진 프로필을 보면서 본인의 프로필을 만들어보세요. 연습을 위해 로컬 git에서 작업하시기 바랍니다. +- **참고**: [(노션) 깃허브 프로필 꾸미기!](https://80000coding.oopy.io/865f4b2a-5198-49e8-a173-0f893a4fed45) \ No newline at end of file diff --git a/git-basics/REAMDE-JANGHYUNTAE.md b/git-basics/REAMDE-JANGHYUNTAE.md new file mode 100644 index 0000000..0420621 --- /dev/null +++ b/git-basics/REAMDE-JANGHYUNTAE.md @@ -0,0 +1,201 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. + +★Git + +- 오픈 소스 버전관리 시스템 +-로컬에서 버전 관리 +- 소프트웨어 개발 및 소스 코드 관리에 사용 +git은 브랜치를 생성 이전 브랜치로 복구,삭제,병합 가능. +하지만 로컬 저장소를 사용하기 때문에 다른 개발자와 실시간으로 작업을 공유할 수 없습니다. + + +★Git hub +- Git을 사용하는 프로젝트를 지원하는 웹 호스팅 서비스 +- 클라우드 서버를 사용해서 로컬에서 버전 관리한 소스코드를 공유 가능 +- 분산 버전 제어, 액세스 제어, 버그 추적 작업 관리를 제공 + + +Git은 버전 관리 프로그램이고, Github는 버전 관리,소스코드 공유가 가능한 원격 저장소 입니다. + + + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. + +Git Merge, Git Fetch는 생략해도 됩니다. + +★Working Directory (작업 디렉토리): + + - 현재 작업 중인 프로젝트의 실제 파일이 저장된 디렉토리입니다. 작업 디렉토리 내에서 파일을 수정하고 변경을 추적하는 것이 Git의 주요 목적 중 하나입니다. + +★Git Add: +- Git Add 명령어는 작업 디렉토리에서 파일을 스테이징 영역(Staging Area 또는 Index라고도 함)으로 추가합니다. 이 단계에서 Git은 스테이징 영역에 추가된 파일의 변경 사항을 추적하게 됩니다. +★Git Commit: +- Git Commit 명령어는 스테이징 영역에 있는 변경 사항을 로컬 저장소에 영구적으로 저장합니다. 이러한 커밋은 프로젝트의 버전 히스토리를 만듭니다. 각 커밋은 메시지와 함께 설명되어야 합니다. + +★Git Push: +- Git Push 명령어는 로컬 저장소의 커밋을 원격 저장소로 전송합니다. +이것은 다른 개발자들과 작업을 공유하거나, +작업한 내용을 원격 저장소에 백업하는 데 사용됩니다. 주로 Git 서버에 변경 사항을 업로드하는 데 사용됩니다. +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + +★커밋(Commit): + +- 커밋은 프로젝트의 변경 사항을 저장하는 기록입니다. +각 커밋은 고유한 해시값을 가지며, 변경된 내용, 작성자, 작성 일시 등의 정보를 포함합니다.\ +커밋을 통해 프로젝트의 특정 시점의 상태를 저장하고 관리할 수 있습니다. + +★브랜치(Branch): + +- 브랜치는 커밋의 참조로, 프로젝트의 특정 기능 또는 작업을 개발하는 독립적인 경로를 나타냅니다. +각 브랜치는 커밋의 연속으로 이루어져 있으며, 하나의 브랜치에서 다른 브랜치로 전환할 수 있습니다.\ +브랜치를 통해 여러 작업을 병렬로 진행하거나, 실험적인 변경을 테스트할 수 있습니다. + +★HEAD: + +- HEAD는 현재 작업 중인 브랜치를 가리키는 포인터입니다. +HEAD는 일반적으로 최신 커밋을 가리키며, 작업 디렉토리에 반영되는 변경 사항은 HEAD가 가리키는 커밋에 따라 결정됩니다. +★git checkout: + +- git checkout 명령어는 브랜치를 변경하거나 특정 커밋으로부터 파일을 되돌리는 데 사용됩니다.\ +브랜치를 변경할 때는 새로운 브랜치를 만들거나 기존의 브랜치로 전환할 수 있습니다.\ +특정 커밋으로부터 파일을 되돌릴 때는 해당 커밋의 상태로 작업 디렉토리를 복원합니다. + +브랜치 생성, 삭제, 이동 +- +브랜치 생성: git branch + +브랜치 삭제: git branch -d + +브랜치 이동: git checkout + + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +★git clone vs git init★ + +★git clone: +- 이미 존재하는 원격 저장소의 내용을 로컬로 복제합니다. 원격 저장소에서 모든 히스토리와 브랜치를 가져옵니다. +bash +Copy code +git clone + +★git reset --mixed +- 명령어를 사용합니다. (기본값) +이 명령어는 HEAD를 특정 커밋으로 이동시키고, 해당 커밋 이후의 변경 사항을 스테이징 영역에 유지하지 않습니다. +변경 사항은 작업 디렉토리에 유지되며, 스테이징 영역에서 삭제됩니다. +이후에 변경 사항을 스테이징하고 다시 커밋할 수 있습니다. + + +★git reset --hard +- 명령어를 사용합니다. +이 명령어는 HEAD를 특정 커밋으로 이동시키고, 해당 커밋 이후의 변경 사항을 모두 삭제합니다. +스테이징 영역과 작업 디렉토리의 변경 사항이 모두 제거되므로 주의해야 합니다. + 다시 되돌릴 수 없는 변경 사항을 삭제할 때 사용합니다. + + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. +★Pull Request (풀 리퀘스트): + +- Pull Request는 코드 변경 사항을 다른 개발자들과 검토하고 병합하기 위해 사용됩니다. +일반적으로 Pull Request는 원격 저장소(예: GitHub, GitLab)에서 생성되며, 코드 변경 사항을 포함한 특정 브랜치를 기준으로 다른 브랜치로 병합하고자 할 때 사용됩니다. +Pull Request를 생성하면 다른 개발자들이 변경 사항을 검토하고 논의할 수 있으며, 코드 변경 사항에 대한 피드백을 주고 받을 수 있습니다. + +Merge (병합): + +- Merge는 두 개의 다른 브랜치를 하나로 합치는 과정을 의미합니다. +Git에서는 주로 두 가지 타입의 Merge가 사용됩니다: + +★Fast-Forward Merge와 3-Way Merge. + +★Fast-Forward Merge: + +- Fast-Forward Merge는 브랜치 간의 차이가 없는 경우에만 발생합니다. +예를 들어, 특정 브랜치에서 작업한 변경 사항을 모두 커밋하고, 해당 브랜치가 기준 브랜치의 최신 커밋을 가리키게 될 때 Fast-Forward Merge가 발생합니다. +이 경우 Git은 단순히 브랜치 포인터를 앞으로 이동시켜 기준 브랜치의 최신 커밋을 가리키게 합니다. + +★3-Way Merge: + +- 3-Way Merge는 두 브랜치 간에 충돌이 발생할 때 사용됩니다. +예를 들어, 두 개의 브랜치에서 동일한 파일의 동일한 부분을 동시에 수정한 경우에 충돌이 발생합니다.\ +Git은 두 브랜치의 공통 조상 커밋을 찾아내고, 각 변경 사항을 비교하여 충돌을 해결합니다.\ +충돌이 발생한 파일에 대해 개발자가 직접 수정하고 충돌을 해결한 후, +수정 사항을 다시 커밋하여 Merge를 완료할 수 있습니다. +\ +Pull Request와 Merge를 통해 팀원들 간의 협업을 원활하게 할 수 있으며, 코드 변경 사항을 효율적으로 검토하고 병합할 수 있습니다. Fast-Forward Merge는 단순한 상황에서 사용되며, 3-Way Merge는 충돌이 발생한 경우에 사용됩니다. + + + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. + +★Rebase +- Git에서의 Rebase(리베이스)는 브랜치의 커밋 히스토리를 재정렬하거나 변경하는 작업을 의미합니다. 기본적으로 Rebase는 두 브랜치를 합치는 Merge 작업과 유사하지만,커밋 히스토리를 보다 깔끔하게 유지할 수 있도록 도와줍니다. + +★Rebase를 사용하는 경우에는 보통 다음과 같은 상황에서 유용합니다: + +★커밋 히스토리 정리: + +- 여러 개의 작은 커밋을 하나의 큰 커밋으로 합치거나, 불필요한 중간 커밋을 삭제할 때 Rebase를 사용할 수 있습니다. +이를 통해 브랜치의 커밋 히스토리를 보다 깔끔하고 의미 있게 관리할 수 있습니다. + +★베이스 변경: + +- 현재 브랜치가 다른 브랜치의 최신 상태를 반영해야 할 때 Rebase를 사용할 수 있습니다. +예를 들어, 기능 브랜치를 개발하는 동안 메인 브랜치가 업데이트된 경우, 기능 브랜치를 메인 브랜치의 최신 상태로 리베이스하여 충돌을 최소화하고 통합할 수 있습니다. + +★병합 충돌 최소화: + +- Rebase를 사용하면 Merge와 달리 두 브랜치의 공통 조상부터 변경 사항을 적용하기 때문에, 충돌이 발생할 가능성이 낮아집니다. +따라서 Rebase를 사용하여 병합 충돌을 최소화하고, 코드를 더 빠르고 쉽게 통합할 수 있습니다. + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. + +★Stash +- 현재 작업 중인 변경 사항을 임시로 저장하고, 작업 디렉토리를 깨끗한 상태로 만들어주는 Git의 유용한 기능입니다. 변경 사항을 나중에 다시 적용하고 싶을 때 사용됩니다. + +★ 명령어 모음 +- $git stash +// git stash (변경 내용 임시저장하기) + +- $git stash list +(내가 stash 했던 내용 보기) + +- $git stash apply +(가장 최근 stash 가지고 오기) +- $git stash drop (가장 최근 stash 지우기) + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. \ No newline at end of file From 09aac6740134eb3b5d3fe0bbea830b623a164bfc Mon Sep 17 00:00:00 2001 From: Gimlocal <127363458+Gimlocal@users.noreply.github.com> Date: Fri, 22 Mar 2024 15:00:22 +0900 Subject: [PATCH 25/73] Step-1-kimhyunjin (#54) --- git-basics/README-hyunjin.md | 128 +++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 git-basics/README-hyunjin.md diff --git a/git-basics/README-hyunjin.md b/git-basics/README-hyunjin.md new file mode 100644 index 0000000..33a5924 --- /dev/null +++ b/git-basics/README-hyunjin.md @@ -0,0 +1,128 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) + + +⸰ Git은 개인 컴퓨터에서 돌아가는 Version Control System이다. 반면에 GitHub은 Github라 불리는 회사에서 서비스하고 있는 서버에 올라간 Git이다. + +⸰ 즉 개인 컴퓨터에서 사용하는 Git을 Local Git이라 부르고, Github이나 Gitlab과 같은 클라우드에 저장하는 Git을 Remote Git이라 부른다. + +⸰ 출처 : https://kotlinworld.com/265 + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. + + +⸰ Working Directory : 사용자의 작업 공간으로서, 로컬 저장소에 접근할수 있으며 실제 파일을 수정하거나 생성하는 공간이다.작업 폴더에서 .git 디렉토리를 제외한 나머지 부분. 파일들을 추적(tracked)/비추적(untracked) 상태로 구분한다. + +⸰ Staging area : commit이 가능한 영역으로, commit하기 전 파일을 담아두는 상자라고 볼 수 있다. + +⸰ Local repository : 본인의 컴퓨터에 저장된 로컬 버전의 프로젝트 저장소. + +⸰ Remote repository : Local repo와는 반대로 내 컴퓨터가 아닌 (일반적으로 원격 서버) 버전의 프로젝트 저장소. + +⸰ Working directory에 있는 작업물을 git add 명령어를 통해 staging area로 보내고, git commit 명령어를 통해서 간단한 코멘트를 남겨 라벨링 후, Local repo로 보낸다. 최종적으로 git push를 통해서 Local repo에 있는 파일을 Remote repo(github)로 보낸다. + +⸰ 출처 : https://m31phy.tistory.com/146 , https://ittrue.tistory.com/94 , https://dev-jacob.tistory.com/entry/Git-Repository%EB%9E%80 + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. + + +⸰ Branch : 커밋사이를 가볍게 이동할 수 있는 포인터이다. 기본적으로 Git은 master 브랜치를 만든다. 처음 커밋하면 이 master 브랜치가 생성된 커밋을 가리킨다. 이후 커밋을 만들면 master 브랜치는 자동으로 가장 마지막 커밋을 가리킨다. git branch <브랜치이름> 명령어를 통해서 생성가능하다. + +⸰ HEAD : 현재 작업하는 로컬 브랜치를 가리킨다. + +⸰ Git checkout : 다른 브랜치로 이동할 수 있는 명령어이다. 즉 HEAD가 가리키는 브랜치를 옮긴다. + +⸰ 출처 : https://git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80 + + +## clone, init, origin + +⸰ Git init : 빈 git 저장소를 만들거나 기존 저장소를 다시 초기화하는 명령어이다. + +⸰ Git clone : git clone 과 같이 사용하며, url에 해당하는 저장소를 복제해 새 directory로 가져오는 명령어이다. + +⸰ Origin : 대표적으로 사용되는 원격 저장소의 별칭을 의미한다. + +별칭이란? - 로컬 저장소를 원격 저장소에 등록하기 위해서는 (git push) git 호스팅사 서버의 URL이 필요하다. github나 gitlab같은 호스팅사로 이용할 경우, 이 연결 URL은 프로토콜과 호스팅사 도메인으로 이루어진다. 즉 URL 주소가 길어진다. 그렇기 때문에 이 URL을 간략하게 특정 문자로 지정하는 것을 별칭이라고 한다. (별칭은 중복사용 불가능하다.) +별칭은 git remote <별칭> 로 지정하고 git remote rename <변경전> <변경후>로 바꿀수있다. 삭제는 git remote rm <별칭>으로 한다 + +⸰ 출처 : https://yoongrammer.tistory.com/21 , https://m.blog.naver.com/rinjyu/222180087428 + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) + +⸰ Reset : 총 3단계에 걸쳐서 이루어진다. (git reset 명령어) + +1. HEAD 이동 : reset 명령이 하는 첫 번째 일은 HEAD 브랜치를 이동시키는 것이다. checkout 명령처럼 HEAD가 가리키는 브랜치를 바꾸지는 않는다. HEAD는 계속 현재 브랜치를 가리키고 있고, 현재 브랜치가 가리키는 커밋을 바꾼다. (--soft 옵션을 주면 여기까지 진행.) + +2. Index(staging area) 업데이트 : Index를 현재 HEAD가 가리키는 스냅샷으로 업데이트 한다. 즉 git commit과 git add명령을 되돌리는 것이다.(--mixed 옵션을 주면 여기까지 진행. default는 --mixed 옵션) + +3. Working directory 업데이트 : working directory까지 업데이트 한다. 다시 말해 working directory파일을 강제로 덮어쓴다. 이 단계는 되돌리기가 불가능하기 떄문에 위험하다. (--hard 옵션을 주면 여기까지 진행) + +⸰ 출처 : https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0 + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) + +⸰ Pull Request : Pull Request는 사용자가 원격 저장소에 Push하여 새로운 사항이 적용됐을 경우, 다른 사용자에게 push된 상황을 알리는 것을 말한다. 이를 줄여서 PR이라고도 한다.Pull request를 보내 놓으면 여러 동료들에게 리뷰를 받을 수 있고, 내가 올린 코드에 동료가 병합하여 진행할 수도 있다. + +⸰ Merge : 말 그대로 병합. git branch를 다른 branch로 합치는 과정이다. + +1. Fast Forward Merge : 가장 기본적인 Merge이다. 현재 branch의 HEAD가 대상 branch의 HEAD까지로 옮기는 Merge이다. git switch <현재 branch>와 git merge <대상 branch> 명령어로 사용가능하다. + +2. 3-way Merge : 동시간대에 두명 이상이 commit을 하면 Fast Forward Merge가 불가능하기 때문에, 내 branch commit과 다른 branch commit을 병합해서 새로운 커밋을 생성하는 방법이다. + +⸰ 출처: https://ittrue.tistory.com/93 , https://kotlinworld.com/277 , https://wonyong-jang.github.io/git/2021/02/05/Github-Merge.html + + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) + +⸰ Rebase : 두 branch를 합치는 방법으로, Merge와는 다르게 이름 그대로 branch의 공통 조상이 되는 base를 다른 branch의 commit 지점으로 바꾸는 것이다. + +기본 전략 - 먼저 Rebase 하려는 브랜치 커밋들의 변경사항을 Patch라는 것으로 만든 다음에 임시저장소에 저장해 둔다. 그리고 이를 master 브랜치에 하나씩 적용시켜 새로운 커밋을 만든다. (git checkout feature, git rebase master, git checkout master, git merge feature를 이용한다.) + +* Rebase를 위처럼 두 브랜치를 병합하는데 사용할 수도 있지만, 단일 브랜치 내에서 rebase를 사용하여 커밋 히스토리를 정리할 수도 있다. +즉, rebase를 이용하면 작업 도중 커밋 히스토리를 수정해야 하는 상황에서 유용하게 사용할 수 있다. + +⸰출처 : https://wonyong-jang.github.io/git/2021/02/05/Github-Rebase.html + + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) + +⸰ Stash : stash(git stash 명령어)는 작업중인 변경사항을 일시적으로 저장하고 branch전환, 또는 코드 commit 시점을 유연하게 다룰 수 있게 해준다. +변경사항을 commit하기에 이른 경우, 임시저장, 다른 branch로 체크아웃할때 변경사항을 유지하고 싶은 경우에 사용한다. + +* git stash(git stash save) - 현재 작업 중인 변경 사항을 일시적으로 저장하고, 작업 디렉토리를 깨끗한 상태로 만든다. 이 때, 저장한 변경 사항은 스택에 쌓이게 된다. + +* git stash pop(git stash pop ) - 스택에 쌓인 가장 최근의 변경 사항을 불러와 작업 디렉토리에 적용된다. 이 때, 스택에서 해당 변경 사항은 제거됨. + +* git stash apply - stash를 적용한 후에도 stash가 적용되어 있는 상태를 유지한다. 임시 저장공간에서 삭제되지 않는다. 이에 대해 추가 작업을 수행하려면 다시 git stash 명령어를 실행해야 함. +만약 branch마다 적용을 하고싶다면 git stash apply를 활용하면 된다. + +* git stash list - 현재 stash들의 목록을 확인할 수 있다. + +⸰ 출처 : https://velog.io/@fkszm3/Git-stash-%EB%9E%80-%EC%96%B8%EC%A0%9C-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C + + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From d59ca3a4ae6e7a987f74de56c8eeb1258363689a Mon Sep 17 00:00:00 2001 From: hwanginseop <163392234+hwanginseop@users.noreply.github.com> Date: Fri, 22 Mar 2024 15:00:32 +0900 Subject: [PATCH 26/73] Step 1 hwanginseop (#53) Co-authored-by: Hwanginseop --- git-basics/README-Hwanginseop.md | 154 +++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 git-basics/README-Hwanginseop.md diff --git a/git-basics/README-Hwanginseop.md b/git-basics/README-Hwanginseop.md new file mode 100644 index 0000000..206a118 --- /dev/null +++ b/git-basics/README-Hwanginseop.md @@ -0,0 +1,154 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git: 소스 코드 및 파일 관리 시스템으로 + git을 이용하여 파일의 변화를 저장 및 추적이 가능하며 원하는 시점으로 되돌리거나 타인과 공유하는 것이 가능하다. + +github: 작업물을 온라인으로 저장하고 공유하는 공간. + +로컬 컴퓨터에서 git을 이용하여 작업하고 저장하여 github에 공유하고 이를 통해 github에서 협업하는 것이 가능하다. + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) + +Working Directory는 현재 내 작업물(소스코드)을 이야기 하며 +이를 Git add를 통해 원하는 파일을 선택하고 staging area에 두며 +이를 다시 git commit을 통해 로컬 컴퓨터의 저장소(Rocal repository)에 커밋메세지와 함께 저장. +로컬 레포지토리에 있는 변경사항을 git push를 통해 원격 저장소(remote repository)에 전송하고 git hub를 통해 공유된다. + +git pull은 git fetch와 git merge를 병합한 과정으로 +fetch를 통해 원격저장소에 있는 변경사항을 로컬로 가져오고 merge를 통해 로컬에 병합시킨다. + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +branch: 프로젝트의 특정 작업이나 기능을 독립적으로 분리하여 개발하기 위한 개념 + 각 브랜치는 프로젝트의 특정 상태를 나타내며, 독립적으로 변경되고 관리된다. + +commit: 소스 코드의 변경 사항 + +Head: 현재 작업중인 브랜치의 가장 최근 커밋, 즉 현재 작업중인 커밋 + +Git Checkout: 특정 브랜치로 이동할 때 사용되는 명령어로 "git checkout git-test-file"명령어 사용 시 git-test-file브랜치로 이동. + +git branch: 새로운 브랜치를 생성할 때 사용합니다. +"git branch git-test-file" 명령어를 사용하여 git-test-file라는 새로운 브랜치를 생성 + +git checkout -b new-branch: 새로운 브랜치 생성 후 해당 브랜치로 이동 + +git branch -d: 브랜치 삭제. 예시로 git branch -d git-test-file로 git-test-file삭제 + + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. + +git clone: 이미 존재하는 원격 저장소의 내용을 복제하여 로컬에 새로운 디렉토리를 생성. + 즉, 원격 저장소의 모든 내용을 가져와 로컬에 복사 + + 사용법 : git clone <원격 저장소 URL> + +git init: 현재 디렉토리나 새로운 디렉토리에 새로운 Git 저장소를 초기화 + (아무런 내용도 없는 새로운 저장소를 생성) + 이후에 파일을 추가하고 커밋할 수 있다. + + 사용법 : git init + +origin: 원격 저장소의 이름으로 git clone을 통해 원격 저장소 복제시, + origin이라는 이름으로 원격 저장소 생성 + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) + + +Soft Reset: + Soft reset은 커밋을 되돌리고 인덱스(Staging Area)에 있는 변경 사항을 유지 + + 가장 최신의 커밋을 취소하고, 그 변경 사항을 다시 스테이징 영역에 추가 + 실제로 작업 트리의 파일은 변경되지 않음 + + 사용법: git reset --soft HEAD~1 + +Mixed Reset: + Mixed reset은 커밋을 되돌리고 인덱스(Staging Area)에 있는 변경 사항을 취소 + + 최신 커밋을 취소하고, 그 변경 사항을 스테이징 영역에서 제거 + 작업 트리의 파일은 변경 내용이 그대로 유지 + + + 사용법: git reset HEAD~1 + +Hard Reset: + Hard reset은 커밋을 되돌리고 작업 트리와 인덱스에 있는 변경 사항을 모두 삭제 + + 최신 커밋을 취소하고, 그 변경 사항을 스테이징 영역과 작업 트리에서 모두 제거 + + 이 명령어를 사용하면 작업 트리에 있는 모든 변경 사항이 사라지므로 주의 필요 + + 사용법: git reset --hard HEAD~1 + +간단히 나타내어 상술한 워킹 디렉토리(1)-인덱스(2)-로컬 리포지토리(3) 관계에서 +soft는 3->2, mixed는 3->1, hrad는 3->0 + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) + +Pull Request: 다른 사용자가 작성한 저장소에서 변경 사항을 병합하기 위한 요청 + +Merge : Merge는 두 개 이상의 다른 브랜치의 변경 사항을 하나의 master branch에 통합하는 작업. + master브랜치에서 분기해 나가는 지점(commit)을 base라 함 + -Fast Forward Merge: 병합 과정에서 새로운 commit을 생성하지 않고 이전 변경사항을 + 참조하여 쌓아 나가는 것 + -3-Way Merge: base와 그곳에서 뻗은 두 brach, 총 세 커밋을 비교하여 변경사항을 병합 + + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) + +Rebase : base를 재설정한다는 의미로, + 하나의 브랜치가 다른 브랜치에서 파생되서 나온 경우, 다른 브랜치에서 진행된 커밋을 가져와서 base를 재설정하는 것 + + rebase를 사용하면 브랜치의 커밋 히스토리를 깔끔하게 유지할 수 있고, 불필요한 머지 커밋을 방지하고 선형적인 히스토리를 유지할 수 있다 + + 적용 순서: + + 1. 현재 브랜치에서 베이스로 지정한 브랜치(대상 브랜치)의 최신 커밋을 + 가져옵니다. + + 2. 현재 브랜치에서 베이스로 지정한 브랜치까지의 커밋을 임시로 저장합니다. + + 3. 베이스로 지정한 브랜치의 최신 커밋을 가져와 현재 브랜치의 마지막 + 커밋으로 합칩니다. + + 4. 임시로 저장한 커밋을 다시 현재 브랜치 위에 적용하여 완료합니다. + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) + +git stash: 현재 작업 디렉토리의 변경 사항을 임시로 저장 + + 변경 사항을 stash에 저장하기: git stash save "임시로 저장할 메시지" + + stash 목록 확인하기: git stash list + + stash에서 변경 사항을 적용하기: git stash apply stash@{n} + + stash에서 변경 사항을 적용하고 해당 stash 제거하기: it stash pop stash@{n} + + 특정 stash 삭제하기: git stash drop stash@{n} + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. + +Fast-Forward와 3-Way Merge의 이해가 맞는지 잘 모르겠습니다. \ No newline at end of file From 8b9e1780c794190819f6b3a19611ab3ef6553a25 Mon Sep 17 00:00:00 2001 From: Kang Sumin Date: Fri, 22 Mar 2024 15:00:41 +0900 Subject: [PATCH 27/73] Step 1 kangsumin (#52) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 git-basics의 README-kangsumin.md 작성 완료 --- git-basics/README-kangsumin.md | 238 +++++++++++++++++++++++++++++++++ 1 file changed, 238 insertions(+) create mode 100644 git-basics/README-kangsumin.md diff --git a/git-basics/README-kangsumin.md b/git-basics/README-kangsumin.md new file mode 100644 index 0000000..7fabcc9 --- /dev/null +++ b/git-basics/README-kangsumin.md @@ -0,0 +1,238 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. + +### Git과 GitHub의 의미 +- **Git**: local에서 소스 코드의 변경 사항을 추적하고, 버전을 관리하는데 사용되는 도구이다. + +- **GitHub**: Git 저장소를 클라우드(원격 서버)에 호스팅하고, 여러 사용자가 협업할 수 있게 하는 서비스이다. GitHub를 사용하면 로컬 시스템뿐만 아니라 원격 서버에도 Git 저장소를 보유할 수 있다. + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. +- **Working Directory**: 현재 개발자가 작업하는 공간으로 현재 프로젝트의 소스코드 및 파일이 저장되어 있는 로컬 시스템의 디렉토리이다. Git은 여기에 있는 파일들의 변경사항을 추적하고 관리한다. + +- **Git Add**: Working Directory에 있는 변경 사항 중 일부를 Staging Area에 추가하는 명령이다. 이는 Git에게 해당 변경 사항을 다음 commit에 포함하는 것임을 알려준다. + +- **Git Commit**: Staging Area의 변경 사항을 로컬 저장소에 저장하는 명령어이다. 이는 변경 사항을 영구적으로 기록하고, commit 메시지와 함께 변경 사항의 스냅샷을 생성한다. + +- **Git Push**: 로컬 저장소에 있는 commit을 원격 저장소(예: GitHub)로 전송하는 명령이다. 이는 다른 개발자들과 변경 사항을 공유하거나, 백업을 위해 사용된다. + +- **Git Merge**: 두 개의 다른 branch를 병합하는 명령어이다. branch는 개발의 흐름을 나누어 관리하기 위한 독립적인 작업 공간으로 사용되는데, 두 branch의 변경 사항을 합치는 작업을 수행한다. + +- **Git Fetch**: 원격 저장소에서 최신 변경사항을 가져오는 명령어이다. 이는 로컬 저장소에는 변경 사항을 적용하지 않고, 단순히 원격 저장소의 상태를 확인하는 역할이다. 이후에 필요에 따라 Git Merge나 Git Pull과 함께 사용하여 로컬 저장소에 변경 사항을 반영할 수 있다. + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + +- **commit**: Git에서 변경 사항을 영구적으로 기록하는 작업이다. 각 commit은 파일의 변경 사항을 스냅샷으로 기록하고, 해당 지점의 상태를 저장한다. commit을 통해 이전 상태로 rollback하거나 변경 이력을 추정할 수 있다. + +- **branch**: Git에서 병렬적인 작업을 수행하기 위한 개념이다. 각 branch는 독립적인 작업 경로를 나타내며, 개발자는 여러 branch를 생성하여 동시에 여러 기능을 개발할 수 있다. + +- **HEAD**: 현재 작업 중인 branch의 가장 최근 commit을 가리키는 포인터이다. + +- **Git checkout**: Working directory의 HEAD와 branch 간의 이동을 담당하는 명령어이다. + +### branch 관련 명령어 + +- **branch 생성**: + ```bash + # 새로운 브랜치 생성 + git branch + + # 새로운 브랜치 생성 후 해당 브랜치로 이동 + git checkout -b + ``` + +- **branch 삭제**: + ```bash + # 브랜치 삭제 + git branch -d + + # 강제로 브랜치 삭제 (변경 사항이 포함되지 않은 경우) + git branch -D + ``` + +- **branch 이동**: + ```bash + # 특정 브랜치로 이동 + git checkout + + # 새로운 브랜치 생성 후 해당 브랜치로 이동 + git checkout -b + ``` + +- **branch 목록 보기**: + ```bash + # 브랜치 목록 보기 + git branch + ``` + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +### Git init, Git clone +- **git init**: 새로운 프로젝트 디렉토리를 Git 저장소로 만들거나 기존 프로젝트를 Git으로 변환할 때 사용된다. 이 명령어를 실행하면 해당 디렉토리 내에 Git 저장소가 초기화되며, 이후에 변경 사항을 추적하고 commit할 수 있게 된다. + ```bash + cd 내_프로젝트_디렉토리 + git init + ``` + +- **git clone**: 원격 Git 저장소의 프로젝트를 로컬 시스템으로 복제할 때 사용된다. 이 명령어를 실행하면 원격 저장소의 모든 파일과 히스토리가 로컬 시스템으로 복제되어 프로젝트를 가져올 수 있다. + ```bash + git clone 원격_저장소_URL + git init + ``` + +### origin +- **origin**: Git에서 원격 저장소를 가리키는 별칭이다. 원격 저장소의 URL을 `origin`이라는 이름으로 참조할 수 있다. + +- **origin 설정 방법** + - `git clone` 명령을 사용하여 원격 저장소를 복사하면 Git은 자동으로 `origin`이라는 이름의 원격 저장소를 설정한다. 따라서 별도의 설정이 필요없다. + + - `git remote add` 명령으로 원격 저장소를 직접 추가한다면 아래의 명령어를 사용하여 `origin`이라는 이름의 원격 저장소를 설정할 수 있다. + ```bash + git remote add origin 원격_저장소_URL + ``` + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. + +### git reset +- reset 명령어는 대표적으로 commit을 `취소`하는 명령어이다. 또한 Staging 취소가 가능하다. 옵션에 따라 디테일한 설정이 가능하다. + +- 옵션 + - `--soft`: commit 취소, Staging 상태 유지 + - `--mixed`: commit 취소, Staging 취소, local은 변경 상태로 유지(옵션이 없을 시 default로 설정된다) + - `--hard`: commit 취소, Staging 취소, local 변경 상태 취소 +- HEAD의 옵션 (위의 3가지 옵션 뒤에 사용한다) + - `HEAD^`: 최신 커밋 취소 + - `HEAD~(수량)`: 수량에 숫자를 적으면 최근 커밋부터 해당 숫자까지 커밋 취소 +- 사용 예시 + ```bash + # 소프트 리셋 + git reset --soft HEAD^ + + # 믹스드 리셋 + git reset HEAD^ + git reset --mixed HEAD^ + + # 하드 리셋 + git reset --hard HEAD^ + ``` + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. +- **Pull Request**: 한 브랜치에서 작업한 코드를 메인 프로젝트에 병합(Merge)하기 위해 레포지토리 관리자나 다른 팀원에게 요청하는 과정이다. + + - 시나리오 + - branch 생성 및 작업 + - 변경 사항 commit 및 push + - pull request 생성 + - 팀원들과 토론 및 수정 + +- **Merge**: Pull Request를 통해 검토된 변경 사항을 실제로 적용하여 branch를 병합하는 것이다. + - 종류 + - Fast-Forward: main branch에 신규 커밋이 없는 경우, 최신 커밋이 있는 branch를 main branch로 하는 것이다. + ![fast-forward-merge](https://codingapple.com/wp-content/uploads/2022/06/%EA%B7%B8%EB%A6%BC3-4.png) + + - 3-Way Merge: branch마다 신규 commit이 1회 이상 있는 경우, merge 명령을 내리면 두 브랜치의 코드를 합쳐서 새로운 commit을 생성한다. + ![3-Way-merge](https://codingapple.com/wp-content/uploads/2022/06/merge1.png) + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. +- **rebase**: 신규 branch의 시작점을 main branch의 최근 commit으로 옮긴 다음 fast-forward merge를 하는 것이다. +![rebase](https://codingapple.com/wp-content/uploads/2022/06/merge3.png) + +- **유용한 때** + - branch가 너무 많을 때, 간단한 branch들을 rebase하면 commit history를 훨씬 깔끔하게 정리할 수 있다. + +- **rebase & merge 방법** + - 새로운 브랜치로 이동한다. + - `git rebase main`을 한다. + - 그러면 branch가 main branch 끝으로 이동하는 데 그것을 fast-forward merge 하면 된다. + ```bash + # 새로운 브랜치로 이동 + git switch 새로운_브랜치 + + # main으로 rebase + git rebase main + + # main branch로 이동 + git switch main + + # fast-forward merge 적용 (신규 커밋이 있는 branch를 main branch로 적용) + git merge 새로운브랜치 + ``` + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. +- **stash**: 현재 작업 중인 변경 사항을 일시적으로 저장하는 Git의 기능이다. 작업 중인 변경 사항을 commit하지 않고 보관할 수 있어서 다른 작업을 할 대 유리하다. + +- **관련 명령어** + - 현재 작업 중인 변경 사항을 일시적으로 저장 + ```bash + git stash + + # staging 된 것이든 안된 것이든 추적중인 파일은 다 이동된다. + # 파일들이 최근 commit 상태로 되돌아 간다. + ``` + + - 현재 stash 되어있는 코드 목록 출력 + ```bash + git stash list + ``` + + - 보관했던 코드 다시 불러오기 + ```bash + git stash pop + + # git stash 했던 코드가 여러개 있으면 가장 최근에 보관했던 코드부터 불러온다. + ``` + + - stash 삭제 + ```bash + # 특정 stash 삭제 + git stash drop 삭제할_id + + # 모든 stash 삭제 + git stash clear + ``` + + - 일부 코드만 git stash 하기 + ```bash + git stash -p + + # 파일을 훑어주면서 stash 할 지 의견을 물어보는데 y/n으로 잘 대답하면 된다. + ``` +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. +- pull request는 레포지토리를 fork한 상태에서만 가능할까? 레포지토리를 clone만 한 상태에는 pull request가 불가능할까? \ No newline at end of file From af844224f4bd8c94b3c589c7c14ec3b156365e80 Mon Sep 17 00:00:00 2001 From: Jusong Kim <132315974+jooiss@users.noreply.github.com> Date: Fri, 22 Mar 2024 15:01:00 +0900 Subject: [PATCH 28/73] Step 1 jusong (#51) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 step-1 완료 --- git-basics/README-jusong.md | 198 ++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 git-basics/README-jusong.md diff --git a/git-basics/README-jusong.md b/git-basics/README-jusong.md new file mode 100644 index 0000000..ca14027 --- /dev/null +++ b/git-basics/README-jusong.md @@ -0,0 +1,198 @@ +# Git 기초 + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +### Git + Git은 소스 코드 버전 관리 시스템이다. + Local repository의 모든 변경사항을 기록하여 파일의 버전 관리를 용이하게 해준다. +### GitHub + GitHub은 Git 소프트웨어를 지원하는 클라우드 기반 호스팅 서비스이다. + Remote repository 기능을 제공해주는 서비스이다. + 여러 사람과 공유하고 협업할 수 있다. + + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +### Working Directory (Working Tree) + 현재 작업하고 있는 영역을 말한다. +### Staging Area + Repository에 commit하기 전에 commit을 준비하는 위치를 말한다. +### Repository + Working directory의 변경 이력들이 저장되어 있는 영역으로 commit들이 모여있는 저장소이다. +### Local Repo(HEAD) + 내 컴퓨터의 저장소, 즉 개인 전용 저장소를 말한다. +### Remote Repo(MASTER) + 원격 온라인 서버상의 저장소로 여러 사람이 함께 공유할 수 있다. +### Git 동작 방식 +1. Git Add + - 변경된 내용을 Staging area에 추가하는데 사용된다. +2. Git Commit + - Staging area에 추가된 변경 사항을 저장한다. +3. Git Push + - Local repository 내용을 Remote repository로 업로드 하는 데 사용된다. +4. Git Merge + - 다른 branch에서 변경 사항을 결합하는 데 사용된다. +5. Git Fetch + - Remote repository에서 변경 사항을 가져오지만 Local branch에 자동으로 병합하지 않는다. +6. Git Pull + - Git Fetch와 Git Merge의 조합으로 Remote repository에서 변경 사항을 가져와 현재 branch에 자동으로 병합한다. + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +### Branch + Branch는 동일한 소스 코드에서 다른 작업을 동시다발적으로 할 수 있게 해주는 기능을 말한다. + 코드 전체를 복사하고 난 후, 원래 코드와는 상관없이 독립적으로 개발할 수 있다. +### HEAD + HEAD란 해당 branch의 마지막 commit, 즉 현재 사용중인 branch의 선두 부분을 나타내는 이름을 뜻한다. + HEAD를 이동하면 사용하는 branch가 변경된다. +### git checkout + git checkout 명령어는 branch 간 전환하거나 파일을 이전 상태로 복원하는 명령어이다. +### Branch 관련 Git 명령어 + // Branch 생성 + $ git branch <새로운_브랜치_이름> + + // Branch 삭제 + $ git branch -d <삭제할_브랜치_이름> + + // Branch 이동 + $ git checkout <이동할_브랜치_이름> + + // 새로운 branch 생성 후 이동 + $ git checkout -b <새로운_브랜치_이름> + + +## clone, init, origin +### git init과 git clone +#### 공통점 + 리포지토리를 로컬에 생성하는 방법이다. +#### 차이점 +1. git init + - 기존의 Local directory를 Git 저장소로 변환한다. + - 이미 있는 directory를 Git으로 관리하기 시작할 때 사용한다. +2. git clone + - Remote repository부터 프로젝트를 가져온다. + - 이미 존재하는 Git 저장소를 복제해 local로 가져온다. + - 보통 다른 사람이나 팀의 프로젝트에 기여하기 위해 사용한다. +### origin + origin은 Remote repository의 이름이다. +#### 설정방법 + // 자동으로 origin으로 설정 + $ git clone <원격_저장소_URL> + + // 수동으로 origin으로 설정 + $ git remote add origin <원격_저장소_URL> + + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +### reset의 type + 1. soft + 2. mixed + 3. hard + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
softmixedhard
HEAD지정한 commit으로 이동한다.
HEAD가 가리키는 BranchHEAD와 같이 움직인다.
Staging area변화 X지정한 commit과 동일 내용지정한 commit과 동일 내용
Working directory변화 X변화 X지정한 commit과 동일 내용
주 용도branch 이동하기Staging area에서 빼기commit 되돌리기
+ + + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +### pull request + 협력자에게 branch 병합을 요청하는 메시지를 보내는 것을 말한다. +### merge + 서로 다른 branch를 하나의 branch로 합치는 과정으로 브랜치의 작업 내용을 병합하는 것을 말한다. +### merge type +1. Fast-foward Merge + - 분기한 branch의 commit 히스토리가 기존 branch의 commit 히스토리를 포함하고 있는 경우 사용된다. + - Merge commit이 따로 만들어지지 않고 HEAD의 위치만 이동한다. +2. 3-Way Merge + - 각 branch에 새 commit이 하나 이상 있는 경우 사용된다. + - 두 branch의 코드를 합쳐서 새로운 commit을 자동 생성한다 + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +### rebase + Branch의 시작점을 다른 commit으로 옮겨주는 행위이다. + Branch 수가 많은 경우, git log를 간단하게 해주기 위해서 rebase 명령어를 사용해 merge 한다. +### rebase 명령어를 사용하여 merge 하는 방법 + // 새로운 branch의 시작점을 main branch의 최근 commit으로 변경 + $ git switch <새로운_브랜치> + $ git rebase main + + // Fast-forward merge 진행 + $ git switch main + $ git merge <새로운_브랜치> + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +### stash + stash는 변경사항을 일시적으로 저장하는 기능이다. + 아직 commit하기에 이른 경우나 다른 branch로 checkout 할 때 변경사항을 유지하고 싶을 때 사용한다. +### stash 명령어 + // 현재 Working directory의 변경 사항을 일시적으로 저장 + Working directory를 깨끗한 상태로 변경 + $ git stash + + // 변경 사항을 특정 이름으로 저장 + $ git stash save <이름> + + // 가장 최근의 변경 사항을 가져와 Working directory에 적용 + 변경 사항을 stack에서 제거 + $ git stash pop [인덱스_번호] + + // stash를 적용하고 stash가 적용된 상태 유지 + 임시 저장 공간에 그대로 유지 + $ git stash apply + + // n번째 stash 가져와 적용 + $ git stash apply stash@{n} + + // 현재 stash 목록 확인 + $ git stash list + + // n번째 stash 제거 + $ git stash drop stash@{n} + + // 모든 stash 제거 + $ git stash clear +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions + From e9b61f2d84cec1513f6c07e71a3380ac67061e12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=A0=95=EC=9A=B0?= <114933967+doubleclip118@users.noreply.github.com> Date: Fri, 22 Mar 2024 15:01:09 +0900 Subject: [PATCH 29/73] Step 1 pakjeongwoo (#47) --- git-basics/README-pakjeongwoo.md | 83 ++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 git-basics/README-pakjeongwoo.md diff --git a/git-basics/README-pakjeongwoo.md b/git-basics/README-pakjeongwoo.md new file mode 100644 index 0000000..12f90f3 --- /dev/null +++ b/git-basics/README-pakjeongwoo.md @@ -0,0 +1,83 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. +로컬 저장소는 개발자의 컴퓨터에 있는 Git 저장소입니다. +원격 저장소는 GitHub와 같은 원격 서버에 호스팅된 Git 저장소입니다. + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. +Working Directory : 개발자가 작업하는 로컬의 디렉토리 +Git Add : 작업 디렉토리에서 변경된 파일을 스테이징 영역에 추가하는 명령어 +Git Commit : 스테이징 영역에 있는 변경사항을 로컬 저장소에 기록하는 명령어 +Git Push : 로컬 저장소에 커밋된 변경사항을 원격 저장소에 업로드하는 명령어 +Git Merge : 다른 브랜치의 변경 사항을 현재 브랜치에 통합하는 명령어 +Git Fetch : 원격 저장소의 최신 변경 사항을 로컬 저장소로 가져오는 명령어 + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. +branch 생성 : git branch +branch 삭제 : git branch -d 강제삭제시 -D 옵션사용 +branch 목록확인 : git branch -r하면 원격 저장소의 브랜치 목록을 알수있음 +HEAD : 현재 작업중인 브랜치를 가리키는 포인터 일반적으로 HEAD는 브랜치의 최신커밋을 가리킨다 +git checkout : 명령어는 브랜치 간 전환이나 특정 커밋으로 이동할 때 사용된다 + + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 +git clone : 이미 존재하는 원격 리포지토리를 로컬 컴퓨터에 복제할 때 사용 +git init : 로컬 컴퓨터에 새로운 Git 리포지토리를 초기화할 때 사용 +orgin : Git에서 원격 리포지토리의 기본 별칭 +설정방법 : git init으로 초기화한 로컬 리포지토리에서는 git remote add origin +차이점 : git clone은 원격 리포지토리를 복제하여 로컬에 생성하는 반면, git init은 로컬에 새로운 리포지토리를 초기화합니다 +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. +soft : 브랜치가 가리키는 커밋을 변경하지만, 스테이징 영역과 작업 디렉토리는 그대로 유지합니다. +mixed : 옵션은 브랜치가 가리키는 커밋을 변경하고, 스테이징 영역을 해당 커밋과 동일한 상태로 만듭니다. 작업 디렉토리는 그대로 유지됩니다. +hard : 브랜치가 가리키는 커밋을 변경하고, 스테이징 영역과 작업 디렉토리를 해당 커밋과 동일한 상태로 만듭니다. +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. +Pull Request : 자신의 변경 사항을 원본 리포지토리에 통합하기 위한 요청 +Merge : 두 개의 브랜치를 통합하는 과정 +Fast-Forward Merge : 브랜치의 변경 사항을 master 브랜치에 적용할 때, master 브랜치의 포인터를 브랜치의 최신 커밋으로 이동시키는 것으로 병합이 완료 +3-Way Merge : 두 브랜치의 공통 조상 커밋과 각 브랜치의 최신 커밋을 사용하여 병합이 이루어집니다. + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. +rebase : 브랜치의 베이스를 다른 커밋으로 변경하는 과정 +커밋 이력을 수정하고 싶을 때, 브랜치를 최신 상태로 유지하고 싶을 때, 원격 저장소에 푸시하기 전에 로컬 브랜치를 정리하고 싶을 때 + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. +git stash : 현재 작업 중인 변경 사항을 임시로 저장할 수 있는 명령어 +변경 사항 임시 저장하기, 저장된 변경 사항 확인하기, 저장된 변경 사항 적용하기 +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From f359084b8d6fe21ab3500dd49c8b3ba3012fe913 Mon Sep 17 00:00:00 2001 From: Lee Si Woong <83443857+silverttthin@users.noreply.github.com> Date: Fri, 22 Mar 2024 15:01:29 +0900 Subject: [PATCH 30/73] Step 1 lee si woong (#46) --- .DS_Store | Bin 0 -> 6148 bytes git-basics/.DS_Store | Bin 0 -> 6148 bytes git-basics/19th/.DS_Store | Bin 0 -> 6148 bytes git-basics/README-LeeSiWoong.md | 95 ++++++++++++++++++++++++++++++++ git-basics/image-1.png | Bin 0 -> 154030 bytes git-basics/image-2.png | Bin 0 -> 156060 bytes git-basics/image.png | Bin 0 -> 209748 bytes 7 files changed, 95 insertions(+) create mode 100644 .DS_Store create mode 100644 git-basics/.DS_Store create mode 100644 git-basics/19th/.DS_Store create mode 100644 git-basics/README-LeeSiWoong.md create mode 100644 git-basics/image-1.png create mode 100644 git-basics/image-2.png create mode 100644 git-basics/image.png diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..45867fec50d598c4422d7b7e590b93d643bdcaf4 GIT binary patch literal 6148 zcmeHK%}&BV5S|4TDly@p3CAX0F(T-JcxfuWfHithgRLdlSi6K4IS`Vb^@V&ApU0Wq z#Yn(|7ZYVBnfYdCcDmVboBaU*;f}*YfEoZ)PzehbniWEM(j_UF2%%8l2*8IFBDhD( z@)sDOwcCOLu2}~A@MZmiNjeN-8DRb`7{*bWHJk6EP%Le1mdjSTTE6uj#qTL&7tK2p9!NP<4SB?xVU zj=@|bW>ADKMbxFjJTZhW$GC0!IRoJd&Z1VN{<7t)_Ww-mz8%<+p*EDUjW!{Aou?WkkoEJefyFu$xh%B!4D85R^ zi;=T`Ch{^$^YKg;q{$dkZm-ik5sN^~^Q4fqp$gcxWsjWpayjr$I_~kHzv{S4uipjT z>#tU}b#QoedNF#;o^tV`2<5=Hls%0#yn^z%p676uXCi+9U!7m)5fTH$05L!eY%c@) zOt4zpO98E%7$63IU;y_A7aF3ku~I0v4(RaujBx`I1$2B%Ai5fTjg>-(fN)g`s7kqh zVsKRsepl!D8Y_jWoN+lbjH73+A1_?a4t`grGwv&-o){no)){Cj)4}uq9DbRNkNou# zvWNj<;GZ$TjbS(pU{U&P{kA+jYh7sf&`>b1LIni$wMzgPxR11DP{m!;AS5Z-O8Nhm@N3OxqA7ObrvikA@U3mDOZN=-`CIk;^$^mWO4&2vZSm zndmQ?@Z0xU!saYsGuHh6k8qJDc`+D#@>aXEw{IAh(KR0ZXHoh^P^@w~&5ZOGpe51H=F^ zuzL*Xv%u``Ug=aZF+dFbzyR(K4m3npW2I1T9nj(R8T}nZ6wvW4f#_&-HC7721Hx4* zpi1TXiNRGm*c~0`YOEBhbjIb%Fpplje!OtGI@lc<&bX_PdSZYWXfn`NLmSWkEBIx$ zKJuF>G$ICwfq%vT?@auO2Sw?#^;>y();iFhprK$~g$fAhjY|Lwa3ASOr}8_fL!7Iz WQi!vlU8V!lML-fl9Wn3=4157k6HF2S literal 0 HcmV?d00001 diff --git a/git-basics/README-LeeSiWoong.md b/git-basics/README-LeeSiWoong.md new file mode 100644 index 0000000..b61c906 --- /dev/null +++ b/git-basics/README-LeeSiWoong.md @@ -0,0 +1,95 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) + +### Git - 버전 관리 시스템 +1. 코드의 수정내역 열람 및 특정시점으로 되돌아가는 기능을 제공하는 버전관리 시스템 +2. local에서 동작해 내 코드의 버전들을 관리 +3. 그래서 Git 자체만으론 다른 사람들과의 협업이 어려움 + +### Github - 원격 저장소 +1. Git 사용 프로젝트를 지원하는 웹 호스팅 서비스 +2. local에서 작업한 코드를 깃헙의 remote 저장소에 업로드 +3. 또한 다른 사람이 remote에 올린 코드를 내 local로 받아올 수 있음 +4. 이를 통해 다른 사람들과의 협업이 수월해짐 + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +- 작업 디렉토리 코드는 아직 변경사항이 기록되지 않고있는 **untracked** 상태 +- **git add** 명령어를 통해 코드를 Staging Area로 옮겨 **tracked**되게 함 +- 스테이징 영역에 있는 코드들을 **git commit** 명령어로 커밋 +- 커밋된 코드들은 로컬 저장소에 모임 +- 이 로컬 저장소를 **git push** 명령어로 github등의 원격 저장소에 업로드 + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) + +![alt text](image.png) +- **git branch 브랜치명**으로 branch를 만들어 코드의 시점을 나눌 수 있다. +- **git checkout** 명령어를 통해 자유롭게 브랜치들을 오갈 수 있다. +- 이때 *HEAD*는 현재 사용자가 위치한 브랜치의 최신 커밋을 가리키는 포인터이다. +- **git branch -d 브랜치명**으로 브랜치를 삭제할 수도 있다. + +## clone, init, origin + +- git init은 로컬의 어떤 프로젝트를 git으로 관리하게 만드는 명령어 +- git clone <주소>는 저장소로부터 프로젝트를 복제(clone..)해오는 명령어 + - 클론해온 프로젝트엔 origin이라는 원격 저장소 디폴트명이 자동등록된다. + - origin은 원격저장소 URL을 내포하며 **git remote -v**로 확인 가능. + - **git remote add 단축명 url**로 원격 저장소를 추가할 수 있는데 이때는 origin 말고 다른 단축명을 사용할 수도 있다. + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +**git reset option(기본은 mixed) 커밋위치** 명령어는 단순하게 현재 HEAD가 가리키는 커밋을 옮길 수 있다. +이 때 옮기고 처리하는 방식에 따라 3가지로 나뉜다. +1. HEAD가 가리키는 커밋 위치를 옮긴다. (여기까지가 --soft 옵션) -> 아직 기존 코드 스테이징돼있음 +2. staging area를 HEAD가 가리키는 상태로 만든다. (여기까지가 --mixed 옵션) -> 아직 기존 코드는 작업폴더에 있음 +3. working directory를 staging area가 가리키는 상태로 만든다. (여기까지가 --hard 옵션) + +> A-git add수행-B-git commit ..수행-C 일때 soft는 B로, mixed는 A로, hard는 현재 HEAD 이후로 작성한 코드가 없는 시점으로 이동한다. + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) + +**PR**은 내가 짠 코드를 원격 저장소 관리자에게 검토를 요청하는 기능이다. + +검토 이후 승인이 난 코드가 담긴 브랜치를 원격 저장소의 브랜치에 반영해 두 코드를 합치는 것을 **merge**라 한다. +- 2종류의 merge가 있다. +![alt text](image-2.png) + 1. Fast-Forward + - 새 브랜치 hotfix를 만들어 작업하면 hotfix는 기존 브랜치의 모든 커밋 내역을 가지고 있다. + - 만약 기존 브랜치가 변동이 없다면 이 경우 hotfix로의 merge는 그냥 기존 브랜치가 가리키는 HEAD가 merge되는 hotfix의 HEAD로 옮겨진다. + 2. 3-Way + - hotfix 추가 후 기존 브랜치에서 작업을 해 변동이 있고 이 작업은 hotfix의 작업영역과 충돌하지 않는 경우이다. + - hotfix 브랜치는 기존 브랜치의 모든 커밋을 담고 있지 않는다. + - 따라서 각 브랜치의 HEAD 2개, 공통조상 커밋 1개 총 3개를 merge한 결과를 별도의 **merge commit**으로 만들어 HEAD를 여기로 옮긴다. + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +merge와 마찬가지로 브랜치를 합치는 결과를 만들어내나 중간과정이 다름. +1. main 브랜치에서 feature 브랜치로 rebase한다. +2. 이 말은 main 브랜치의 마지막 커밋에 feature 브랜치의 base가 달라붙는단 의미이다. +3. 이 경우 히스토리 구조가 선형이 되기 때문에 merge와 달리 불필요한 merge 커밋을 제거해 깔끔한 유지보수가 된다. + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +작업중 다른작업을 진행할 때 기존 작업을 잠시 스택공간에 치워두는 방법이다. +1. **git stash**로 현재 적용된 커밋 이후 변경된 모든 사항들이 stash 공간으로 이동한다. -m 옵션으로 기록도 가능 +2. **git stash apply**로 했던 최근 작업을 다시 가져온다. 뒤에 이름을 붙이면 원하는 항목을 가져올 수 있다. +3. **git stash list**로 작업목록명 확인 가능하다. + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. diff --git a/git-basics/image-1.png b/git-basics/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..40c3a35d09725196615bded6b6f47fc284bec84a GIT binary patch literal 154030 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
)hDV<-zRxO@LJd$zk8~cGF_<>#B&b$$ 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¥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 DASj)U literal 0 HcmV?d00001 diff --git a/git-basics/image-2.png b/git-basics/image-2.png new file mode 100644 index 0000000000000000000000000000000000000000..9dcbb132de2e45fdd0af02743095c1e5b9c18b30 GIT binary patch literal 156060 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

>OeH8P3q4JY$VoW>Y6Iv> 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 z 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

$QMhdW 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

}<*R*d?^C-y;yKty8^_QuXr? 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 R-m-x|a}z7$QX`M6{{m1i8T|kN literal 0 HcmV?d00001 diff --git a/git-basics/image.png b/git-basics/image.png new file mode 100644 index 0000000000000000000000000000000000000000..f226978c02453d22c0acfe781ae8c1d5fc65089a GIT binary patch literal 209748 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

{l`TWJB6RvwNV9w~14p{$Gcty(|KQnL3 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%0D_v=^p>JwQZ$7dp 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 Vea!wwH~4L6@-iyYC6dp5{||95(hL9q literal 0 HcmV?d00001 From 52da5567a0299a31f406b3daa5294d964b8034b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=9A=A9=EC=A7=84?= <101401582+Brio-yj@users.noreply.github.com> Date: Fri, 22 Mar 2024 15:01:39 +0900 Subject: [PATCH 31/73] 2024.03.17 (#42) . --- git-basics/README-yongjin.md | 139 +++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 git-basics/README-yongjin.md diff --git a/git-basics/README-yongjin.md b/git-basics/README-yongjin.md new file mode 100644 index 0000000..66a3aa9 --- /dev/null +++ b/git-basics/README-yongjin.md @@ -0,0 +1,139 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. +Git은 분산 버전 관리 시스템이며, 코드를 추적하고 관리하는 데 사용됩니다. +GitHub는 Git 저장소를 호스팅하고 협업을 촉진하는 온라인 플랫폼입니다 + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. + Working Directory (작업 디렉토리): + 작업 중인 프로젝트의 실제 파일이 저장되는 디렉토리입니다. + 이 디렉토리 내에서 파일을 생성, 수정, 삭제 등의 작업을 수행합니다. + + Git Add: + 작업 디렉토리에서 변경된 파일을 스테이징 영역에 추가하는 명령입니다. + 변경 내용을 Git이 추적할 수 있도록 하며, 스테이징 영역에 추가된 파일은 다음 커밋에 포함됩니다. + + Git Commit: + 스테이징 영역에 있는 변경 사항을 로컬 저장소에 영구적으로 저장하는 명령입니다. + 변경 내용에 대한 설명과 함께 커밋 메시지를 작성하여 기록합니다. + 커밋은 프로젝트의 버전 히스토리를 관리하고 추적하는 데 사용됩니다. + + Git Push: + 로컬 저장소에 있는 변경 사항을 원격 저장소로 전송하는 명령입니다. + 다른 개발자와 변경 사항을 공유하거나, 백업을 만들기 위해 사용됩니다. + 원격 저장소로 푸시하면 다른 개발자가 변경 사항을 가져올 수 있게 됩니다. +Git Merge, Git Fetch는 생략해도 됩니다. + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. + Branch (브랜치): + + 프로젝트의 특정 작업이나 기능을 분리하여 독립적으로 개발하기 위한 개념입니다. + 기존의 커밋 기록을 기반으로 새로운 브랜치를 생성할 수 있습니다. + 각 브랜치는 프로젝트의 특정 상태를 나타내며, 독립적으로 변경되고 관리됩니다. + +HEAD: + + 현재 작업 중인 브랜치의 가장 최근 커밋을 가리키는 포인터입니다. + HEAD는 작업 디렉토리에서 작업하는 중인 커밋을 가리킵니다. + +Git Checkout: + + 특정 브랜치로 이동하거나, 커밋의 상태를 볼 때 사용하는 명령어입니다. + git checkout 명령어를 사용하여 다른 브랜치로 이동할 수 있습니다. + 또한 git checkout 를 사용하여 특정 커밋의 상태를 확인할 수도 있습니다. + + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. + Git Clone: + 기존에 원격 저장소에 있는 프로젝트를 로컬로 복제하는 명령어입니다. + 주로 GitHub, GitLab, Bitbucket 등의 원격 저장소를 복제할 때 사용됩니다. + 사용 방법: git clone <원격 저장소 URL> 명령어를 사용하여 실행합니다. + + Git Init: + 로컬 디렉토리를 Git 저장소로 초기화하는 명령어입니다. + 새로운 프로젝트를 시작하거나, 기존 프로젝트를 Git으로 관리하기 시작할 때 사용됩니다. + 사용 방법: git init 명령어를 사용하여 실행합니다. 이 명령어를 실행한 디렉토리가 Git 저장소로 초기화됩니다. + Origin + + Origin은 일반적으로 원격 저장소를 가리키는 단어입니다. 주로 Git에서 기본적으로 설정되는 원격 저장소의 별칭으로 사용됩니다. + 원격 저장소의 URL을 복제하거나 저장소에 푸시할 때 사용됩니다. + 원격 저장소를 설정할 때 보통 "origin"이라는 이름으로 설정됩니다. +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) + Soft Reset (소프트 리셋): + Soft Reset은 HEAD를 이전 커밋으로 이동시키지만, 변경 내용을 유지합니다. + 변경 내용은 스테이징 영역에 그대로 남아 있습니다. + 주로 최신 커밋을 취소하고, 변경 내용을 다시 스테이징 영역에 추가하기 위해 사용됩니다. + 사용 방법: git reset --soft HEAD~1 + + Mixed Reset (믹스드 리셋): + Mixed Reset은 HEAD를 이전 커밋으로 이동시키며, 변경 내용을 unstaged 상태로 되돌립니다. + 변경 내용은 로컬 저장소에는 그대로 남아 있지만, 스테이징 영역에서는 사라집니다. + 주로 최신 커밋을 취소하고, 변경 내용을 다시 수정한 후 다시 스테이징하는 경우에 사용됩니다. + 사용 방법: git reset HEAD~1 + + Hard Reset (하드 리셋): + Hard Reset은 HEAD를 이전 커밋으로 이동시키며, 변경 내용을 완전히 삭제합니다. + 변경 내용은 로컬 저장소와 작업 디렉토리에서 모두 삭제됩니다. + 주로 최신 커밋을 완전히 취소하고 이전 상태로 되돌리는 경우에 사용됩니다. 주의가 필요한 명령어입니다. + 사용 방법: git reset --hard HEAD~1 + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request (풀 리퀘스트): + + Pull Request는 코드 변경 사항을 다른 개발자들에게 검토하고 병합하기 위해 사용되는 기능입니다. + 주로 협업하는 프로젝트에서 개발자들 간에 코드 리뷰와 피드백을 주고받는 데 사용됩니다. + +Merge (병합): + + Merge는 두 개의 다른 브랜치를 하나로 합치는 것을 의미합니다. + 주로 Pull Request를 통해 코드 검토를 완료하고, 브랜치를 기존 브랜치에 병합할 때 사용됩니다. + +Fast-Forward Merge (패스트 포워드 병합): + + Fast-Forward Merge는 두 브랜치가 일직선적인 관계에 있을 때 발생하는 병합 방식입니다. + 즉, 기존 브랜치의 커밋 기록이 단순히 앞으로 이동하면 되는 경우에 사용됩니다. + 별도의 병합 커밋이 생성되지 않고, 단순히 HEAD를 이동시켜서 기존 브랜치의 커밋 기록을 통합합니다. + +3-Way Merge (3-way 병합): + + 3-Way Merge는 두 브랜치가 서로 다른 변경 사항을 가지고 있을 때 발생하는 병합 방식입니다. + 즉, 각 브랜치에서 변경된 내용을 비교하여 자동으로 최종 결과물을 생성합니다. + 병합 커밋이 생성되며, 충돌이 발생할 수 있으며 이를 해결해야 합니다. + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +Rebase (리베이스): + +Rebase는 Git에서 브랜치의 기록을 재배치하거나 합치는 작업을 의미합니다. 특히, 다른 브랜치의 변경 내용을 현재 브랜치의 기록에 적용할 때 사용됩니다. + + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +Git Stash 활용 방법: + +Git Stash는 현재 작업 중인 변경 사항을 임시로 보관하고, 깨끗한 작업 디렉토리에서 작업할 수 있도록 도와주는 기능입니다. 주로 작업 중에 갑작스런 다른 작업을 해야 할 때나, 브랜치를 변경해야 할 때 유용합니다 + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From 4fffd0dbab68902c197c3f3070e0a11cc01ed60c Mon Sep 17 00:00:00 2001 From: Wonseok Date: Sat, 23 Mar 2024 19:20:37 +0900 Subject: [PATCH 32/73] =?UTF-8?q?Step=201=20=EC=8B=A0=EC=98=81=EC=84=9C=20?= =?UTF-8?q?(#79)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: sys --- ...E-\354\213\240\354\230\201\354\204\234.md" | 200 ++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 "git-basics/README-\354\213\240\354\230\201\354\204\234.md" diff --git "a/git-basics/README-\354\213\240\354\230\201\354\204\234.md" "b/git-basics/README-\354\213\240\354\230\201\354\204\234.md" new file mode 100644 index 0000000..c7ab75c --- /dev/null +++ "b/git-basics/README-\354\213\240\354\230\201\354\204\234.md" @@ -0,0 +1,200 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. + +> * git = 소스 코드 버전 관리 시스템 입니다 +> * 버전 관리 = 내가 원하는 시점의 작업물로 이동할 수 있다는 것을 의미합니다 +> * 로컬 컴퓨터에서 실행되며 저장할 수 있는 공간이 있다면 어디에나 저장 할 수 있습니다 (로컬 컴퓨터, USB, 클라우드 서버, 인터넷 등) +> +> * github = 깃으로 관리하는 프로젝트를 온라인 상에 올려둘 수 있는 사이트 입니다 +> * 시간, 공간의 제약이 없습니다 + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. + +> ### Working Directory +> * 현재 작업하고 있는 영역. 즉, 작업을 하고 있는 프로젝트 디렉토리 +> * untrackted 상태 : 파일이 Git에 의해서 그 변동사항들이 추적되지 않고 있는 상태 +> +> ### Git Add +> * 작업 디렉토리(working directory) 상의 변경 내용을 스테이징 영역(staging area)에 추가하기 위해서 사용하는 Git 명령어 +> * staging 영역 - 커밋할 준비가 된 변경 내용이 Git 저장소에 기록되기 전에 대기하는 장소 +> * trackted 상태 +> * git add 명령어를 많이 실행해도 Git 저장소의 변경 이력에는 어떤 영향도 주지 않음 +> * 장점 : 작업 디렉토리에 있는 변경 내용을 한 번에 몽땅 기록하지 않고, 조금씩 나누어서 기록할 수 있다 +> +> ### Git Commit +> * 의미있는 변경 작업들을 깃(저장소)에 기록하는 동작 +> * 스냅샷 방식 - 새롭게 변경된 부분만 추출해서 저장 +> * HEAD 포인터 - 최종적인 커밋 작업의 위치 +> +> ### Git Push +> * 원격 저장소(remote repository)에 코드 변경분을 업로드하기 위해서 사용하는 Git 명령어 +> * 새로운 branch 최초 push 사용법 +> ``` git +> git push --set-upstream <저장소명> <브렌치명> +> ``` + + + + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + +> ### branch +> 여러 개발자들이 각자 독립적인 작업 영역(저장소) 안에서 마음대로 소스코드를 변경 가능하도록 함 +> 필요에 의해 만들어지는 각각의 브랜치는 다른 브랜치의 영향을 받지 않음 +> ``` +>#생성 +> git branch <브랜치 이름> +> +>#이동 +>git checkout <브랜치 이름> +> +>#로컬 브랜치 삭제 (다른 브랜치로 이동 후) +>git branch -d <로컬 브랜치 이름> +> +>#원격 브랜치 삭제 +>git push <원격 저장소 이름> -d <원격 브랜치 이름> +>``` +> >Checkout +> >독립된 작업 공간인 브랜치를 자유롭게 이동할 수 있다. +> >``` +> >git checkout <브랜치 이름> +> >``` +> +> >Head +> >현재 사용 중인 브랜치의 선두 부분을 나타내는 이름 +> +> >Merge +> >여러 개의 브랜치를 하나로 모을 수 있음 +> >``` +> >git merge <합칠 브랜치 이름> +> >``` + + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +> ### git clone +> - 내 컴퓨터에 없는 Git 저장소를 복사해오는 명령어 +> ``` +> git clone <원격 저장소 url> +> ``` +> - 프로젝트에 대한 모든 데이터와 히스토리 가져옴 +> - 원격 저장소의 기본 브랜치만 확인할 수 있음 +> ### git init +> - 내 컴퓨터의 현재 디렉토리를 Git 저장소로 초기화하는 명령어 +> ``` +> git init +> ``` +> - 현재 디렉토리에 .git이라는 숨김 파일이 생성되고 Git의 내부 db가 생성 + +> ### origin +> - 원격 저장소(URL)의 단축 이름이다 +> - 저장소를 Clone하면 단축 이름이 자동으로 origin이라고 등록된다 +> - 존재 이유 - add,commit,push,pull을 통해 remote repository와 협업을 할 떄 remote repository의 URL을 일일이 입력하는 대신 별칭(alias)를 사용하는 것 + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. +>### git reset +>커밋을 되돌리거나 작업 디렉토리와 스테이징 영역을 조작하는 데 사용 +>HEAD의 위치를 현재 커밋에서 과거 커밋으로, 미래 커밋으로 이동시킬 수 있음 +> +>1. --hard 옵션 +>돌아간 시점의 커밋 바로 직후의 상태로 완전히 초기화하는 옵션 +>Working Directory에 생성한 파일까지 모두 삭제 +>--- +>2. --mixed 옵션 (default) +>Working Directory까지만 초기화하는 옵션 +>변경사항을 감지하지만, add와 commit이 되어 있지 않음 +>--- +>3. --soft 옵션 +>Staging Area까지 초기화하는 옵션 +>add는 되어있지만, commit이 되어있지 않는 상태 + + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. +>### Pull Request +>내가 수정한 코드가 있으니(push) 저장소 관리자에게 내 branch를 가져가 검토 후 병합해주라고(Merge) 요청 해주는 것 +> +>### Merge +> 서로 다른 브랜치에서 작업을 했거나, 작업 내용을 합쳐야 하는 경우 사용 +> 1. Fast-Forward 방식 +> merge 명령어를 실행하는 브랜치의 Head Commit이 병합 되는 브랜치의 Head commit으로 이동되는 방식 +> -> merge commit 이력이 남지 않음 +> master branch에서 새로운 브랜치 하나를 생성 한 후에 master branch는 더이상 커밋하지 않은 경우 사용 +> --- +> 2. 3-Way Merge 방식 +> 각 브랜치의 마지막 커밋 두 개와 공통 조상의 총 3개의 커밋을 이용하여 병합하는 방식 +> 공통 조상까지 비교해야 더 명확한 변경 상태를 알 수 있음 +> 서로 다른 브랜치가 동일 선상이 아닐 경우 사용 +> +> 충돌이 발생하면 일반적으로 <<<<<<<, =======, >>>>>>>와 같은 마커로 표시 + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. +> rebase란 공통 Base를 가진 두 개의 Branch에서 한 Branch의 Base를 다른 Branch의 최신 커밋으로 Base를 옮기는 작업이다 +> #### 장점 +> - 공유 branch의 최신 변경사항을 즉각 반영 +> - 커밋 이력이 남지 않을므로 commit history가 시간순서대로 반영되어 간단해짐 +> #### 유용한 경우 +> - 내가 작업하던 브랜치에 main 브랜치 내용이 필요해서 적용시키고 싶을 때 사용 + + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. +> git stash란 변경사항을 일시적으로 저장하는 기능 +> 커밋하기엔 이른 경우, 다른 브랜치로 체크아웃하는데 변경사항을 유지하고 싶을 경우 사용 +> +> ``` git stash ``` +> 현재 작업 중인 변경 사항을 일시적으로 저장하고 스택에 쌓음 +> 작업 디렉토리를 깨끗한 상태로 만듦 +> +> ``` git stash apply ``` +> 스택에 쌓인 가장 최근의 변경 사항을 불러와 작업 디렉토리에 적용, 스택에 남아있음 +> +> ```git stash drop ``` +> ```git stash drop [stash 이름] ``` +> 스택에 남아있는 stash 제거 +> +> ``` git stash pop ``` +> ``` git stash pop {index 번호} ``` +> 스택에 쌓인 가장 최근의 변경 사항을 불러와 작업 디렉토리에 적용, 스택에서 제거 +> +> ``` git stash list ``` +> 현재 stash들의 목록 + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. +> commit 만으로도 변경사항을 저장하고 버전관리가 가능한데 staging 영역이 있는 이유가 궁금합니다 \ No newline at end of file From 69959cd687e4d1030d025ec117e8bd3d86139a1a Mon Sep 17 00:00:00 2001 From: Wonseok Date: Sat, 23 Mar 2024 19:21:58 +0900 Subject: [PATCH 33/73] Step 1 kimhyojun (#81) Co-authored-by: hyojun kim --- git-basics/README-hyojun.md | 138 ++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 git-basics/README-hyojun.md diff --git a/git-basics/README-hyojun.md b/git-basics/README-hyojun.md new file mode 100644 index 0000000..53c5bbd --- /dev/null +++ b/git-basics/README-hyojun.md @@ -0,0 +1,138 @@ +# Git 기초 + +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github + +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. + +- git + 버전관리 소프트웨어 + 개인의 컴퓨에서 돌아간다. +- github + git 소프트웨어를 지원하는 일종의 클라우드 서비스 + 원격의 서버에 올라간다. + +## Git Workflow + +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. + +- Working Directory + 현재 작업하고 있는 영역, 작업을 하고 있는 프로젝트 디렉토리 + 아직 추적(track)하고 있지 않은 상태 +- Git Add + working directory상의 변경 내용을 staging area 추가하기 위해서 사용하는 git명령어 +- Git Commit + 의미있는 변경 작업들을 저장소에 기록하는 동작 + 코드 변경 시점을 저장했다가 잘못된 동작을 할 경우 돌아갈 수 있게함 +- Git push + 원격 저장소(remote repository)에 코드 변경분을 업로드하기 위해서 사용하는 git 명령어 + +## Branch, HEAD + +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + +- branch + 독립적으로 어떤 작업을 진행하기 위한 개념 + 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행 +- HEAD + 현재 체크아웃된 브랜치의 가장 최신 커밋 +- checkout + 브런치 간의 switch를 하기 위한 명령어 + +## clone, init, origin + +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. + +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +- git init : 빈 git 저장소를 만들거나 기존 저장소를 다시 초기화하는 명령어 + > git init +- git clone : git 저장소를 복제해 새 디렉터리로 가져오는 명령어 + > git clone <원격 저장소 url> + +## reset + +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. + +- --soft 옵션 + 커밋 취소 + Staging 상태 유지(add) +- --mixed 옵션 + 커밋 취소 + Staging 취소 + local은 변경 상태로 유지 +- --hard 옵션 + 커밋 취소 + Staging 취소 + local 변경 상태 취소 + +## Pull Request, Merge + +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. + +- Pull Request + 사용자가 원격 저장소에 Push하여 새로운 사항이 적용됬을 경우, 다른 사용자에게 푸쉬된 상황을 알리는 것 +- Merge + 서로 다른 브랜치에서 작업한 내용을 합쳐야 하는 경우 사용 + - Fast-Forward방시 + branch간의 병합을 진행할 때 커밋이 생기지 앟고 merge 명령어를 실행하는 + branch의 Head Commit이 병합되는 branch의 Head Commit으로 이동 + - 3-Way Merge + 각 브랜치의 마지막 커밋 두 개와 공통 조상의 총 3개의 커밋을 이용하여 병합하는 방식 + 서로 다른 브랜치가 동일 선상이 아닐 경우 사용 + +## rebase + +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. + +- rebase + 공통 Base를 가진 두 개의 Branch에서 한 Branch의 Base를 다른 Branch의 최신 커밋으로 Base를 옮기는 작업 +- 유용한지 + 내가 작업하던 브랜치에 main 브랜치 내용이 필요해서 적용시키고 싶을 때 사용 + +## stash + +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. + +- stash + 작업중에 갑작스럽게 다른 작업을 진행해야 할 떄, 작업중인 사항을 잠시 치워두는 방법 + - git stash + 현재 적용된 commit 이후로 변경된 모든 사항들이 stash 공간으로 이동 + - git stash pop + 다른 브랜치의 commit에 stash로 따로 저장해둔 코드들을 적용 + - git stash -p + -p 옵션을 통해서 hunk 기준으로 변경사항을 하나씩 확인하며 원하는 변홤나 stash에 담을 수 있음 + - + +## Advanced + +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. + +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions + +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From 0be4cd8341a6071f166433f1dd604c49e7e5ccae Mon Sep 17 00:00:00 2001 From: Wonseok Date: Sat, 23 Mar 2024 19:22:30 +0900 Subject: [PATCH 34/73] Step 1 cha gi eun (#82) Co-authored-by: Cha Gieun --- git-basics/README-ChaGiEun.md | 134 ++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 git-basics/README-ChaGiEun.md diff --git a/git-basics/README-ChaGiEun.md b/git-basics/README-ChaGiEun.md new file mode 100644 index 0000000..7948302 --- /dev/null +++ b/git-basics/README-ChaGiEun.md @@ -0,0 +1,134 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. +

    +- local Repository : 개발자의 컴퓨터에서 작업되는 프로젝트 저장공간 +- remote Repository : 클라우드 서비스(ex)GitHub)를 통해 인터넷 서버에 저장된 공간 +
    +*Git*은 주로 **로컬 컴퓨터**에서 작업할 때 사용됩니다. +사용자는 로컬 컴퓨터에서 Git을 사용하여 프로젝트의 변경 사항을 추적하고 관리할 수 있습니다. +Git을 사용하면 로컬 저장소를 생성하고, 변경 사항을 커밋하고, 브랜치를 만들고 병합하는 등의 작업을 수행할 수 있습니다. +
    +*GitHub*은 **리모트 저장소**를 제공하여 여러 사용자가 소스 코드를 공유하고 협업할 수 있습니다. +사용자는 GitHub을 사용하여 리모트 저장소를 만들고, 다른 사용자와의 협업을 위해 변경 사항을 푸시하고 풀 리퀘스트를 만들 수 있습니다. + + + + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. +

    +- **Working Directory**
    + - 사용자의 작업 공간으로써, 로컬 저장소에 접근할 수 있으며 실제 파일을 수정하거나 생성하는 공간입니다. + - 현재 작업 중인 소스코드들을 담고 있으며, 운영체제도 워킹 디렉토리 내부의 파일들만 접근하거나 수정할 수 있습니다. + - 작업 폴더에서 .git 디렉토리를 제외한 나머지 부분입니다. +- **Git Add**
    + - commit의 전단계입니다. + - commit을 하고자 하는 파일들은 commit하기 전에 add를 해줘야 commit 할 수 있습니다. +- **Git Commit**
    + - git에 저장하는 단계입니다. + - commit을 해주면 commit을 한 곳으로 언제든지 다시 돌아올 수 있기때문에 코드의 추가, 삭제가 자유로워집니다. +- **Git Push**
    + - git push를 하게되면 로컬 저장소에 있는 변경 이력이 원격 저장소에도 반영됩니다. + + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. +

    +- commit은 Git 저장소(원격 저장소)에 우리의 디렉토리(로컬 저장소)에 있는 모든 파일에 대한 스냅삿을 기록하는 것입니다. +- branch는 그저 commit 노드를 참조하는 것입니다. +- HEAD란 현재 checkout된 브랜치의 마지막 commit에 대한 포인터입니다. +- git checkout은 branch 혹은 commit을 전환하거나, 내용을 되돌리는 기능을 합니다. + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 +

    +- **git init과 git clone의 차이** + - git init : 빈 git 저장소를 만들거나 기존 저장소를 다시 초기화하는 명령어 + - git clone : git clone에 해당하는 저장소를 복제해 새 디렉터리로 가져오는 명령어
    +-> git init은 프로젝트 자체를 처음부터 시작하는것이고, git clone은 프로젝트 내에 중간 투입이 가능하며 clone 시 inti을 다시 해줄 필요가 없습니다. +- **이용방법** + - git init + - git clone +- **origin** + - remote 저장소를 가리키는 별칭입니다. + - 새로운 프로젝트를 clone할 때 : git clone <원격 저장소 URL> <디렉토리 이름> + - 기존 저장소에 새로운 원격 저장소를 추가할 때 : git remote add origin <원격 저장소 URL> + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. +

    +git reset은 HEAD의 위치를 현재 커밋에서 +1. 과거의 커밋으로 이동시킬 수도 있고 +2. 미래의 커밋으로 이동시킬 수도 있습니다. + +- **--soft--** + HEAD가 특정 커밋을 새롭게 가리키게 됩니다. 대신 현재 작업 중인 working directory와 staging area는 아무런 영향을 받지 않습니다. +- **--mixed--** + HEAD가 특정 커밋을 새롭게 가리키게 됩니다. 그리고 staging area도 해당 커밋의 모습과 동일하게 변합니다. 하지만 현재 작업 중인 working directory는 아무런 영향을 받지 않습니다. +- **--hard--** + HEAD가 특정 커밋을 새롭게 가리키게 됩니다. 그리고 staging area와 현재 작업중인 working directory도 해당 커밋의 모습과 동일하게 변합니다. + +*staging Area : 커밋을 하기 위해 $git add 명령어로 추가한 파일들이 모여있는 공간
    +**working directory** --$git add--> **staging area** -- $git commit --> **repository** + + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. +

    +- Pull Request : '코드를 수정했는데 당신도 코드를 수정했다면 제 수정한 내용도 적용시켜 주세요'라는 의미입니다. +- Merge : git branch를 다른 branch로 합치는 과정을 merge라 합니다. merge의 기본 단위는 브랜치이며, git merge 명령어로는 커밋 단위로 합치기가 불가능합니다. + - Fast-Forward : 현재 브랜치의 HEAD가 대상 브랜치의 HEAD까지로 옮기는 merge입니다. 대신 중간에 변경이 없을 때만 동작합니다. + - 3-Way Merge : 두 브랜치가 동일 선상이 아닐 때 3-way Merge가 발생합니다. 서로 다른 브랜치에 공통되는 base branch를 기점으로 충돌을 최소화 시키는 방법입니다. + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. +

    +두개의 공통 Base를 가진 Branch에서 한 Branch의 Base를 다른 Branch의 최신 커밋으로 branch의 base를 옮기는 작업입니다. 용어 그대로 베이스를 다시 설정하는 작업입니다.
    +Git에서 한 브랜치에서 다른 브랜치로 합치는 방법은 Merge와 Rebase입니다. Merge와 Rebase의 실행결과는 같지만 커밋 히스토리가 달라집니다. Merge는 쉽고 안전하지만 커밋 히스토리가 지저분할 수 있는 반면, Rebase는 잘 모르고 사용할 경우 위험할 수 있어 까다롭지만 커밋히스토리를 깔끔하게 관리할 수 있습니다. +
    +공유 branch에 대한 최신 commit을 반영하면서 작업을 해야할 때 git rebase를 사용한다면 작업 branch에서 항상 최신 변경사항을 적용한 commit을 유지할 수 있습니다. + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. +

    +작업 중에 갑작스럽게 다른 작업을 진행해야 할 때, 작업중인 사항을 잠시 치워두는 방법입니다. stash를 사용해서 잠시 코드를 다른 곳에 보관한 후에, 내가 원하는 branch에 적용할 수 있습니다. +- git stash : 현재 적용된 ccommit 이후로 변경된 모든 사항들이 stash 공간으로 이동됩니다. +- git stash pop : 다른 브랜치의 commit에 stash로 따로 저장해둔 코드들을 적용합니다. +- git stash -p : hunk를 기준으로 변경사항을 하나씩 확인하며 원하는 변화만 stash에 담을 수 있습니다. +*hunk : 깃에서 하나의 변경사항이 담긴 단위입니다. +- git stash -m "다음 스태시하는 이유" : 어떤 이유로 stash했느지를 메시지로 남기고 stash 할 수 있습니다. +- git stash list : 리스트상의 번호로 apply, drop, pop을 적용할 수 있습니다. (ex) git stash apply stash@{1}) +- git stash branch "브랜치명" : 새로운 브랜치를 만들어서 pop(적용 및 삭제)를 진행합니다. 기존 작업 내용과 stash한 내용이 충돌할 가능성을 염두해 두고 새로운 branch를 만들어서 테스트해볼 수 있습니다. + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From 8b974a0b9a17cf86b5bfe03cfdbba45ad5753c51 Mon Sep 17 00:00:00 2001 From: Wonseok Date: Sat, 23 Mar 2024 19:22:58 +0900 Subject: [PATCH 35/73] Step 1 jang jin young (#83) Co-authored-by: ddglackrp Co-authored-by: JJY --- README-JangJinYoung.md | 172 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 README-JangJinYoung.md diff --git a/README-JangJinYoung.md b/README-JangJinYoung.md new file mode 100644 index 0000000..3b027fe --- /dev/null +++ b/README-JangJinYoung.md @@ -0,0 +1,172 @@ +# Git 기초 + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +먼저 Git 과 Github에 대해서 알아보겠습니다. + +Git +- 분산 버전 관리 시스템 +- 로컬 및 원격 저장소 모두에서 작동하며, 개발자는 로컬에서 변경 사항을 커밋하고, 이것을 원격 저장소에 푸시 할 수 있다. + +GitHub +- Git 저장소를 위한 클라우드 기반 플랫폼 +- 코드 공유 및 협업을 위한 다양한 기능 제공 + +정리를 하자면 Git은 소프트웨어 개발에서 코드 버전 관리를 위한 도구이고, GitHub은 Git 저장소를 호스팅하고, 협업 기능을 제공하는 서비스 + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) + +Git의 흐름을 이해하기 위해 각 정의를 알아봅시다. + +1. Working Directory +- 개발자가 실제 파일을 수정하고 있는 디렉토리 +- 말 그대로 현재 작업 중인 디렉토리 +- **add** 를 통해 수정된 파일을 Staging Area 에 저장한다. +2. Staging Area +- 파일들이 **commit** 되기 전에 대기하는 장소 +3. Local Repo (HEAD) +- Local Repo : 개인(Local) 저장 공간 +- HEAD : 현재 작업 중인 브랜치의 가장 최근 커밋을 가르키는 포인터 +4. Remote Repo (MASTER) +- 원격 저장소 : 예를들어 GitHub +- MASTER : 프로젝트에서 주요 브랜치로써, 최종적인 또는 안정적인 버전의 코드가 유지되는 곳 (최근엔 MASTER를 사용하지 않고 main이라는 이름 사용) +- Local Repo 에서 **push** 를 통해 원격 저장소에 저장 + +git pull : 원격저장소에 있는 프로젝트의 변경사항을 그대로 로컬저장소에 옮겨와 자동으로 병합 + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) + +commit +- 프로젝트의 소스 코드에 대한 변경 내용을 기록하는 행위 + +branch +- 독립적인 개발 라인 +- 생성 : git branch [branch 이름] +- 이동 : git checkout [branch 이름] +- 삭제 : git branch -d [branch 이름] + +HEAD +- HEAD : 현재 작업 중인 브랜치의 가장 최근 커밋을 가르키는 포인터 + +## clone, init, origin +git **clone** +- 원격의 Git 저장소를 로컬에 복제할 때 사용하는 명령어 + +git **init** +- Local 에서 Git 저장소를 생성할 때 사용하는 명령어 + +origin +- 원격 저장소를 의미 +- origin이란 이름은 관행적 이름이라서 변경 가능 +- 설정 : git remote add origin [URL] + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) + +reset +- 시간을 과거의 특성 사건(commit)으로 되돌린다. +- 현재를 없던것 처럼 한다. + +hard +- 지정된 커밋으로 HEAD를 이동시키고, 스테이징 영역, 작업 디렉토리 모두를 지정된 커밋의 상태로 되돌린다. + +mixed +- 지정된 커밋으로 헤드가 이동하고, 스테이징 영역도 초기화된다. 하지만 작업 디렉토리의 파일은 그대로 유지된다. +- 즉, 이전 커밋 이후의 변경사항들은 작업 디렉토리에 남아 있게 되고, 이를 다시 스테이징 할 필요가 있다. + +soft +- 지정된 커밋으로 HEAD를 이동시키고, 작업 디렉토리는 변경되지 않는다. +- 즉 이전 커밋 이후의 모든 변경사항들은 스테이징 여역에 남게 된다. + +명령어 +- git reset --[hard, mixed, soft] + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request +- 한 브랜치의 변경사항을 다른 브랜치에 병합하기 전에 리뷰와 토론을 요청하는 기능 +- 검토가 완료되면, Pull Request는 최종적으로 Merge 될 수 있다. + +Merge +- 두 브랜치를 하나로 합치는 과정 +- Fast-Forward Merge + - 병합하려는 브랜치의 모든 커밋이 병합 대상 브랜치의 Head 커밋으로 이동되는 방식 + - 즉 별도의 병합 커밋을 생성하지 않고, 대상 브랜치의 포인터만 병합하려는 브랜치의 최신 커밋으로 옮깁니다. +- 3-Way Merge + - 두 브랜치의 최신 커밋과 공통 조상 커밋을 사용하여 병합을 수행합니다. + - 필요한 경우 별도의 병합 커밋을 생성하여 두 브랜치의 변경사항을 통합합니다. + - 병합 과정에서 충돌이 발생할 수 있으며, 사용자가 수동으로 충돌을 해결해야 할 수 있습니다. + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase +- 두 개의 공통 Base를 가진 Branch에서 한 Branch의 Base를 다른 Branch의 최신 커밋으로 Branch의 Base를 옮기는 작업. + +장점 +- 공유 Branch의 최신 변경사항을 즉각 반영할 수 있다. +- commit History를 깔끔하게 관리 할 수 있다. + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash +- 현재 작업 디렉토리의 변경 사항을 일시적으로 저장하고, 깨끗한 작업 트리로 돌아갈 수 있게 해주는 기능입니다. +- 즉 변경사항은 유지하고, 다른 Branch 로 이동하고 싶을때 사용하면 좋음 + +명령어 +- git stash +- git stash apply [stash_id] +- got stash drop [stash_id] + + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- `git rebase --interactive`란? + - git rebase 명령어를 대화형으로 실행 + +- branch의 upstream이란? (`git push --set-upstream`) + - 로컬 브랜치와 연결된 원격 브랜치를 의미한다. + +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. + - 1. 오픈 소스 프로젝트에 기여 : 원본 리포지토리에 대해 쓰기 권한이 없을 때 프로젝트를 Fork하여 변경한우 PR 요청 + - 2. 프로젝트의 안정성을 유지하며, 실험적인 기능을 개발할 떄 + +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +git fetch +- 원격 저장소의 최신 커밋, 브랜치, 태그 등의 정보를 로컬 저장소로 가져오지만, 실제 로컬 작업 디렉토리의 파일을 변경하지는 않습니다 +- 사용 시기 : 원격 저장소의 변경사항을 확인하고 싶지만, 바로 로컬 작업 디렉토리에 적용하고 싶지 않을 때 + +git pull +- git fetch + git merge 한 번에 실행 +- 사용 시기 : 원격 저장소의 최신 변경사항을 바로 로컬 작업 디렉토리에 적용하고 싶을 때 + +- `reset --hard`와 `push --force`의 적절한 사용법 +git reset --hard +- 현재 브랜치의 HEAD를 특정 커밋으로 이동시키고, 작업 디렉토리와 인덱스(스테이징 영역)를 그 커밋의 상태로 완전히 동기화합니다. 이 과정에서 지정된 커밋 이후의 모든 변경사항은 사라집니다 +- 사용 시기 : 로컬에서 실험적인 변경을 했지만, 이를 완전히 폐기하고 마지막 커밋 상태로 돌아가고 싶을 때 + +git push --force +- 로컬 브랜치의 현재 상태를 원격 저장소의 브랜치에 강제로 덮어쓰게 합니다. 이는 로컬의 히스토리가 원격 저장소와 다를 때 사용되며, 원격 저장소의 히스토리를 로컬의 것으로 대체합니다. +- 잘못된 커밋을 수정한 후, 이 변경사항을 원격 저장소에 반영해야 할 때 (공동으로 작업 시 조심해야함) + +`.gitignore` 사용법 + - '#'으로 시작하는 라인은 무시한다. + - 표준 Glob 패턴을 사용한다. + - 슬래시(/)로 시작하면 하위 디렉터리에 적용되지 않는다. + - 디렉토리는 슬래시(/)를 끝에 사용하는 것으로 표현한다. + - 느낌표(!)로 시작하는 패턴의 파일은 무시하지 않는다. + +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. + - parent/child/grandchild 와 더 깊은 계층을 가진 브랜치가 존재하므로 + - 파일구조를 떠올리면 쉬움 + +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + - Detached Head : detached HEAD 상태는 Git에서 현재 HEAD가 브랜치의 최신 커밋을 가리키고 있지 않고, 대신 특정 커밋을 직접 가리키고 있는 상태 + - 커밋을 하게 된다면? : 새 커밋은 현재 가리키고 있는 커밋을 부모로 하여 생성됩니다. 이렇게 생성된 커밋은 어떤 브랜치에도 속하지 않게 되며, 나중에 다른 브랜치로 체크아웃하면 이 커밋에 대한 참조를 잃어버릴 위험이 있습니다. + - 발생 할 수 있는 상황 + - 특정 커밋 체크아웃 + - 태그 체크아웃 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From f15f63d5e79981b5db3efb3d14f208d9ea432fa1 Mon Sep 17 00:00:00 2001 From: Wonseok Date: Sat, 23 Mar 2024 19:23:22 +0900 Subject: [PATCH 36/73] Step 1 dongin (#84) Co-authored-by: qlqlrh --- git-basics/README-dongin.md | 202 ++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 git-basics/README-dongin.md diff --git a/git-basics/README-dongin.md b/git-basics/README-dongin.md new file mode 100644 index 0000000..225caa2 --- /dev/null +++ b/git-basics/README-dongin.md @@ -0,0 +1,202 @@ +# Git 기초 🔥 + + +## 1️⃣ Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +**Git** +- 버전 관리 시스템. +- 하나의 프로젝트에 여러 사람이 작업할 때 작업의 히스토리(변경 사항)를 관리할 수 있게 해주는 도구이다. + +**Github** +- Git을 사용하여 관리되는 프로젝트를 올려두고, 협업을 쉽게 할 수 있도록 도움을 주는 웹 기반 플랫폼. +- 프로젝트의 버전을 관리하기 때문에 협업할 때 편리하다. + +**Repository** +- Local Repository는 자신의 컴퓨터에 있는 저장소를 의미하고, Remote Repository는 인터넷 상에 위치한 저장소를 의미한다. +- 보통, Local 저장소에서 Git을 통해 프로젝트를 작업한 후, Remote 저장소(Github)에 올려 다른 팀원들과 공유하는 방식으로 협업을 진행한다. + +> 이렇게, Git과 Github를 통해 코드의 변경 사항을 확인하고, 다양한 개발자와 원할한 작업이 가능하다. + + +## 2️⃣ Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) + +**Working Directory** +- 사용자가 실제로 작업하고 있는 로컬 파일 시스템의 디렉토리. +- 개발자가 코드를 수정, 생성하는 곳. + +**git add** +- Working Directory에서 변경된 파일들을 임시저장공간(Staging Area)로 이동시키는 명령어. +- Git이 추적해야 할 변경 사항을 선택하는 과정으로, 사용자는 commit할 파일들을 고를 수 있다. + +**git commit** +- Staging Area에 있는 변경 사항들을 Local Repository에 영구적으로 저장하는 명령어. +- 각 commit은 해당 프로젝트의 버전을 나타내며, 커밋 메시지를 통해 해당 변경 사항에 대한 설명을 추가할 수 있다. + +**git push** +- Local Repository의 commit을 Remote Repository (ex. Github)에 업로드하는 명령어. +- 코드의 최신 버전을 팀원들과 공유, 백업하는 데 사용된다. + +**git fetch** +- Remote Repository의 최신 변경 사항을 Local로 가져오는 명령어. +- 원격 저장소의 최신 상태를 확인하고 싶을 때 사용한다. git fetch 후, git merge나 git rebase를 사용해서 원격 변경 사항을 현재 작업 브랜치에 반영할 수 있다. + + +## 3️⃣ Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) + +**branch** +- 개발의 주 흐름에서 벗어나, 독립적으로 어떤 작업을 진행하기 위한 기능. +- 프로젝트의 한 부분에서 다른 부분으로 작업 범위를 옮길 수 있게 도와준다. +- 생성 : git branch <생성할 branch 이름> +- 삭제 : git branch -d <삭제할 branch 이름> +- 이동 : git checkout <이동할 branch 이름> + +**HEAD** +- 현재 작업 중인 branch의 가장 최신 커밋. +- Git이 어느 시점의 코드를 바탕으로 작업하고 있는지를 의미한다. 즉, 프로젝트의 현재 '상태'를 나타내는 포인터이다. + +**git checkout** +- 특정 branch로 전환하거나, 과거의 어떤 시점(버전)으로 작업 디렉토리의 상태를 되돌리는 명령어. +- 이전 버전의 파일을 복구하거나, 다른 버전 간의 차이를 비교할 수 있게 한다. + + +## 4️⃣ clone, init, origin + +**git clone** +- 기존에 존재하는 Git 저장소 (Repository)를 Local 컴퓨터로 복사해오는 명령어. +- Remote 저장소의 모든 데이터(코드, branch, 버전 기록 등)를 포함하여 복제한다. + +**git init** +- 새로운 Git 저장소를 만드는 명령어. +- Git이 작업 디렉토리를 Git 저장소로 초기화하고, 코드의 버전 관리를 시작할 수 있다. 새로운 저장소를 만들고, 프로젝트의 최초 버전을 관리하기 시작할 때 사용. + +**origin** +- 원격 저장소 (Remote Repository)를 나타내는 가장 일반적인 별칭. +- 프로젝트 초기에 `push, pull, fetch` 등의 명령어 사용 시, 원격 저장소를 지칭하는 별칭의 역할을 한다. +- 설정 방법 + 1. 원격 저장소 연결하기 + 2. 원격 저장소 확인하기 + - 현재 로컬과 연결된 모든 원격 저장소와 그들의 URL이 출력됨 + 3. 원격 저장소 별칭 변경, 제거 +```bash +# 원격 저장소를 새로 연결 +git remote add <별칭> <원격 저장소 주소> + +# 연결된 원격 저장소 확인 +git remote -v + +# 별칭 변경 +git remote rename <기존 별칭> <새 별칭> + +# 원격 저장소 연결 제거 +git remote remove <별칭> +``` + + +## 5️⃣ reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) + +**git reset** +- 주로 잘못된 commit을 취소하거나, 변경할 때 사용하는 명령어. +- 3가지 옵션을 통해 commit의 상태를 조절할 수 있다. +1. `--soft` + - 지정한 커밋으로 돌아간다. Staging Area(임시저장공간)의 상태는 유지한다. + - 커밋만 취소하고, 변경된 파일들을 다시 커밋할 때 사용 + - 즉, 가장 최근에 커밋된 내용이 사라지고, 변경 사항이 Staging Area에 남아 있어서 다시 커밋할 수 있다. +2. `--mixed` + - 기본옵션으로, 지정한 커밋으로 돌아가면서 Staging Area의 변경 사항도 취소한다. 작업 디렉토리의 파일 내용은 그대로 유지된다. + - 커밋을 취소하고, 변경 사항을 수정한 후, 다시 Staging 하고 싶을 때 사용 + - 즉, 지정한 커밋으로 되돌리는 동시에, Stage에 올라가 있던 변경 사항들이 작업 디렉토리에 남게 되어 수정 후 다시 Staging 가능하다. +3. `--hard` + - 지정한 커밋으로 돌아가고, Staging Area 및 작업 디렉토리의 변경 사항 모두를 취소한다. + - 잘못된 커밋을 완전히 취소하고, 이전 상태로 완벽하게 돌아가고 싶을 때 사용 + - 즉, 작업 디렉토리의 내용까지 완전히 되돌린다. 다시 되돌릴 수 없으므로, 사용에 주의해야 한다. + + +## 6️⃣ Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) + +**pull request** +- 코드 변경 사항을 검토/논의 후, 메인 프로젝트에 병합하기 위한 요청. +- 소스코드에 대한 변경 사항을 다른 사람들과 공유하고, 리뷰 받고자 할 때 사용하는 Github의 기능이다. +- 사용 과정 + 1. 자신의 Local에서 작업을 진행한 후, 변경 사항을 Github에 push한다. + 2. Github에서 메인 프로젝트 저장소로 pull request를 생성한다. + 3. 팀원/프로젝트 관리자가 이 pull request를 리뷰하고, 피드백을 제공한다. + 4. 모든 리뷰와 변경 요청이 완료되면, 메인 저장소의 관리자가 pull request를 merge하여 변경 사항을 프로젝트에 반영한다. + +**merge** +- 두 가지 branch의 변경 사항을 하나로 합치는 과정 +- 개발 과정에서 branch를 활용하여 기능 개발, 버그 수정 등을 진행한 수, 이를 다시 메인 코드라인에 병합해야 할 때 사용한다. +1. `fast-forward` +- 현재 branch의 HEAD가 병합하려는 branch의 히스토리에 이미 포함되어 있을 때, 단순히 현재 branch의 HEAD를 최신 commit으로 옮기는 방식 +- 별도의 commit이 생성되지 않는다. + +![fast-forward](https://abaft-chocolate-f90.notion.site/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F94628612-4999-4a9e-bd19-428a991f4eb4%2F07bf5db2-2482-457e-abea-7fff29726106%2FB1991810-9A2D-4C9B-A9AB-6134A6A0753E.jpg?table=block&id=f47f5bb3-c26e-471f-a9d9-0b509572734b&spaceId=94628612-4999-4a9e-bd19-428a991f4eb4&width=1500&userId=&cache=v2) +2. `3-way-merge` +- 두 branch의 기점부터 diverge(갈라진) 지전까지 고려하여 병합하는 방식 +- 병합된 새로운 commit이 생성되고, 이 commit은 두 branch의 각 최신 commit을 부모로 가진다. + +![3-way-merge](https://abaft-chocolate-f90.notion.site/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F94628612-4999-4a9e-bd19-428a991f4eb4%2Fb6a46e40-3024-4127-a4da-aa10af653a31%2F3F39365F-3CF4-419A-A822-76A79D49FAAB.jpg?table=block&id=e90ec2a9-b6d8-4f35-89a8-75d1a341ce69&spaceId=94628612-4999-4a9e-bd19-428a991f4eb4&width=1500&userId=&cache=v2) + + +## 7️⃣ rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) + +**rebase** +- 한 branch의 변경 사항을 다른 branch로 가져와서 두 branch의 공용 기저(base)를 다시 설정하는 과정 +- 즉, 기저 재설정을 의미하고, 복잡한 commit 히스토리를 깨끗하게 유지할 수 있는 방법이다. +- 장점 + - 공유하는 branch의 최신 변경 사항을 즉각 반영 + - commit 이력을 하나의 직선으로 관리 가능 (깔끔한 프로젝트 히스토리) +- 사용 시점 + - 자신의 작업 branch에 다른 branch의 최신 변경 사항을 반영하고 싶을 때 + - 병합 충동이 예상되는 상황에서 branch 충돌을 미리 해결하고 싶을 때 + - 단, 다른 사람과 공유하는 branch에서는 조심해서 사용 + +![rebase](https://abaft-chocolate-f90.notion.site/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F94628612-4999-4a9e-bd19-428a991f4eb4%2Fd8d9204a-5380-463b-bf7e-c7b7df15b75a%2F1928B19D-B305-4D8D-92C2-30615BFDEA56.jpg?table=block&id=9d289f35-9044-4087-afec-61e6858cfd4c&spaceId=94628612-4999-4a9e-bd19-428a991f4eb4&width=1500&userId=&cache=v2) + +## 8️⃣ stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) + +**git stash** +- 아직 마무리하지 않은 작업을 스택에 임시로 저장하는 명령어 +- 다른 작업을 수행한 후, 저장했던 변경 사항을 다시 적용할 수 있다. +- 수정한 파일만 저장한다 (Modified이지만 Tracked인 파일, Staged 파일 등) +- 활용 방법 + - 작업 중 급하게 다른 branch로 이동해야 하는 상황에서, 현재 branch의 변경 사항이 아직 commit할 준비가 안 되었을 때 + - 실험적인 변경을 해보고 싶지만, 현재 작업 내용을 잃고 싶지 않을 때 +```bash +# 현재 작업 중인 변경 사항을 임시 저장 +git stash + +# 가장 최근에 stash된 변경 사항을 다시 적용 +git stash pop + +# stash된 변경 사항을 적용하지만, stash 목록에서 제거 하지 않음 +git stash apply + +# 현재까지의 stash 목록을 보여줌 +git stash list + +# 모든 stash를 제거 +git stash clear +``` + + +## 9️⃣ Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +> [💡 git 연습 사이트 공유](https://learngitbranching.js.org/?locale=ko, "git 연습 사이트") + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From e7b8380ae4de19d8b2701ad899f569cf764cba70 Mon Sep 17 00:00:00 2001 From: Wonseok Date: Sat, 23 Mar 2024 19:24:31 +0900 Subject: [PATCH 37/73] Step 1 uicheol (#86) Co-authored-by: uicheol --- git-basics/README-uicheol.md | 204 +++++++++++++++++++++++++++++++++++ 1 file changed, 204 insertions(+) create mode 100644 git-basics/README-uicheol.md diff --git a/git-basics/README-uicheol.md b/git-basics/README-uicheol.md new file mode 100644 index 0000000..91ccd63 --- /dev/null +++ b/git-basics/README-uicheol.md @@ -0,0 +1,204 @@ +# Git 기초 + +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github + +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. + +local(로컬): 개발자가 작업하는 자신의 컴퓨터 환경을 의미함. +remote(원격): 다른 컴퓨터에 위치한 git 저장소로 github같은 서비스를 통해 호스팅됨. 다른 개발자와 협업을 가능하게함. + +git: 분산 버전 관리 시스템으로 소스코드의 변경사항을 추적, 관리하는 도구임. 개발자는 git을 사용해 로컬에서 프로젝트를 관리할 수 있다. +github: git 저장소를 호스팅하고 협업하는 웹 플랫폼으로 원격 저장소를 만들고 프로젝트를 공유하며 협업할 수 있다. + +## Git Workflow + +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. + +1. working directory + +- 개발자가 실제 파일을 작업하는 디렉토리 + +2. staging area + +- 변경된 파일을 임시로 준비하는 공간, 차후 commit할 변경사항들을 담고있다. + +3. local repository + +- staging area의 변경사항을 저장하는 레포지토리, 개발자의 컴퓨터에 위치한다. +- git commit 명령어를 통해 staging area에 있는 변경사항을 로컬에 저장한다. + +4. remote repository + +- github의 레포지토리를 의미 +- git push 명령어를 통해 local repository에 저장해둔 변경사항을 remote repository(github)에 올려준다. + +1. `git add` + +- 변경사항을 staging area에 추가함. + +2. `git commit` + +- staging area에 추가된 변경사항들을 local repository에 저장함. + +3. `git push` + +- local repo에 있던 변경사항을 remote repo(github)에 올림. + +## Branch, HEAD + +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + +1. branch + +- 코드의 분기를 나타내는 개념, 작업을 독립적으로 진행시키기 위해 브랜치를 생성한다. +- 브랜치는 만들거나 삭제, 이동이 가능함. + +생성: `git branch ` +삭제: `git branch -d ` +이동: `git checkout ` +생성 및 이동: `git checkout -b ` + +2. HEAD + +- 현재 작업중인 커밋의 상태를 가리키며, 변경사항을 추가하거나 커밋할 때 사용됨. + +## clone, init, origin + +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. + +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +1. `git clone` + +- remote repo(github)의 프로젝트를 local repo로 클론함. +- 이때 origin은 remote repo의 기본 이름임. + +2. `git init` + +- 새로운 local repo를 생성함. 이미 존재하는 프로젝트를 git으로 관리하려거나, 새로운 프로젝트를 시작할때 로컬 디렉토리를 git 저장소로 초기화할때 사용함. +- 현재 디렉토리를 git 저장소로 초기화하며, '.git'이라는 폴더가 생성됨. + +3. origin + +- git에서 remote repo의 기본 이름이다. git clone을 할 때 remote repo의 이름이 origin으로 자동 설정됨. +- origin은 remote repo의 url 변수이다. +- `git remote add origin ` 을 통해 remote repo url을 설정할 수 있다. + +## reset + +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. + +reset은 되돌아가는 것이다. +3가지는 working directory, staging area, repo가 어디까지 되돌아가는가에 따라 다르다. + +| | `git reset --soft` | `git reset --mixed` | `git reset --hard` | +| ----------------- | ------------------ | ------------------- | ------------------ | +| working directory | 그대로 남음 | 그대로 남음 | 이전 상태 | +| staging area | 그대로 남음 | 이전 상태 | 이전 상태 | +| repository | 이전 상태 | 이전 상태 | 이전 상태 | + +## Pull Request, Merge + +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. + +pull request + +- 다른 branch에서 작업한 내용들을 기존 코드에 병합하기 전 리뷰와 토론을 요청하는 기능. +- 변경사항에 대해 검토가 완료되면, 병합될 수 있다. + +merge + +1. fast-forward merge + +- main branch에 신규 커밋이 없는 경우, branch의 최신 커밋을 main branch으로만 바꿔주면 간단하게 merge를 진행할 수 있다. + +2. 3-way merge + +- main branch와 나의 branch에 각각 신규 커밋이 있을 때, main에 새로운 commit을 생성하면서 각 branch의 신규 커밋들을 합쳐준다. + +## rebase + +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. + +rebase + +- git에서 branch의 위치를 재정렬 하는 것을 말함. +- branch를 깔끔하게 정리하는데 좋다. +- rebase 후 fast-forward merge를 해서 branch를 정리한다. +- 아래 명령어로 branch를 main으로 rebase 후 fast-forward merge 할 수 있다. + ''' + git checkout + git rebase main + git checkout main + git merge + ''' + +## stash + +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. + +1. 임시로 변경사항을 저장하고 다른 작업 수행 + +- 현재 작업중인데 다른 branch로 이동해야하는 경우, 변경사항을 commit하지 않고 다른 branch로 이동가능. +- 'git stash'를 이용해 변경사항을 임시로 저장한 후 다른 branch로 이동하고, 작업 수행 후 stash에 있는 변경사항을 다시 가져올 수 있다. + +2. 작업중인 변경사항을 정리하고 임시로 저장 + +- 여러개의 파일을 수정하고 있을 때, 일부 변경사항을 commit 하기전 다른 변경사항을 진행해야하는 경우, 변경사항을 'git stash'를 사용해 작업중인 파일을 임시로 저장할 수 있다. + +3. 변경사항을 임시로 저장하고 충돌 해결 + +- merge나 rebase를 수행하는 동안 conflict가 발생하는 경우, 충돌을 해결하기 전 변경사항을 'git stash'로 임시로 저장할 수 있다. +- 충돌을 해결한 후 변경사항을 다시 적용할 수 있다. + +`git stash` +: 현재 작업 중인 변경사항을 스택에 임시로 저장 + +`git stash list` +: stash list 확인 + +`git stash pop` +: 가장 최근 stash를 pop해 적용함 + +`git stash apply ` +: 특정 stash를 적용 + +`git stash drop ` +: 특정 stash 삭제 + +`git stash clear` +: 모든 stash 삭제 + +## Advanced + +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. + +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions + +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From cfc716ef7227d7f11613fa1d05e6fb7da9f05885 Mon Sep 17 00:00:00 2001 From: cotidie Date: Sat, 23 Mar 2024 19:27:12 +0900 Subject: [PATCH 38/73] =?UTF-8?q?docs:=2020=EA=B8=B0=20step-1=20=EC=A1=B0?= =?UTF-8?q?=EC=82=AC=EB=82=B4=EC=97=AD=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README - JangHyunTae.md | 59 ------------------ git-basics/{ => 20th}/README-ChaGiEun.md | 0 git-basics/{ => 20th}/README-Hwanginseop.md | 0 .../20th/README-JangJinYoung.md | 0 git-basics/{ => 20th}/README-LeeSiWoong.md | 0 git-basics/{ => 20th}/README-dongin.md | 0 git-basics/{ => 20th}/README-hyojun.md | 0 git-basics/{ => 20th}/README-hyunjin.md | 0 git-basics/{ => 20th}/README-jusong.md | 0 git-basics/{ => 20th}/README-kangsumin.md | 0 git-basics/{ => 20th}/README-pakjeongwoo.md | 0 git-basics/{ => 20th}/README-uicheol.md | 0 git-basics/{ => 20th}/README-yongjin.md | 0 ...E-\354\213\240\354\230\201\354\204\234.md" | 0 git-basics/{ => 20th}/REAMDE-JANGHYUNTAE.md | 0 git-basics/{ => 20th}/image-1.png | Bin git-basics/{ => 20th}/image-2.png | Bin git-basics/{ => 20th}/image.png | Bin 18 files changed, 59 deletions(-) delete mode 100644 README - JangHyunTae.md rename git-basics/{ => 20th}/README-ChaGiEun.md (100%) rename git-basics/{ => 20th}/README-Hwanginseop.md (100%) rename README-JangJinYoung.md => git-basics/20th/README-JangJinYoung.md (100%) rename git-basics/{ => 20th}/README-LeeSiWoong.md (100%) rename git-basics/{ => 20th}/README-dongin.md (100%) rename git-basics/{ => 20th}/README-hyojun.md (100%) rename git-basics/{ => 20th}/README-hyunjin.md (100%) rename git-basics/{ => 20th}/README-jusong.md (100%) rename git-basics/{ => 20th}/README-kangsumin.md (100%) rename git-basics/{ => 20th}/README-pakjeongwoo.md (100%) rename git-basics/{ => 20th}/README-uicheol.md (100%) rename git-basics/{ => 20th}/README-yongjin.md (100%) rename "git-basics/README-\354\213\240\354\230\201\354\204\234.md" => "git-basics/20th/README-\354\213\240\354\230\201\354\204\234.md" (100%) rename git-basics/{ => 20th}/REAMDE-JANGHYUNTAE.md (100%) rename git-basics/{ => 20th}/image-1.png (100%) rename git-basics/{ => 20th}/image-2.png (100%) rename git-basics/{ => 20th}/image.png (100%) diff --git a/README - JangHyunTae.md b/README - JangHyunTae.md deleted file mode 100644 index de7e65a..0000000 --- a/README - JangHyunTae.md +++ /dev/null @@ -1,59 +0,0 @@ -# 1️⃣️ Git 기초 -![git-basics](https://digitalvarys.com/wp-content/uploads/2019/06/Git-Basics-and-Beginners-Guide-1.png) -Git과 Github 사용의 첫 단계입니다. - -## 🎯️ 목표 -- [ ] git의 동작 과정 이해 -- [ ] rebase와 reset 이해 -- [ ] Github 저장소 clone 하기 -- [ ] 브랜치를 만들고 커밋 쌓기 -- [ ] Pull Request와 Merge -- [ ] Markdown 문서 작성 - -## 📜️ 진행 -1. 이 리포지토리를 로컬에 clone 합니다. -```bash -# 적당한 폴더 생성 및 이동 (linux의 경우 ~/repositories 추천) -mkdir ~/repositories -cd ~/repositories - -# 현재 리포의 우측 상단에서 git clone URL 복사 후 붙여넣기 -git clone - -# 클론된 폴더로 이동 -cd study-git -``` -2. 이 브랜치(`step-1`)에서 본인의 브랜치를 만듭니다. - - 브랜치명은 `step-1-<이름>`으로 생성 -```bash -# step-1 브랜치로 이동 -git checkout step-1 - -# 본인 브랜치 생성 및 이동 -git checkout -b step-1-<이름> -``` -3. `/git-basics/README.md`를 복사하고, 빈 항목들을 조사해 채워넣습니다. - - 복사한 파일명은 `/git-basics/REAMDE-<이름>.md`로 변경 - - 채우면서 최소 5개의 커밋 쌓기 -```bash -# /git-basics/README.md 복사 -cp git-basics/README.md git-basics/README-<이름>.md - -# (README-<이름>.md를 채우면서) -git add . -git commit -m "<커밋 메시지>" -``` - -4. 본인 브랜치를 push하고 `step-1` 브랜치로 Pull Request를 올립니다. -```bash -# 브랜치를 처음 push하는 경우 원격 브랜치 등록 -# 현재 브랜치를 origin의 step-1-<이름> 브랜치와 연동한다. -# step-1-<이름> 대신 다른 브랜치명을 사용하면 해당 원격 브랜치와 연결됨. -git push --set-upstream origin step-1-<이름> -# 첫 push 이후에는 git push만 사용하면 됨 -git push -``` - -## ➕️ 추가 목표 -이제 Markdown 문서를 작성할 수 있게 되었으니, 본인의 Github 프로필을 꾸며봅시다. 아래 참고 블로그나 잘 꾸며진 프로필을 보면서 본인의 프로필을 만들어보세요. 연습을 위해 로컬 git에서 작업하시기 바랍니다. -- **참고**: [(노션) 깃허브 프로필 꾸미기!](https://80000coding.oopy.io/865f4b2a-5198-49e8-a173-0f893a4fed45) \ No newline at end of file diff --git a/git-basics/README-ChaGiEun.md b/git-basics/20th/README-ChaGiEun.md similarity index 100% rename from git-basics/README-ChaGiEun.md rename to git-basics/20th/README-ChaGiEun.md diff --git a/git-basics/README-Hwanginseop.md b/git-basics/20th/README-Hwanginseop.md similarity index 100% rename from git-basics/README-Hwanginseop.md rename to git-basics/20th/README-Hwanginseop.md diff --git a/README-JangJinYoung.md b/git-basics/20th/README-JangJinYoung.md similarity index 100% rename from README-JangJinYoung.md rename to git-basics/20th/README-JangJinYoung.md diff --git a/git-basics/README-LeeSiWoong.md b/git-basics/20th/README-LeeSiWoong.md similarity index 100% rename from git-basics/README-LeeSiWoong.md rename to git-basics/20th/README-LeeSiWoong.md diff --git a/git-basics/README-dongin.md b/git-basics/20th/README-dongin.md similarity index 100% rename from git-basics/README-dongin.md rename to git-basics/20th/README-dongin.md diff --git a/git-basics/README-hyojun.md b/git-basics/20th/README-hyojun.md similarity index 100% rename from git-basics/README-hyojun.md rename to git-basics/20th/README-hyojun.md diff --git a/git-basics/README-hyunjin.md b/git-basics/20th/README-hyunjin.md similarity index 100% rename from git-basics/README-hyunjin.md rename to git-basics/20th/README-hyunjin.md diff --git a/git-basics/README-jusong.md b/git-basics/20th/README-jusong.md similarity index 100% rename from git-basics/README-jusong.md rename to git-basics/20th/README-jusong.md diff --git a/git-basics/README-kangsumin.md b/git-basics/20th/README-kangsumin.md similarity index 100% rename from git-basics/README-kangsumin.md rename to git-basics/20th/README-kangsumin.md diff --git a/git-basics/README-pakjeongwoo.md b/git-basics/20th/README-pakjeongwoo.md similarity index 100% rename from git-basics/README-pakjeongwoo.md rename to git-basics/20th/README-pakjeongwoo.md diff --git a/git-basics/README-uicheol.md b/git-basics/20th/README-uicheol.md similarity index 100% rename from git-basics/README-uicheol.md rename to git-basics/20th/README-uicheol.md diff --git a/git-basics/README-yongjin.md b/git-basics/20th/README-yongjin.md similarity index 100% rename from git-basics/README-yongjin.md rename to git-basics/20th/README-yongjin.md diff --git "a/git-basics/README-\354\213\240\354\230\201\354\204\234.md" "b/git-basics/20th/README-\354\213\240\354\230\201\354\204\234.md" similarity index 100% rename from "git-basics/README-\354\213\240\354\230\201\354\204\234.md" rename to "git-basics/20th/README-\354\213\240\354\230\201\354\204\234.md" diff --git a/git-basics/REAMDE-JANGHYUNTAE.md b/git-basics/20th/REAMDE-JANGHYUNTAE.md similarity index 100% rename from git-basics/REAMDE-JANGHYUNTAE.md rename to git-basics/20th/REAMDE-JANGHYUNTAE.md diff --git a/git-basics/image-1.png b/git-basics/20th/image-1.png similarity index 100% rename from git-basics/image-1.png rename to git-basics/20th/image-1.png diff --git a/git-basics/image-2.png b/git-basics/20th/image-2.png similarity index 100% rename from git-basics/image-2.png rename to git-basics/20th/image-2.png diff --git a/git-basics/image.png b/git-basics/20th/image.png similarity index 100% rename from git-basics/image.png rename to git-basics/20th/image.png From 9fc86713aace37644622398220d956769025b3d0 Mon Sep 17 00:00:00 2001 From: gykim_kr Date: Sat, 15 Mar 2025 13:54:50 +0900 Subject: [PATCH 39/73] =?UTF-8?q?22=EA=B8=B0=20Github=20Workshop=20?= =?UTF-8?q?=EC=A4=80=EB=B9=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-basics/21th/README.md | 59 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 git-basics/21th/README.md diff --git a/git-basics/21th/README.md b/git-basics/21th/README.md new file mode 100644 index 0000000..a3c61be --- /dev/null +++ b/git-basics/21th/README.md @@ -0,0 +1,59 @@ +# 1️⃣️ Git 기초 +![git-basics](https://digitalvarys.com/wp-content/uploads/2019/06/Git-Basics-and-Beginners-Guide-1.png) +Git과 Github 사용의 첫 단계입니다. + +## 🎯️ 목표 +- [ ] git의 동작 과정 이해 +- [ ] rebase와 reset 이해 +- [ ] Github 저장소 clone 하기 +- [ ] 브랜치를 만들고 커밋 쌓기 +- [ ] Pull Request와 Merge +- [ ] Markdown 문서 작성 + +## 📜️ 진행 +1. 이 리포지토리를 로컬에 clone 합니다. +```bash +# 적당한 폴더 생성 및 이동 (linux의 경우 ~/repositories 추천) +mkdir ~/repositories +cd ~/repositories + +# 현재 리포의 우측 상단에서 git clone URL 복사 후 붙여넣기 +git clone + +# 클론된 폴더로 이동 +cd study-git +``` +2. 이 브랜치(`step-1`)에서 본인의 브랜치를 만듭니다. + - 브랜치명은 `step-1-<이름>`으로 생성 +```bash +# step-1 브랜치로 이동 +git checkout step-1 + +# 본인 브랜치 생성 및 이동 +git checkout -b step-1-<이름> +``` +3. `/git-basics/README.md`를 복사하고, 빈 항목들을 조사해 채워넣습니다. + - 복사한 파일명은 `/git-basics/REAMDE-<이름>.md`로 변경 + - 채우면서 최소 5개의 커밋 쌓기 +```bash +# /git-basics/README.md 복사 +cp git-basics/README.md git-basics/README-<이름>.md + +# (README-<이름>.md를 채우면서) +git add . +git commit -m "<커밋 메시지>" +``` + +4. 본인 브랜치를 push하고 `step-1` 브랜치로 Pull Request를 올립니다. +```bash +# 브랜치를 처음 push하는 경우 원격 브랜치 등록 +# 현재 브랜치를 origin의 step-1-<이름> 브랜치와 연동한다. +# step-1-<이름> 대신 다른 브랜치명을 사용하면 해당 원격 브랜치와 연결됨. +git push --set-upstream origin step-1-<이름> +# 첫 push 이후에는 git push만 사용하면 됨 +git push +``` + +## ➕️ 추가 목표 +이제 Markdown 문서를 작성할 수 있게 되었으니, 본인의 Github 프로필을 꾸며봅시다. 아래 참고 블로그나 잘 꾸며진 프로필을 보면서 본인의 프로필을 만들어보세요. 연습을 위해 로컬 git에서 작업하시기 바랍니다. +- **참고**: [(노션) 깃허브 프로필 꾸미기!](https://80000coding.oopy.io/865f4b2a-5198-49e8-a173-0f893a4fed45) \ No newline at end of file From 4394f9121cba1f9157acb52a2b8bfd3580d09f42 Mon Sep 17 00:00:00 2001 From: gykim_kr Date: Sat, 15 Mar 2025 13:55:28 +0900 Subject: [PATCH 40/73] =?UTF-8?q?22=EA=B8=B0=20Github=20Workshop=20?= =?UTF-8?q?=EC=A4=80=EB=B9=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-basics/{21th => 22th}/README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) rename git-basics/{21th => 22th}/README.md (81%) diff --git a/git-basics/21th/README.md b/git-basics/22th/README.md similarity index 81% rename from git-basics/21th/README.md rename to git-basics/22th/README.md index a3c61be..653164a 100644 --- a/git-basics/21th/README.md +++ b/git-basics/22th/README.md @@ -52,8 +52,4 @@ git commit -m "<커밋 메시지>" git push --set-upstream origin step-1-<이름> # 첫 push 이후에는 git push만 사용하면 됨 git push -``` - -## ➕️ 추가 목표 -이제 Markdown 문서를 작성할 수 있게 되었으니, 본인의 Github 프로필을 꾸며봅시다. 아래 참고 블로그나 잘 꾸며진 프로필을 보면서 본인의 프로필을 만들어보세요. 연습을 위해 로컬 git에서 작업하시기 바랍니다. -- **참고**: [(노션) 깃허브 프로필 꾸미기!](https://80000coding.oopy.io/865f4b2a-5198-49e8-a173-0f893a4fed45) \ No newline at end of file +``` \ No newline at end of file From 8822ba08175757397ab12a547d66e462a1606e93 Mon Sep 17 00:00:00 2001 From: Cotidie Date: Tue, 18 Mar 2025 10:20:22 +0900 Subject: [PATCH 41/73] =?UTF-8?q?Github=20Flow,=20Git=20Flow=20=EC=A3=BC?= =?UTF-8?q?=EC=A0=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-basics/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/git-basics/README.md b/git-basics/README.md index d0aec18..67ff3e7 100644 --- a/git-basics/README.md +++ b/git-basics/README.md @@ -44,6 +44,7 @@ git stash를 활용하는 방법에 대해 적어주세요. ## Advanced 다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- 브랜치관리전략에 대표적으로 Github Flow, Git Flow가 있습니다. 두 방식에서는 리포지토리를 어떻게 관리할까요? - `git rebase --interactive`란? - branch의 upstream이란? (`git push --set-upstream`) - PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. From c97888dce444c291743fbd2980b83ffdfd026272 Mon Sep 17 00:00:00 2001 From: Cotidie Date: Tue, 18 Mar 2025 11:15:20 +0900 Subject: [PATCH 42/73] =?UTF-8?q?step-1=20=EC=95=88=EB=82=B4=EB=AC=B8=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index e228f3e..07f12c7 100644 --- a/README.md +++ b/README.md @@ -18,10 +18,10 @@ mkdir ~/repositories cd ~/repositories # 현재 리포의 우측 상단에서 git clone URL 복사 후 붙여넣기 -git clone +git clone # 클론된 폴더로 이동 -cd study-git +cd workshop-git ``` 2. 이 브랜치(`step-1`)에서 본인의 브랜치를 만듭니다. - 브랜치명은 `step-1-<이름>`으로 생성 @@ -33,11 +33,16 @@ git checkout step-1 git checkout -b step-1-<이름> ``` 3. `/git-basics/README.md`를 복사하고, 빈 항목들을 조사해 채워넣습니다. - - 복사한 파일명은 `/git-basics/REAMDE-<이름>.md`로 변경 - - 채우면서 최소 5개의 커밋 쌓기 + - 복사한 파일명은 `/git-basics/<기수>/REAMDE-<이름>.md`로 변경 + - ex) `git-basics/22rd/README-WONSEOK.md` + - 채우면서 최소 3개의 커밋 쌓기 ```bash +# <기수> 폴더 생성하기 (없다면) +# 1은 뒤에 st, 2는 rd로 붙이기 (ex - 21st, 22rd, 23th, 24th, ...) +mkdir git-basics/<기수> + # /git-basics/README.md 복사 -cp git-basics/README.md git-basics/README-<이름>.md +cp git-basics/README.md git-basics/<기수>/README-<이름>.md # (README-<이름>.md를 채우면서) git add . From 8078e2b846c3d728caa2989d4a9e74947f4557f7 Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Tue, 18 Mar 2025 15:46:24 +0900 Subject: [PATCH 43/73] Rename README.md to README.md --- git-basics/{22th => 22nd}/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename git-basics/{22th => 22nd}/README.md (99%) diff --git a/git-basics/22th/README.md b/git-basics/22nd/README.md similarity index 99% rename from git-basics/22th/README.md rename to git-basics/22nd/README.md index 653164a..1f1cd00 100644 --- a/git-basics/22th/README.md +++ b/git-basics/22nd/README.md @@ -52,4 +52,4 @@ git commit -m "<커밋 메시지>" git push --set-upstream origin step-1-<이름> # 첫 push 이후에는 git push만 사용하면 됨 git push -``` \ No newline at end of file +``` From 5b5bf4a811c5d0d010b514986d5b4837b029588f Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Tue, 18 Mar 2025 16:46:00 +0900 Subject: [PATCH 44/73] =?UTF-8?q?22=EA=B8=B0=20Git=20=EC=9B=8C=ED=81=AC?= =?UTF-8?q?=EC=83=B5=20=EC=A4=80=EB=B9=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat : README.md 수정 --- git-basics/22nd/README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/git-basics/22nd/README.md b/git-basics/22nd/README.md index 1f1cd00..ead7b27 100644 --- a/git-basics/22nd/README.md +++ b/git-basics/22nd/README.md @@ -11,14 +11,14 @@ Git과 Github 사용의 첫 단계입니다. - [ ] Markdown 문서 작성 ## 📜️ 진행 -1. 이 리포지토리를 로컬에 clone 합니다. +1. 이 리포지토리를 로컬에 clone 합니다. 바탕화면 우클릭 후, 추가옵션 > Open Git bash here 선택 (Window 11 기준) ```bash # 적당한 폴더 생성 및 이동 (linux의 경우 ~/repositories 추천) -mkdir ~/repositories -cd ~/repositories +mkdir repositories +cd repositories # 현재 리포의 우측 상단에서 git clone URL 복사 후 붙여넣기 -git clone +git clone https://github.com/ApptiveDev/workshop-git.git # 클론된 폴더로 이동 cd study-git @@ -30,16 +30,16 @@ cd study-git git checkout step-1 # 본인 브랜치 생성 및 이동 -git checkout -b step-1-<이름> +git checkout -b step-1-이름 ``` 3. `/git-basics/README.md`를 복사하고, 빈 항목들을 조사해 채워넣습니다. - 복사한 파일명은 `/git-basics/REAMDE-<이름>.md`로 변경 - 채우면서 최소 5개의 커밋 쌓기 ```bash # /git-basics/README.md 복사 -cp git-basics/README.md git-basics/README-<이름>.md +cp git-basics/22nd/README.md git-basics/22nd/README-이름.md -# (README-<이름>.md를 채우면서) +# (README-<이름>.md를 꾸준히 채우면서) git add . git commit -m "<커밋 메시지>" ``` @@ -49,7 +49,7 @@ git commit -m "<커밋 메시지>" # 브랜치를 처음 push하는 경우 원격 브랜치 등록 # 현재 브랜치를 origin의 step-1-<이름> 브랜치와 연동한다. # step-1-<이름> 대신 다른 브랜치명을 사용하면 해당 원격 브랜치와 연결됨. -git push --set-upstream origin step-1-<이름> +git push --set-upstream origin step-1-이름 # 첫 push 이후에는 git push만 사용하면 됨 git push ``` From 4a5062a426c63d3c2160f35b8982c34f2e8381ed Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Tue, 18 Mar 2025 16:56:50 +0900 Subject: [PATCH 45/73] =?UTF-8?q?22=EA=B8=B0=20Git=20=EC=9B=8C=ED=81=AC?= =?UTF-8?q?=EC=83=B5=20=EC=A4=80=EB=B9=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-basics/22nd/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/git-basics/22nd/README.md b/git-basics/22nd/README.md index ead7b27..5227579 100644 --- a/git-basics/22nd/README.md +++ b/git-basics/22nd/README.md @@ -34,10 +34,11 @@ git checkout -b step-1-이름 ``` 3. `/git-basics/README.md`를 복사하고, 빈 항목들을 조사해 채워넣습니다. - 복사한 파일명은 `/git-basics/REAMDE-<이름>.md`로 변경 - - 채우면서 최소 5개의 커밋 쌓기 + - ex) README-kimgiyun.md + - 채우면서, 한 챕터 당 1개의 commit 쌓아보기 ```bash # /git-basics/README.md 복사 -cp git-basics/22nd/README.md git-basics/22nd/README-이름.md +cp git-basics/README.md git-basics/22nd/README-이름.md # (README-<이름>.md를 꾸준히 채우면서) git add . From 574ad13bc10d7b65798f7fe6034bb47fb9543fda Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Tue, 18 Mar 2025 16:59:33 +0900 Subject: [PATCH 46/73] =?UTF-8?q?22=EA=B8=B0=20Git=20=EC=9B=8C=ED=81=AC?= =?UTF-8?q?=EC=83=B5=20=EC=A4=80=EB=B9=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-basics/22nd/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/git-basics/22nd/README.md b/git-basics/22nd/README.md index 5227579..347bdee 100644 --- a/git-basics/22nd/README.md +++ b/git-basics/22nd/README.md @@ -33,9 +33,9 @@ git checkout step-1 git checkout -b step-1-이름 ``` 3. `/git-basics/README.md`를 복사하고, 빈 항목들을 조사해 채워넣습니다. - - 복사한 파일명은 `/git-basics/REAMDE-<이름>.md`로 변경 + - 복사한 파일명은 `/git-basics/REAMDE-<이름>.md`로 설정합니다. - ex) README-kimgiyun.md - - 채우면서, 한 챕터 당 1개의 commit 쌓아보기 + - 해당 파일을 메모장, VSCode 등으로 연 뒤 내용을 조사해 채우면서, 최소 3개의 commit을 쌓아봅시다. ```bash # /git-basics/README.md 복사 cp git-basics/README.md git-basics/22nd/README-이름.md @@ -45,7 +45,7 @@ git add . git commit -m "<커밋 메시지>" ``` -4. 본인 브랜치를 push하고 `step-1` 브랜치로 Pull Request를 올립니다. +4. 본인 브랜치를 APPTIVE 원격 저장소로 push한 뒤, `step-1` 브랜치로 Pull Request를 올립니다. ```bash # 브랜치를 처음 push하는 경우 원격 브랜치 등록 # 현재 브랜치를 origin의 step-1-<이름> 브랜치와 연동한다. From 47e753625e164eb3cf44ce53432fbde86a1397a8 Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Tue, 18 Mar 2025 17:15:20 +0900 Subject: [PATCH 47/73] =?UTF-8?q?22=EA=B8=B0=20Git=20=EC=9B=8C=ED=81=AC?= =?UTF-8?q?=EC=83=B5=20=EC=A4=80=EB=B9=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-basics/22nd/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/git-basics/22nd/README.md b/git-basics/22nd/README.md index 347bdee..1b5c173 100644 --- a/git-basics/22nd/README.md +++ b/git-basics/22nd/README.md @@ -11,7 +11,8 @@ Git과 Github 사용의 첫 단계입니다. - [ ] Markdown 문서 작성 ## 📜️ 진행 -1. 이 리포지토리를 로컬에 clone 합니다. 바탕화면 우클릭 후, 추가옵션 > Open Git bash here 선택 (Window 11 기준) +0. 본인의 OS 환경에 적합한 Git bash를 설치합니다. APPTIVE Git 워크샵은 bash를 활용해 진행됩니다. [설치파일 다운로드 링크](https://git-scm.com/downloads) +1. 설치 후, 본 리포지토리를 로컬에 clone 합니다. 바탕화면 우클릭 후, 추가옵션 > Open Git bash here 선택 (Window 11 기준). bash 콘솔창에 아래 명령어 입력. ```bash # 적당한 폴더 생성 및 이동 (linux의 경우 ~/repositories 추천) mkdir repositories From 8ed76ac3b39f2d8c5e4fa614e6f38f850b817409 Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Tue, 18 Mar 2025 19:39:40 +0900 Subject: [PATCH 48/73] =?UTF-8?q?22=EA=B8=B0=20Git=20=EC=9B=8C=ED=81=AC?= =?UTF-8?q?=EC=83=B5=20=EC=A4=80=EB=B9=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 최종 수정 --- git-basics/22nd/README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/git-basics/22nd/README.md b/git-basics/22nd/README.md index 1b5c173..f907ac4 100644 --- a/git-basics/22nd/README.md +++ b/git-basics/22nd/README.md @@ -4,7 +4,6 @@ Git과 Github 사용의 첫 단계입니다. ## 🎯️ 목표 - [ ] git의 동작 과정 이해 -- [ ] rebase와 reset 이해 - [ ] Github 저장소 clone 하기 - [ ] 브랜치를 만들고 커밋 쌓기 - [ ] Pull Request와 Merge @@ -34,19 +33,21 @@ git checkout step-1 git checkout -b step-1-이름 ``` 3. `/git-basics/README.md`를 복사하고, 빈 항목들을 조사해 채워넣습니다. - - 복사한 파일명은 `/git-basics/REAMDE-<이름>.md`로 설정합니다. + - 복사한 파일명은 `REAMDE-이름.md`로 설정합니다. - ex) README-kimgiyun.md - - 해당 파일을 메모장, VSCode 등으로 연 뒤 내용을 조사해 채우면서, 최소 3개의 commit을 쌓아봅시다. ```bash # /git-basics/README.md 복사 cp git-basics/README.md git-basics/22nd/README-이름.md +``` +4. git bash를 켜두고서 해당 파일을 메모장, VSCode 등으로 연 뒤 내용을 조사해 채우면서, 최소 3개의 commit을 쌓아봅시다. +```bash # (README-<이름>.md를 꾸준히 채우면서) git add . git commit -m "<커밋 메시지>" ``` -4. 본인 브랜치를 APPTIVE 원격 저장소로 push한 뒤, `step-1` 브랜치로 Pull Request를 올립니다. +5. 본인 브랜치를 APPTIVE 원격 저장소로 push한 뒤, `step-1` 브랜치로 Pull Request를 올립니다. ```bash # 브랜치를 처음 push하는 경우 원격 브랜치 등록 # 현재 브랜치를 origin의 step-1-<이름> 브랜치와 연동한다. From ee3a9e23f114d8c17c9d4f7d4247e2f47fde2e30 Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Wed, 19 Mar 2025 12:43:03 +0900 Subject: [PATCH 49/73] =?UTF-8?q?22=EA=B8=B0=20Git=20=EC=9B=8C=ED=81=AC?= =?UTF-8?q?=EC=83=B5=20=EC=A4=80=EB=B9=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 수정 --- git-basics/22nd/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/git-basics/22nd/README.md b/git-basics/22nd/README.md index f907ac4..cc6560d 100644 --- a/git-basics/22nd/README.md +++ b/git-basics/22nd/README.md @@ -10,8 +10,7 @@ Git과 Github 사용의 첫 단계입니다. - [ ] Markdown 문서 작성 ## 📜️ 진행 -0. 본인의 OS 환경에 적합한 Git bash를 설치합니다. APPTIVE Git 워크샵은 bash를 활용해 진행됩니다. [설치파일 다운로드 링크](https://git-scm.com/downloads) -1. 설치 후, 본 리포지토리를 로컬에 clone 합니다. 바탕화면 우클릭 후, 추가옵션 > Open Git bash here 선택 (Window 11 기준). bash 콘솔창에 아래 명령어 입력. +1. 본 리포지토리를 로컬에 clone 합니다. 바탕화면 우클릭 후, 추가옵션 > Open Git bash here 선택 (Window 11 기준). bash 콘솔창에 아래 명령어 입력. ```bash # 적당한 폴더 생성 및 이동 (linux의 경우 ~/repositories 추천) mkdir repositories @@ -21,7 +20,7 @@ cd repositories git clone https://github.com/ApptiveDev/workshop-git.git # 클론된 폴더로 이동 -cd study-git +cd workshop-git ``` 2. 이 브랜치(`step-1`)에서 본인의 브랜치를 만듭니다. - 브랜치명은 `step-1-<이름>`으로 생성 From ce0aff20830db56cf531a3f6e235ff0601530407 Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Wed, 19 Mar 2025 13:00:46 +0900 Subject: [PATCH 50/73] =?UTF-8?q?22=EA=B8=B0=20Git=20=EC=9B=8C=ED=81=AC?= =?UTF-8?q?=EC=83=B5=20=EC=A4=80=EB=B9=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 07f12c7..d3e72c7 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ git checkout -b step-1-<이름> - 채우면서 최소 3개의 커밋 쌓기 ```bash # <기수> 폴더 생성하기 (없다면) -# 1은 뒤에 st, 2는 rd로 붙이기 (ex - 21st, 22rd, 23th, 24th, ...) +# 1은 뒤에 st, 2는 nd, 3은 rd로 붙이기 (ex - 21st, 22nd, 23rd, 24th, ...) mkdir git-basics/<기수> # /git-basics/README.md 복사 @@ -61,4 +61,4 @@ git push ## ➕️ 추가 목표 이제 Markdown 문서를 작성할 수 있게 되었으니, 본인의 Github 프로필을 꾸며봅시다. 아래 참고 블로그나 잘 꾸며진 프로필을 보면서 본인의 프로필을 만들어보세요. 연습을 위해 로컬 git에서 작업하시기 바랍니다. -- **참고**: [(노션) 깃허브 프로필 꾸미기!](https://80000coding.oopy.io/865f4b2a-5198-49e8-a173-0f893a4fed45) \ No newline at end of file +- **참고**: [(노션) 깃허브 프로필 꾸미기!](https://80000coding.oopy.io/865f4b2a-5198-49e8-a173-0f893a4fed45) From d5d3f633bac5910a71d1a44802d3e68af80c14b9 Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Wed, 19 Mar 2025 13:17:40 +0900 Subject: [PATCH 51/73] =?UTF-8?q?22=EA=B8=B0=20Git=20=EC=9B=8C=ED=81=AC?= =?UTF-8?q?=EC=83=B5=20=EC=A4=80=EB=B9=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-basics/22nd/README.md | 115 +++++++++++++++++++------------------- 1 file changed, 58 insertions(+), 57 deletions(-) diff --git a/git-basics/22nd/README.md b/git-basics/22nd/README.md index cc6560d..67ff3e7 100644 --- a/git-basics/22nd/README.md +++ b/git-basics/22nd/README.md @@ -1,57 +1,58 @@ -# 1️⃣️ Git 기초 -![git-basics](https://digitalvarys.com/wp-content/uploads/2019/06/Git-Basics-and-Beginners-Guide-1.png) -Git과 Github 사용의 첫 단계입니다. - -## 🎯️ 목표 -- [ ] git의 동작 과정 이해 -- [ ] Github 저장소 clone 하기 -- [ ] 브랜치를 만들고 커밋 쌓기 -- [ ] Pull Request와 Merge -- [ ] Markdown 문서 작성 - -## 📜️ 진행 -1. 본 리포지토리를 로컬에 clone 합니다. 바탕화면 우클릭 후, 추가옵션 > Open Git bash here 선택 (Window 11 기준). bash 콘솔창에 아래 명령어 입력. -```bash -# 적당한 폴더 생성 및 이동 (linux의 경우 ~/repositories 추천) -mkdir repositories -cd repositories - -# 현재 리포의 우측 상단에서 git clone URL 복사 후 붙여넣기 -git clone https://github.com/ApptiveDev/workshop-git.git - -# 클론된 폴더로 이동 -cd workshop-git -``` -2. 이 브랜치(`step-1`)에서 본인의 브랜치를 만듭니다. - - 브랜치명은 `step-1-<이름>`으로 생성 -```bash -# step-1 브랜치로 이동 -git checkout step-1 - -# 본인 브랜치 생성 및 이동 -git checkout -b step-1-이름 -``` -3. `/git-basics/README.md`를 복사하고, 빈 항목들을 조사해 채워넣습니다. - - 복사한 파일명은 `REAMDE-이름.md`로 설정합니다. - - ex) README-kimgiyun.md -```bash -# /git-basics/README.md 복사 -cp git-basics/README.md git-basics/22nd/README-이름.md -``` - -4. git bash를 켜두고서 해당 파일을 메모장, VSCode 등으로 연 뒤 내용을 조사해 채우면서, 최소 3개의 commit을 쌓아봅시다. -```bash -# (README-<이름>.md를 꾸준히 채우면서) -git add . -git commit -m "<커밋 메시지>" -``` - -5. 본인 브랜치를 APPTIVE 원격 저장소로 push한 뒤, `step-1` 브랜치로 Pull Request를 올립니다. -```bash -# 브랜치를 처음 push하는 경우 원격 브랜치 등록 -# 현재 브랜치를 origin의 step-1-<이름> 브랜치와 연동한다. -# step-1-<이름> 대신 다른 브랜치명을 사용하면 해당 원격 브랜치와 연결됨. -git push --set-upstream origin step-1-이름 -# 첫 push 이후에는 git push만 사용하면 됨 -git push -``` +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- 브랜치관리전략에 대표적으로 Github Flow, Git Flow가 있습니다. 두 방식에서는 리포지토리를 어떻게 관리할까요? +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From bd4dbc973811452079b0498d4fb7c4429e46648b Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Wed, 19 Mar 2025 13:28:05 +0900 Subject: [PATCH 52/73] =?UTF-8?q?22=EA=B8=B0=20Git=20=EC=9B=8C=ED=81=AC?= =?UTF-8?q?=EC=83=B5=20=EC=A4=80=EB=B9=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d3e72c7..6bdd03e 100644 --- a/README.md +++ b/README.md @@ -14,24 +14,27 @@ Git과 Github 사용의 첫 단계입니다. 1. 이 리포지토리를 로컬에 clone 합니다. ```bash # 적당한 폴더 생성 및 이동 (linux의 경우 ~/repositories 추천) +# Window의 경우 아래 명령어 실행 시, 기본적으로 C:\Users\사용자 계정명\repositories로 생성됩니다. mkdir ~/repositories cd ~/repositories # 현재 리포의 우측 상단에서 git clone URL 복사 후 붙여넣기 -git clone +git clone https://github.com/ApptiveDev/workshop-git.git # 클론된 폴더로 이동 cd workshop-git ``` + 2. 이 브랜치(`step-1`)에서 본인의 브랜치를 만듭니다. - - 브랜치명은 `step-1-<이름>`으로 생성 + - 브랜치명은 `step-1-이름`으로 생성 ```bash # step-1 브랜치로 이동 git checkout step-1 # 본인 브랜치 생성 및 이동 -git checkout -b step-1-<이름> +git checkout -b step-1-이름 ``` + 3. `/git-basics/README.md`를 복사하고, 빈 항목들을 조사해 채워넣습니다. - 복사한 파일명은 `/git-basics/<기수>/REAMDE-<이름>.md`로 변경 - ex) `git-basics/22rd/README-WONSEOK.md` @@ -42,7 +45,7 @@ git checkout -b step-1-<이름> mkdir git-basics/<기수> # /git-basics/README.md 복사 -cp git-basics/README.md git-basics/<기수>/README-<이름>.md +cp git-basics/<기수>/README.md git-basics/<기수>/README-<이름>.md # (README-<이름>.md를 채우면서) git add . From caf8a23f00daeaee470be528265114457ddcd342 Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Sat, 22 Mar 2025 15:51:46 +0900 Subject: [PATCH 53/73] =?UTF-8?q?Step=201=20=EA=B3=BD=EC=9C=A4=EC=A0=95=20?= =?UTF-8?q?(#122)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 새로 구현한 기능 및 주요 변경점 # 버그 해결 💊 해결한 버그 # 리팩토링 🛠 리팩토링 내역 # 스크린샷 🖼 변경된 부분에 대한 스크린샷 # 비고 ✏ 리뷰어에게 전하는 말 등
    사용하지 않은 항목은 모두 지워주세요. --------- Co-authored-by: yoonjung561 --- git-basics/22nd/README-YOONJUNG.md | 81 ++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 git-basics/22nd/README-YOONJUNG.md diff --git a/git-basics/22nd/README-YOONJUNG.md b/git-basics/22nd/README-YOONJUNG.md new file mode 100644 index 0000000..ffe87bc --- /dev/null +++ b/git-basics/22nd/README-YOONJUNG.md @@ -0,0 +1,81 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) + +- Git : 분산 버전 관리 시스템 +- Github : Git으로 관리하는 프로젝트의 공유 및 협업을 위한 플랫폼 +- 개인 컴퓨터의 저장소 : local / 서버의 원격 저장소 : remote +- local에서 작업한 프로젝트를 remote에 업로드하는 방식으로 변경 사항 반영 및 협업을 진행함. + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) + +- Working Directory : 사용자의 작업 공간. +- Git Add : 변경 사항을 임시 공간 stage에 올림. +- Git Commit : 변경 사항에 대해 저장 및 기록함. +- Git Push : 변경 사항을 remote로 업로드함. + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) + +- Branch : Commit을 가리키는 포인터 +- HEAD : Branch를 가리키는 포인터 +- HEAD가 가리키는 Commit에 따라 Working Directory가 달라지며, checkout을 통해 HEAD가 가리키는 Branch를 변경할 수 있음. + +---- +**# Branch Command** +- Branch 생성 : git branch [branch] +- Branch 삭제 : git branch -D [branch] +- Branch 이동 : git checkout [branch] + + +## clone, init, origin +- clone, init은 모두 Git 저장소를 만드는 Command이나, 방법의 차이가 존재함. +- git clone : 기존의 다른 Git 저장소를 복사하는 방법. +- git init : 버전 관리를 하지 않던 프로젝트 파일을 Git 저장소에 추가하는 방법. +- origin : 작업중인 local과 연결된 remote의 주소를 가리키는 단축 키워드. +- 일반적으로 origin은 git clone 할 때 자동으로 생성되며, origin이 가리키는 주소를 통해 데이터 동기화 및 업데이트가 가능함. + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +- reset : HEAD의 위치를 과거 혹은 미래의 commit으로 이동시킬 수 있음. +- type1) --soft : HEAD가 특정 commit을 새롭게 가리키지만, 작업 중인 working directory와 staging area는 영향을 받지 않음. +- type2) --mixed : HEAD가 특정 commit을 새롭게 가리키며 staging area도 동일하게 변하나, working directory는 영향을 받지 않음. +- type3) --hard : HEAD가 새롭게 가리키는 commit과 동일하게 staging area와 working directory가 모두 변함. + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +- Fork : 다른 사용자의 저장소를 복사하는 것. +- Pull Request : Rork를 통해 복사한 내용을 개인 작업 공간에서 업데이트 후, 원본 저장소에 적용되도록 다른 사용자에게 pull 요청을 보내는 것. +- -- +- Merge : 서로 다른 브랜치에서 작업한 내용을 합쳐야 하는 경우 사용. +- type1) Fast-Forward : merge commit이 생기지 않고, merge가 실행된 branch의 HEAD가 병합되는 branch의 HEAD commit으로 이동하는 방식. +- type2) 3-Way Merge : 두 branch가 commit history 상에서 분리된 2개의 선에 각각 존재할 때, merge commit을 새로 생성하는 방식. + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +- rebase : 서로 다른 branch에서 작업한 내용을 합칠 때 사용하는 것으로, branch의 base commit을 재설정함. +- 깃 히스토리가 직렬로 정리되어 깔끔한 관리가 가능함. + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +- stash : 변경사항을 일시적으로 저장하는 기능. +- commit하기에 이르거나, 다른 branch로 checkout하면서 변경 사항을 유지하고 싶은 경우 사용함. 일시적 저장 후 나중에 다시 사용이 가능함. +- 작업 중인 변경 사항을 stack에 저장하고, working directory를 깨끗한 상태로 만듦. + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- 브랜치관리전략에 대표적으로 Github Flow, Git Flow가 있습니다. 두 방식에서는 리포지토리를 어떻게 관리할까요? +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From e5a9ac306245b2cbdbdbbe93551bbe35933ed459 Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Sat, 22 Mar 2025 15:54:06 +0900 Subject: [PATCH 54/73] =?UTF-8?q?Step=201=20=EA=B9=80=EC=9E=AC=EC=8B=9D=20?= =?UTF-8?q?(#123)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 새로 구현한 기능 및 주요 변경점 # 버그 해결 💊 해결한 버그 # 리팩토링 🛠 리팩토링 내역 # 스크린샷 🖼 변경된 부분에 대한 스크린샷 # 비고 ✏ 리뷰어에게 전하는 말 등
    사용하지 않은 항목은 모두 지워주세요. --------- Co-authored-by: KimJ6 --- ...E-\352\271\200\354\236\254\354\213\235.md" | 176 ++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 "git-basics/22nd/README-\352\271\200\354\236\254\354\213\235.md" diff --git "a/git-basics/22nd/README-\352\271\200\354\236\254\354\213\235.md" "b/git-basics/22nd/README-\352\271\200\354\236\254\354\213\235.md" new file mode 100644 index 0000000..18dd978 --- /dev/null +++ "b/git-basics/22nd/README-\352\271\200\354\236\254\354\213\235.md" @@ -0,0 +1,176 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. + +git을 통해 local에 저장, version 관리에 이용 + +github를 이용해 git이 local에 저장하는 데이터를 remote에 업로드, 온라인으로 공유, 협업을 지원 + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. + +Working Directory : 일반적으로 local의 실제 파일을 작업, 수정하는 공간 + +Git Add : 변경된 파일을 Staging Area에 올리기. git이 추적할 변경 사항을 지정 + +Git Commit : Staging Area에 추가된 변경 사항을 Local Repo에 저장. 새로운 version 추가 + +Git Push : local에 저장된 commit된 변경 사항을 github에 업로드 + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + +commit : 개발과정에서 변경된 내용을 기록하는 version의 단위 + +branch : 파생된 독립적인 개발 라인 + +head : 현재 위치한 commit 또는 branch를 가리키는 pointer + + # 새로운 브랜치 생성 (feature 브랜치) + git branch feature-branch + + # 브랜치 목록 확인 + git branch + + # 현재 HEAD가 가리키는 커밋 확인 + git log --oneline --decorate + + # 특정 커밋으로 이동 (Detached HEAD 상태) + git checkout <커밋 해시값> + + # 특정 브랜치로 이동 (Checkout) + git checkout feature-branch + + # 다시 원래 브랜치로 돌아오기 + git checkout main + + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +git clone : remote Repo에서 local로 복사 + + #복사 + git clone + +git init : 새로운 git 저정장소 생성 + + # 현재 디렉토리를 Git 저장소로 만들기 + git init + + # 원격 저장소(origin) 연결 + git remote add origin + + # 변경 사항을 원격 저장소로 푸시 + git push -u origin main + +origin : remote Repo의 기본 이름 + + # 확인 + git remote -v + + # 설정 + git remote add origin + + # 삭제 + git remote remove origin + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. + + # 최근 commit만 취소 + git reset --soft + + # 최근 commit 취소, staging area 비움 + git reset --mixed + + # local 포함, 모든 변경 사항 삭제. 이전 commit의 version으로 되돌림 + git reset --hard + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. + +PR : github에서 코드 리뷰, 병합을 요청하는 기능 + +Merge : 한 branch의 변경 사항을 다른 branch에 반영하는 과정. PR 승인 후 진행행 + +Fast-Forward : 새로운 branch에서 변경 사항만 추가된 경우, Git이 단순히 commit을 이동시키는 방식 + + # Fast-Forward 병합 실행 + git merge feature + +3-Way Merge : Git이 각 branch의 변경 사항을 비교하여 새로운 Merge Commit을 생성. +main과 feature가 서로 다른 변경 사항을 포함하고 있으면 3-Way Merge가 발생 + + # 3-Way Merge 실행 + git merge --no-ff feature + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. + +한 브랜치의 변경 사항을 다른 branch의 최신 commit 위로 재배치. +branch의 commit을 정리하고 히스토리를 깔끔하게 유지. 기존 commit 히스토리를 보존하고자 한다면 사용에 유의 + + # feature 브랜치를 main 브랜치의 최신 상태로 업데이트 + git checkout feature + git rebase main + + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. + +작업 변경 사항을 add, commit 없이 임시저장. + + # 임시 저장 + git stash + + # 최근 저장 불러오기 + git stash pop + + # 목록 보기 + git stash list + + # 지정 불러오기 + git stash apply stash@{0} + + # 지정 삭제 + git stash drop stash@{0} + + # 전체 삭제 + git stash clear + + # 메모 달아 저장하기 + git stash save "메모" + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- 브랜치관리전략에 대표적으로 Github Flow, Git Flow가 있습니다. 두 방식에서는 리포지토리를 어떻게 관리할까요? +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From ffa035ee3c4ff049c337c72b5182fb47b3b150d6 Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Sat, 22 Mar 2025 15:54:55 +0900 Subject: [PATCH 55/73] =?UTF-8?q?Step=201=20=EA=B9=80=EC=9E=AC=ED=98=95=20?= =?UTF-8?q?(#124)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 새로 구현한 기능 및 주요 변경점 # 버그 해결 💊 해결한 버그 # 리팩토링 🛠 리팩토링 내역 # 스크린샷 🖼 변경된 부분에 대한 스크린샷 # 비고 ✏ 리뷰어에게 전하는 말 등
    사용하지 않은 항목은 모두 지워주세요. --------- Co-authored-by: Martinel2 --- ...E-\352\271\200\354\236\254\355\230\225.md" | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 "git-basics/22nd/README-\352\271\200\354\236\254\355\230\225.md" diff --git "a/git-basics/22nd/README-\352\271\200\354\236\254\355\230\225.md" "b/git-basics/22nd/README-\352\271\200\354\236\254\355\230\225.md" new file mode 100644 index 0000000..c841642 --- /dev/null +++ "b/git-basics/22nd/README-\352\271\200\354\236\254\355\230\225.md" @@ -0,0 +1,140 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. + +>* git은 local storage에서 동작 +> * 다른 개발자와 작업물을 공유하는 것은 어렵다. +>* github는 웹 상의 remote stroage에 작업물을 저장 +> * 다른 개발자와 작업물을 공유하기 편해진다. + +[참고자료](https://yeongjaekong.tistory.com/4) + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. + +>* Working Directory: 현재 작업을 하고 있는 디렉토리 +> * 이 디렉토리 안 모든 파일은 tracked(프로젝트 디렉토리에 존재하는 경우)/untracked(이 프로젝트 디렉토리에 없는 경우)로 나뉨 +> * tracked는 또 수정/커밋 유무에 따라 상태가 변화 +>* Git Add: working directory의 변경 사항을 staging area에 추가(add)하는 것 +> * 절대/상대 경로를 사용하여 파일,디렉토리를 추가할 수 있다. +>* staging area: git add를 통해 추가된 파일/디렉토리의 영역 +>* Git Commit: git add를 통해 staging area로 올린 작업물들을 commit하여 local repository에 변경사항을 반영 +>* local repository: git commit을 통해 변경이 확정되면 변경사항을 반영하고 버전을 매긴다. +>* Git push: git commit을 통해 변경사항을 반영한 작업물들을 remote storage에 저장되어있는 작업물들도 변경사항이 반영되도록 하는 작업 +>* Git pull: 다른 개발자가 github의 remote storage에 변경사항을 반영하였고 나의 local storage에는 변경사항이 반영되지 않은 경우, git pull을 사용하여 나의 local storage를 최신 버전으로 업데이트가 가능 + +[참고자료1](https://iseunghan.tistory.com/322) +[참고자료2](https://anerim.tistory.com/203) + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + +>* git의 HEAD와 branch는 포인터 +>* HEAD는 branch를 통해 직접적으로 commit을 가리키고 있음 +> * commit을 할 때마다 가장 최근 commit을 가리키러 HEAD가 가리키고 있는 branch가 이동한다. +>* branch를 새로 생성하면, 이 branch는 마찬가지로 HEAD가 가리키고 있는 commit을 가리킨다. + +[참고자료](https://charles098.tistory.com/24) + +### branch관련 명령어 +``` +// Branch 생성 +$ git branch <새로운_브랜치_이름> + +// Branch 삭제 +$ git branch -d <삭제할_브랜치_이름> + +// Branch 이동, HEAD가 이동할 branch를 가리킨다. +$ git checkout <이동할_브랜치_이름> + +// 새로운 branch 생성 후 이동 +$ git checkout -b <새로운_브랜치_이름> +``` + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +> * git init: local에 git이 관리하는 빈 저장소를 새로 만드는 명렁어 +> * 새로운 프로젝트를 시작하기 전에 이 명령어를 사용하면 git이 해당 디렉토리를 관리해준다. +> * git clone: github의 remote repository를 그대로 복제하여 local에 해당 프로젝트 디렉토리를 만드는 방식이다. + +>* origin: remote repository의 주소를 키워드로 만들어서 대신 사용하는 것 +> * remote repository의 주소를 일일이 기억하고 입력하는 것이 불편하기 때문 + +``` +// 새로운 origin 설정 +$ git remote add origin 'remote repositroy 주소' +``` + +[참고자료](https://velog.io/@yejine2/git-%EC%A0%80%EC%9E%A5%EC%86%8C-%EC%83%9D%EC%84%B1-init-clone-%EB%B0%A9%EB%B2%95) + + + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. + +> * git reset은 soft,mixed,hard가 존재 +>* git reset --soft : 되돌아갈 commit의 hash값을 적으면 HEAD가 가리키는 branch가 가리키는 commit이 사용자가 되돌아가려고 하는 commit을 가리킴 (commit 취소) +>* git reset --mixed : soft 작업에서 staging area까지 비우는 작업을 수행 (commit 취소, add 취소) +>* git reset -- hard : mixed작업에서 이번엔 working directory에서 변경했던 데이터까지 되돌림 +> * 로컬에 저장된 데이터까지 롤백 +> * commit을 한 적이 없는 변경사항은 모두 덮어써져 복구가 되지 않음에 주의. + +[참고자료](https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0) + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. + +> * pull request(pr): branch를 새로 생성하고 checkout을 통해 HEAD가 가리키는 branch를 바꾼 후 수정한 작업물을 push하는 경우에 가능 +> * pr을 생성하게되면 main branch와 변경사항을 비교할 수 있으며, 변경을 확정하고 싶으면 merge, 아니라면 pr을 종료시킬 수 있다. + +> * Fast-forward: 기준 branch에는 신규 commit이 없고 새로운 branch에만 commit이 존재하는 경우, 새로운 branch를 그냥 main branch로 보고 병합해버리는 방식 +> * 3-way merge: 두 branch가 신규 commit이 1회 이상 있는 경우 merge를 진행하는 경우에 발생. 두 branch의 코드를 합쳐서 새로운 commit 생성하여 merge + + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. + +> * rebase: branch의 시작점을 다른 commit으로 옮겨주는 것 +> * 앞서 살펴본 merge방식을 branch의 시작점을 바꿈으로써 개발자가 제어 가능 + + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. + +> * git stash: 수정한 파일, add한 파일들을 스택에 저장해두는 명령어 +> * 하던 작업을 멈추고 다른 branch로 이동이 필요한 경우 stash를 이용하여 하던거 까지 저장 가능 + + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- 브랜치관리전략에 대표적으로 Github Flow, Git Flow가 있습니다. 두 방식에서는 리포지토리를 어떻게 관리할까요? +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From b142f712d7e6d7552ebece118648fb6767ec0abd Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Sat, 22 Mar 2025 15:56:46 +0900 Subject: [PATCH 56/73] =?UTF-8?q?Step=201=20=EA=B9=80=EC=A7=80=EB=AF=BC=20?= =?UTF-8?q?(#125)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 새로 구현한 기능 및 주요 변경점 # 버그 해결 💊 해결한 버그 # 리팩토링 🛠 리팩토링 내역 # 스크린샷 🖼 변경된 부분에 대한 스크린샷 # 비고 ✏ 리뷰어에게 전하는 말 등
    사용하지 않은 항목은 모두 지워주세요. --------- Co-authored-by: Kim jimin --- ...E-\352\271\200\354\247\200\353\257\274.md" | 183 ++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 "git-basics/22nd/README-\352\271\200\354\247\200\353\257\274.md" diff --git "a/git-basics/22nd/README-\352\271\200\354\247\200\353\257\274.md" "b/git-basics/22nd/README-\352\271\200\354\247\200\353\257\274.md" new file mode 100644 index 0000000..34656fe --- /dev/null +++ "b/git-basics/22nd/README-\352\271\200\354\247\200\353\257\274.md" @@ -0,0 +1,183 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) + +Git은 버전관리 소프트웨어이다. 로컬 저장소의 모든 변겅사항을 기록하여 파일의 버전 관리를 한다. + +반면 Github는 Git 을 사용하는 프로젝트를 지원하는 웹 호스팅 서비스로, Git 은 로컬 저장소에서만 작동하기 때문에 다른 개발자와 작업을 공유하고 협업하기 어렵지만 Github를 사용해 로컬 저장소의 코드를 원격 저장소에 업로드 하고 공유하며 협업할 수 있다. + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. + +- **Working Directory** + + working directory 는 작업폴더로, 데이터를 불러오거나 외부로 저장하는 작업을 수행하는 기본 폴더이다. 실제 작업파일이 있는 곳이다. + +- **Staging Area** + + 스테이징 영역은 데이터가 변환되기 전에 윈시/처리되지 않은 데이터가 있는 영역을 말한다. + +- **Local Repo** + + 내 컴퓨터에 저장된 Git 저장소. 변경사항을 내 컴퓨터에서만 관리 가능하다. + +- **Remote Repo** + + GitHub 등의 클라우드 서버에 있는 Git 저장소. + 여러명이 협업할 수 있도록 온라인에 저장된다. + +- **Git Add** + + git add 는 작업 디렉토리 상의 변경 내용을 스테이징 영역에 추가하기 위해 사용하는 명령어이다. 커밋을 하기 전에 어떤 변경사항을 저장할지 선택한다. + git add 를 하면 변경된 파일이 스테이징 영역으로 올라간다(커밋 대기 상태) + +- **Git Commit** + + git commit 은 파일 및 폴더의 추가/변경 사항을 로컬 저장소에 기록하는 것이다. + 파일(폴더)의 버전에 변화가 발생했다는 것이고, 특정 작업이 완결된 상태로 바뀌었다는 것을 의미한다. 변경 내역에 대한 설명으로 커밋 메세지도 포함한다. + +- **Git Push** + + 로컬 저장소에 저장된 커밋한 작업 내용을 원격 저장소에 업로드 하기 위한 명령어. + + + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. + +- **Branch** + + Git 에서 독립적으로 개발을 진행할 수 있도록 만들어주는 분기 역할을 함. main 과 분리된 상태에서 새로운 작업을 할 수 있는 작업 공간이다. 커밋을 가리키는 포인터 역할을 한다. + 생성 및 삭제가 가능하다. + + 생성 : `git branch <브랜치이름>` + + 삭제 : `git branch -d <브랜치이름>` + +- **Head** + + 모든 브랜치에는 head 값이 존재하는데, 해당 브랜치의 마지막 커밋의 상태를 가리킨다. + (특정 브랜치의 마지막 커밋에 대한 포인터) + + +git checkout 명령어는 브랜치 간 전환 또는 현재 작업중인 파일들을 복원할 때 사용한다. +- 브랜치 이동 : `git checkout <브랜치이름>` +- 특정 커밋으로 이동 : `git checkout ` +- 작업 디렉토리에서 변경 내용 되돌리기 : `git checkout -- ` + + + +## clone, init, origin +Gir 저장소를 만드는 방법은 크게 두 가지가 존재한다. + +1. 아직 버전 관리를 하지 않은 로컬 디렉토리 하나를 선택해서 Git 저장소를 적용함. + -프로젝트의 디렉토리로 이동한 후 git bash here 기능을 이용해 아래의 명령을 실행 + `git init` + +2. 기존의 저장소를 Clone 함. + -다른 프로젝트에 참여하거나 Git 저장소를 복사하고 싶을 때 git clone 명령어를 사용해서 프로젝트 히스토리를 전부 받아온다. + `git clone ` + + +- **Origin** + + origin 은 대표적으로 사용되는 원격 저장소의 별칭을 의미함. + + 1. 별칭 등록 + `git remote add {별칭} {원격지 주소}` + + 2. 별칭 변경 + `git remote rename {변경전} {변경후}` + + 3. 별칭 삭제 + `git remote rm {별칭}` + + + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +git reset 은 HEAD 의 위치를 현재의 커밋에서 과거의 커밋으로, 미래의 커밋으로 이동시킬 수 있는 커맨드이다. + +reset에는 3가지 타입이 있습니다. + +1. soft + soft 옵션을 쓰면 HEAD가 특정 커밋을 새롭게 가리키게 된다. + 대신 현재 작업중인 working directory 와 staging area 는 아무런 영향을 받지 않음 + +2. mixed + 역시 HEAD 가 특정 커밋을 가리키게 되고 staging area도 해당 커밋의 모습과 동일하게 변함. working directory는 아무런 영향을 받지 않음. + +3. hard + HEAD 가 특정 커밋을 가리키게 되고, + staging area 와 현재 작업중인 working directoty 모두 해당 커밋의 모습과 동일하게 변함. + + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) + +- **Pull Request** + + pull request 란 다른 사용자가 작성한 저장소에서 변경사항을 병합(merge) 하기 위한 요청을 의미한다. + +- **Merge** + + Merge 는 합병이라는 뜻으로 서로다른 브랜치를 병합해서 작업한 내용을 합치는 것을 의미한다. + + 1. Fast-Forward Merge + 현재 브랜치의 HEAD가 대상 브랜치의 HEAD 까지로 옮기는 merge + `git switch <현재 브랜치>` + `git merge <대상 브랜치>` + + 중간에 변경이 없을 때만 동작함. + + 2. 3-Way Merge + 대부분의 협업에서 발생하게 되는 merge 방식 + 두 브랜치가 동일 선상이 아닐때 발생함 + + 두 브랜치가 분할되는 기점에서 공통조상을 찾고 두 브랜치 커밋과 공통조상의 커밋, 총 3개의 커밋이 관여하게 됨. + + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +### Git rebase란? +`git rebase` 는 두개의 공통 base 를 가진 branch에서 한 branch 의 base 를 다른 branch의 최신 커밋으로 branch의 base를 옮기는 작업이다. + +**장점** +1. 공유 branch의 최신 변경사항을 즉각 반영할 수 있다. +2. rebase 는 커밋 이력을 남기지 않으므로 commit history 가 깔끔해진다. + + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +stash를 이용해 작업중에 갑작스럽게 다른 작업을 진행해야 할 때, 작업중인 사항을 잠시 치워둘 수 있다. + +코드를 다른곳에 보관한 후에 내가 원하는 branch 에 적용할 수 있다. + +- git stash 로 변경사항들을 stash 공간으로 이동. + `git stach` +- stash 한 변경사항 다시 적용 및 삭제 + `git stach pop` +- stash 한 마지막 항목 적용(삭제) + `git stash apply(drop)` +- 새 브랜치 생성하여 pop + `git stash branch <브랜치명>` + + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- 브랜치관리전략에 대표적으로 Github Flow, Git Flow가 있습니다. 두 방식에서는 리포지토리를 어떻게 관리할까요? +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From c085de691eed9774fba7488a16e4d0f838673189 Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Sat, 22 Mar 2025 15:57:43 +0900 Subject: [PATCH 57/73] =?UTF-8?q?Step=201=20=EA=B9=80=ED=83=9C=EB=9E=80=20?= =?UTF-8?q?(#126)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 새로 구현한 기능 및 주요 변경점 # 버그 해결 💊 해결한 버그 # 리팩토링 🛠 리팩토링 내역 # 스크린샷 🖼 변경된 부분에 대한 스크린샷 # 비고 ✏ 리뷰어에게 전하는 말 등
    사용하지 않은 항목은 모두 지워주세요. --------- Co-authored-by: latteeea Co-authored-by: TaeRan Kim <151916806+latteeea@users.noreply.github.com> --- git-basics/22nd/README-taeran.md | 116 +++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 git-basics/22nd/README-taeran.md diff --git a/git-basics/22nd/README-taeran.md b/git-basics/22nd/README-taeran.md new file mode 100644 index 0000000..675cb07 --- /dev/null +++ b/git-basics/22nd/README-taeran.md @@ -0,0 +1,116 @@ +# Git 기초 +Git 알아보기_김태란(개발) + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +Git : **local** 에서의 모든 변경사항을 기록하는(버전관리를 하는) **소프트웨어** +Github : 클라우스 서버를 통해 **local의 코드 -> remote** 로 업로드하고 공유할 수 있도록 하는 **서비스** + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +Working Directory : 내가 현재 작업하고 있는 디렉토리 (위치) + +**Git Add** : add를 해줘야만 **commit의 대상**으로 들어간다 (== Staging Area에 올라감) +ㄴ Git이 해당 파일의 버전관리를 시작함 +ㄴ git restore --staged ${filename} 을 해주면 Staging Area에서 제거 가능 +ㄴ add를 사용하면 어느 부분을 커밋할지 구체적으로 조정이 가능하다 + +**Git Commit** : commit을 해줘야만 **git에 저장**을 할 수 있다 (== Local Repo에 올라감) +ㄴ commit은 git log가 남음. add 한 것들에 스탬프를 찍는 과정. + +**Git Push** : 내가 commit 한 것들을 원격 저장소에 저장함 (== Remote Repo에 올라감) +ㄴ 하기 전에 원격 저장소와 연결이 되어 있어야 함 + +**Git Pull** : remote -> local 로 코드를 가져옴 & 더 최신 코드라면 merge 까지 진행 + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +*"HEAD와 branch는 포인터이다"* + +HEAD : 레포에서의 현재 사용자 위치(checkout을 하면 HEAD가 바뀜) +branch : 일종의 타임라인으로, 각 branch는 독립된 context를 가진다. (-> 다른 브랜치에 영향 x) + +git branch {브랜치명} : 새로운 브랜치 생성 가능(HEAD가 이를 가리키게 됨) +git checkout {브랜치명} : HEAD를 움직여서 다른 브랜치로 전환 가능 + + + +## clone, init, origin +#### git clone과 git init의 차이점, 이용방법 +git init : .git이라는 하위 폴더를 생성해 해당 폴더를 git으로 관리할 수 있게 해줌. +git clone : remote로부터 프로젝트를 local에 복제함. +ㄴ git clone {깃허브 코드 주소}.git + +#### origin이란 키워드는 무엇인지, 어떻게 설정하는지 +origin : 현재 git에서 작업하는 local과 연결된 **remote의 주소**를 가리킴. +git remote : origin 생성 +git remote remove origin : origin 삭제 + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +#### reset의 3가지 타입 +1. git reset --soft +ㄴ HEAD가 특정 커밋을 새롭게 가리킴 (working directory OR staging area 영향 x) +2. git reset --mixed +ㄴ HEAD가 특정 커밋을 새롭게 가리킴 (staging area도 해당 커밋의 모습과 동일하게 변함) +3. git reset --hard (주의 요망) +ㄴ HEAD가 특정 커밋을 새롭게 가리킴 (working directory & staging area 모두 변함) + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +#### Pull Request +협업을 할 때, push를 한 뒤에 변경사항을 기록하고 pull request를 요청한다. + +#### Merge +팀원의 PR(Pull Request) 내용을 확인한 후, 다른 코드에 영향을 미치지 않고 remote 저장소에 반영해도 된다면, 그때 merge를 진행한다. (-> 원본 저장소에 바뀐 내용이 반영되어 합쳐진다) + +##### Merge_Fast-Forward +현재 브랜치의 HEAD가 대상 브랜치의 HEAD로 옮겨지는 merge +```git switch [현재 브랜치]``` +```git merge [대상 브랜치]``` +But, 중간에 다른 커밋이 있다면 Conflict 발생 -> 동작 x + +##### Merge_3-way Merge +merge 할 때 두 브랜치가 동일 선상에 없을 때, **공통 조상**으로 merge 진행 +```git checkout master``` +```git merge {브랜치명}``` +공통조상 (Base)를 기준으로, merge의 결과로 채택한 후 +두 브랜치가 다른 변화를 발생시켰다면 이를 충돌로 판단하고 해결해야 merge 가능 + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase = base를 새롭게 설정한다 +```git checkout experiment``` +```git rebase main``` +아예 다른 브랜치로 이동해 main(master)를 base 삼아 rebase 하게 됨. +최근 두 브랜치의 차이를 Patch 라는 곳에 임시 저장해 둔 후에, +base가 되는 master에 Patch가 적용된다. +```git checkout main``` +```git merge experiment``` +이후, main브랜치를 fast-forward merge 한다. + +Fast-Forward merge를 하기 때문에 -> **깔끔한 커밋 히스토리를 유지**할 수 있다는 게 장점!! +But, 깃히스토리를 조작하고 강제 push가 동반되기 때문에 위험함!!! + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash : 작업중인 것을 잠시 치워두다(->스택에) +```git stash``` : 현재 적용된 commit 이후로 변경된 모든 사항들이 stash 공간으로 이동 +```git stash apply``` : 했던 작업 다시 가져오기 +```git stash drop``` : 스택에 남아있는 stash 제거하기 +```git stash list``` : stash 목록 보기 + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- 브랜치관리전략에 대표적으로 Github Flow, Git Flow가 있습니다. 두 방식에서는 리포지토리를 어떻게 관리할까요? +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From 86708f345380338566095886b0fe71e5ca2eb0f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=90=EC=A0=95=ED=9B=88?= <129269335+SonJH7@users.noreply.github.com> Date: Sat, 22 Mar 2025 15:58:29 +0900 Subject: [PATCH 58/73] =?UTF-8?q?Step=201=20=EC=86=90=EC=A0=95=ED=9B=88=20?= =?UTF-8?q?(#120)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 새로 구현한 기능 및 주요 변경점 # 버그 해결 💊 해결한 버그 # 리팩토링 🛠 리팩토링 내역 # 스크린샷 🖼 변경된 부분에 대한 스크린샷 # 비고 ✏ 리뷰어에게 전하는 말 등
    사용하지 않은 항목은 모두 지워주세요. --- git-basics/22nd/README-SONJEONGHUN.md | 500 ++++++++++++++++++++++++++ 1 file changed, 500 insertions(+) create mode 100644 git-basics/22nd/README-SONJEONGHUN.md diff --git a/git-basics/22nd/README-SONJEONGHUN.md b/git-basics/22nd/README-SONJEONGHUN.md new file mode 100644 index 0000000..e64e8b4 --- /dev/null +++ b/git-basics/22nd/README-SONJEONGHUN.md @@ -0,0 +1,500 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. +Git (Local) +버전 관리 시스템: Git은 소스 코드의 변경 내역을 추적하고 관리할 수 있는 분산 버전 관리 시스템입니다. + +로컬 저장소: 개발자가 자신의 컴퓨터에 Git을 설치하고, 프로젝트의 버전 기록을 로컬 저장소에 저장합니다. 이로 인해 인터넷 연결 없이도 버전 관리 작업(커밋, 브랜치 생성 등)을 수행할 수 있습니다. + +GitHub (Remote) +원격 저장소 서비스: GitHub는 Git을 기반으로 하는 클라우드 기반 플랫폼입니다. + +협업 및 공유: 로컬에서 관리하는 Git 저장소를 원격 저장소로 업로드(push)하여 여러 개발자와 협업할 수 있으며, 다른 사람의 프로젝트를 복제(clone)하거나 기여(pull request)할 수 있습니다. + +추가 기능: 이슈 추적, 코드 리뷰, 위키, CI/CD 등 협업에 유용한 다양한 기능을 제공합니다. + +결론 +Local vs Remote: Git은 로컬에서의 버전 관리 도구이며, GitHub는 이러한 Git 저장소를 원격으로 관리, 공유 및 협업하기 위한 플랫폼입니다. 따라서 둘은 동일한 것이 아니라, Git이 로컬 작업에 중점을 둔다면 GitHub는 원격 협업 및 저장소 관리에 초점을 맞춘 서비스입니다. + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) + +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. + +Working Directory +정의: 프로젝트의 실제 파일들이 위치한 폴더입니다. + +역할: 개발자가 코드를 작성하고 수정하는 작업 공간입니다. + +특징: 파일을 편집하면 변경 사항이 바로 Working Directory에 반영됩니다. + +Git Add +정의: 변경된 파일을 스테이징 영역(Staging Area)에 추가하는 명령어입니다. + +역할: 작업 디렉토리의 변경 사항 중에서 어떤 파일을 커밋에 포함할지 선택합니다. + +특징: git add 파일명 명령어를 사용하여 특정 파일 또는 git add .로 전체 변경 사항을 스테이징 할 수 있습니다. + +Git Commit +정의: 스테이징 영역에 있는 파일의 변경 사항을 로컬 저장소에 저장하는 명령어입니다. + +역할: 현재까지의 작업 상태를 하나의 스냅샷으로 기록하며, 커밋 메시지를 통해 변경 내역을 설명합니다. + +특징: 커밋은 변경 사항의 기록으로서, 프로젝트의 이력을 관리하고 필요 시 이전 상태로 복원할 수 있는 기반이 됩니다. + +Git Push +정의: 로컬 저장소에 저장된 커밋을 원격 저장소(예: GitHub)로 전송하는 명령어입니다. + +역할: 여러 개발자와 협업할 때 로컬 변경 사항을 공유하고, 원격 저장소를 최신 상태로 유지합니다. + +특징: git push origin 브랜치명 형식으로 사용하며, 원격 저장소와 동기화를 통해 프로젝트의 버전 관리가 이루어집니다. + +이렇게 Git은 Working Directory에서 변경된 파일을 git add를 통해 스테이징하고, git commit으로 로컬 저장소에 기록한 후, git push를 통해 원격 저장소에 반영하는 과정을 통해 버전 관리와 협업이 이루어집니다. + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + +Git은 commit과 branch를 기본 단위로 동작하며, 이 두 요소를 중심으로 다양한 명령어를 통해 버전 관리가 이루어집니다. + +Commit +정의: 프로젝트의 특정 시점의 상태(스냅샷)를 기록한 단위입니다. + +특징: 각 commit은 고유한 해시값을 가지며, 변경 사항과 커밋 메시지를 포함합니다. + +역할: 프로젝트 이력 관리 및 필요 시 이전 상태로 복원할 수 있게 해줍니다. + +Branch +정의: commit들을 가리키는 포인터로, 개발의 흐름(라인)을 의미합니다. + +역할: 여러 기능 개발이나 버그 수정을 동시에 진행할 때, 독립적인 작업 공간을 제공하여 주 작업(main/master branch)에 영향을 주지 않도록 합니다. + +생성: git branch 브랜치명으로 새로운 branch를 생성할 수 있습니다. + +삭제: 작업이 끝난 branch는 git branch -d 브랜치명 (안전 삭제) 또는 git branch -D 브랜치명 (강제 삭제) 명령어로 제거할 수 있습니다. + +HEAD +정의: 현재 작업 중인 branch 또는 commit을 가리키는 포인터입니다. + +역할: 현재 체크아웃된 상태를 나타내며, HEAD가 가리키는 branch의 최신 commit이 작업의 기준점이 됩니다. + +특징: HEAD가 branch를 가리키는 경우, 해당 branch의 최신 commit에 위치하게 되고, 특정 commit을 직접 가리키면 'detached HEAD' 상태가 됩니다. + +Git Checkout +역할: + +Branch 전환: 다른 branch로 이동할 때 사용합니다. 예를 들어, git checkout 브랜치명 명령어를 통해 다른 branch로 전환하면, HEAD가 해당 branch를 가리키게 됩니다. + +새로운 Branch 생성 및 이동: git checkout -b 새브랜치명 명령어로 branch를 생성하고 즉시 전환할 수 있습니다. + +특정 Commit 체크아웃: 특정 commit의 상태로 작업 디렉토리를 전환할 수 있으나, 이 경우 detached HEAD 상태가 되어 커밋을 직접 추가하면 branch와 연동되지 않습니다. + +주의사항: + +Detached HEAD 상태에서는 작업 후 별도의 branch를 생성하지 않으면, 이후 변경 내용이 반영되지 않을 수 있으니 주의해야 합니다. + +최근 Git 버전에서는 branch 전환에 특화된 git switch 명령어도 함께 제공되므로 상황에 맞게 활용할 수 있습니다. + +Branch 관리 커맨드 요약 +Branch 생성: + +git branch 새브랜치명 + +또는 git checkout -b 새브랜치명 (생성과 동시에 전환) + +Branch 목록 확인: git branch + +Branch 전환: git checkout 브랜치명 또는 git switch 브랜치명 + +Branch 삭제: + +안전 삭제: git branch -d 브랜치명 + +강제 삭제: git branch -D 브랜치명 + +결론 +Git에서 commit은 개별 작업의 단위를 기록하며, branch는 이러한 commit들의 흐름을 관리하는 역할을 합니다. HEAD는 현재 활성화된 branch나 commit을 나타내며, git checkout 명령어를 통해 branch 간 전환이나 특정 commit 상태로의 변경이 이루어집니다. 이들 명령어와 개념을 활용하면 여러 개발 작업을 독립적으로 진행하면서도, 전체 프로젝트의 이력을 체계적으로 관리할 수 있습니다. + + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +Git 리포지토리를 로컬에 생성하는 방법에는 크게 두 가지가 있습니다. 아래에서 **git init**과 **git clone**의 차이점 및 사용 방법, 그리고 **origin** 키워드에 대해 설명합니다. + +--- + +## git init vs git clone + +### git init +- **목적**: 현재 디렉토리를 새로운 Git 리포지토리로 초기화합니다. +- **사용 상황**: 새로운 프로젝트를 시작할 때 또는 기존 폴더를 버전 관리 대상으로 만들고 싶을 때 사용합니다. +- **동작 방식**: + - 명령어를 실행하면 해당 디렉토리에 `.git` 폴더가 생성되어, Git이 버전 관리를 위한 모든 메타데이터를 저장하게 됩니다. +- **사용 방법**: + ```bash + git init + ``` +- **추가 설정**: + - 초기화 후, 원격 저장소가 필요한 경우 `git remote add origin <저장소 URL>` 명령어로 원격 저장소를 설정할 수 있습니다. + +--- + +### git clone +- **목적**: 기존의 원격 또는 로컬 Git 리포지토리를 복제하여 새로운 로컬 리포지토리를 생성합니다. +- **사용 상황**: 이미 존재하는 프로젝트를 복사하여 작업을 시작할 때 사용합니다. +- **동작 방식**: + - 지정한 URL의 리포지토리를 그대로 복제하며, 커밋 내역과 브랜치 정보 등 모든 Git 기록을 함께 가져옵니다. + - 복제한 후, 기본 원격 저장소 이름으로 `origin`이 자동으로 설정됩니다. +- **사용 방법**: + ```bash + git clone <리포지토리 URL> + ``` +- **예시**: + ```bash + git clone https://github.com/username/project.git + ``` + +--- + +## origin이란 키워드와 설정 방법 + +- **origin의 의미**: + - `origin`은 Git에서 기본 원격 저장소의 별칭(alias)으로 사용됩니다. + - 클론 시, 자동으로 복제된 리포지토리의 원격 저장소가 `origin`으로 설정되며, 이후 `git push`, `git pull` 등의 명령어에서 기본 원격 저장소로 참조됩니다. + +- **설정 방법**: + - **자동 설정**: + - `git clone` 명령어를 사용하면, 원격 저장소 URL이 자동으로 `origin`이라는 이름으로 설정됩니다. + - **수동 설정**: + - 새로 생성한 로컬 리포지토리에서 원격 저장소를 추가할 때, 다음 명령어를 사용하여 `origin`이라는 이름을 지정할 수 있습니다. + ```bash + git remote add origin <원격 저장소 URL> + ``` + - **원격 저장소 확인**: + - 현재 설정된 원격 저장소 목록은 아래 명령어로 확인할 수 있습니다. + ```bash + git remote -v + ``` + +--- + +## 요약 + +- **git init**: 새로운 리포지토리를 로컬에서 시작할 때 사용합니다. 이후 필요에 따라 원격 저장소(`origin`)를 추가할 수 있습니다. +- **git clone**: 기존 리포지토리를 복제할 때 사용하며, 클론 시 원격 저장소가 자동으로 `origin`으로 설정됩니다. +- **origin**: 기본 원격 저장소의 별칭으로, `git clone` 시 자동 설정되거나 `git remote add origin `로 수동 설정할 수 있습니다. + +이와 같은 방식으로 로컬에서 Git 리포지토리를 생성하고 관리할 수 있습니다. + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. + +1. --soft +동작 방식: + +HEAD 포인터만 지정한 커밋으로 이동합니다. + +스테이징 영역(index)과 작업 디렉토리(working directory)는 그대로 유지됩니다. + +사용 예: git reset --soft <커밋 해시> + +마지막 커밋을 취소하고, 변경 사항을 그대로 스테이징 영역에 남겨두고 싶을 때 사용합니다. + +2. --mixed (기본 옵션) +동작 방식: + +HEAD 포인터를 지정한 커밋으로 이동합니다. + +스테이징 영역을 해당 커밋 상태로 재설정하지만, 작업 디렉토리의 파일은 그대로 남깁니다. + +특징: + +변경 사항은 작업 디렉토리에 남아 있으므로 다시 스테이징하거나 수정할 수 있습니다. + +별도로 옵션을 주지 않고 git reset <커밋 해시>로 사용하면 기본적으로 --mixed 모드가 적용됩니다. + +git reset --mixed <커밋 해시> + +3. --hard +동작 방식: + +HEAD 포인터, 스테이징 영역, 작업 디렉토리 모두를 지정한 커밋 상태로 되돌립니다. + +특징: + +변경 사항이 모두 삭제되므로, 작업 중인 내용이 모두 사라질 수 있습니다. + +되돌릴 수 없는 파괴적인(reset) 작업이므로 주의해서 사용해야 합니다. + +이와 같이, --soft는 커밋만 취소하고 스테이징 상태를 유지하며, --mixed는 스테이징 영역까지 초기화하지만 작업 내용은 보존하고, --hard는 모든 변경 사항을 완전히 제거하는 방식으로 작동합니다. + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. + +Pull Request (PR) +개념: + +Pull Request는 개발자가 특정 기능이나 버그 수정 작업을 완료한 후, 해당 변경 사항을 메인 또는 다른 기준 브랜치에 병합(merge)해달라고 요청하는 절차입니다. + +주로 GitHub, GitLab, Bitbucket 등의 원격 저장소 서비스에서 사용되며, 팀원 간의 코드 리뷰, 논의, 테스트를 거쳐 코드 품질을 보증하는 데 중요한 역할을 합니다. + +작업 과정: + +분기(Branch) 생성: 새로운 기능 또는 버그 수정을 위한 독립적인 브랜치에서 작업을 진행합니다. + +커밋: 작업 내역을 여러 커밋으로 기록합니다. + +PR 생성: 변경 사항이 반영된 브랜치를 기준 브랜치(예: main 또는 master)로 병합해달라고 요청합니다. + +리뷰 및 승인: 다른 팀원들이 코드 리뷰를 진행하며, 수정 및 토론을 거친 후 최종 승인이 이루어집니다. + +Merge: 승인된 PR은 Merge되어 기준 브랜치에 변경 사항이 반영됩니다. + +Merge +Merge는 서로 다른 브랜치의 변경 사항을 하나로 합치는 작업입니다. Merge에는 주로 두 가지 타입이 있습니다. + +1. Fast-Forward Merge +상황: + +병합 대상 브랜치가 기준 브랜치의 직계 후손인 경우 발생합니다. + +기준 브랜치에 변경 사항이 없고, 병합 대상 브랜치의 변경 사항만 추가된 상황입니다. + +동작 원리: + +기준 브랜치 포인터를 단순히 병합 대상 브랜치의 최신 커밋으로 "앞으로 이동"시킵니다. + +별도의 merge commit 없이 단순하게 브랜치 포인터가 이동되므로 커밋 기록이 깔끔하게 유지됩니다. + +명령어 예시: +git checkout main +git merge feature-branch + +위 명령어에서 만약 main 브랜치가 feature-branch의 부모라면, Fast-Forward Merge가 적용됩니다. + +2. 3-Way Merge +상황: + +기준 브랜치와 병합 대상 브랜치 모두에 독자적인 변경 사항이 있을 때 발생합니다. + +두 브랜치가 서로 다른 방향으로 발전하여 공통 조상(commit)이 존재하는 경우입니다. + +동작 원리: + +Git은 세 개의 지점을 사용합니다: + +공통 조상 (Common Ancestor) + +기준 브랜치의 최신 커밋 + +병합 대상 브랜치의 최신 커밋 + +이 세 지점을 비교하여 두 브랜치의 변경 사항을 통합한 새로운 merge commit을 생성합니다. + +이 merge commit은 두 부모(commit)를 가지게 됩니다. + +명령어 예시: +git checkout main +git merge feature-branch + +기준 브랜치와 feature 브랜치가 모두 변경 사항을 포함하고 있다면, Git은 3-Way Merge를 수행하여 새로운 merge commit을 생성합니다. + +요약 +Pull Request는 코드 변경 사항을 기준 브랜치로 병합하기 전, 팀원들과 리뷰 및 토론을 진행하는 협업 절차입니다. + +Merge는 두 브랜치의 변경 사항을 하나로 합치는 작업이며, + +Fast-Forward Merge는 병합 대상 브랜치가 기준 브랜치의 직계 후손인 경우 단순히 포인터를 이동하는 방식으로, + +3-Way Merge는 서로 다른 변경 사항을 통합하기 위해 공통 조상과 두 브랜치의 최신 커밋을 비교하여 새로운 merge commit을 생성하는 방식입니다. + +이와 같이 PR과 Merge는 팀 프로젝트에서 코드의 변경 사항을 효과적으로 통합하고 관리하기 위한 핵심 절차로 활용됩니다. + + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. + +Rebase의 정의 +Rebase란? + +Rebase는 한 브랜치의 커밋들을 다른 브랜치 위에 순차적으로 재적용하는 과정입니다. + +기존의 커밋 기록을 새로운 기반(commit) 위에 "붙여" 이력을 재구성합니다. + +Rebase의 동작 원리 +작업 방식: + +예를 들어, feature 브랜치가 있고 이 브랜치에서 여러 커밋을 진행한 상황에서, 기준 브랜치(main)에 새로운 커밋들이 추가되었다고 가정합니다. + +Rebase를 사용하면 feature 브랜치의 커밋들이 main 브랜치의 최신 커밋 이후에 순서대로 재적용됩니다. + +결과: + +커밋 기록이 선형화되어, 복잡한 병합 기록 없이 깔끔한 이력이 만들어집니다. + +Rebase가 유용한 경우 +이력 정리 (Clean History): + +여러 기능 브랜치에서 작업한 커밋들이 산재해 있을 때, rebase를 통해 선형적인 이력을 유지하면 코드 리뷰나 버그 추적이 용이해집니다. + +업스트림 변경사항 반영: + +팀원들이 기준 브랜치(main, master 등)에 새로운 커밋을 추가한 경우, rebase를 사용하여 자신의 작업을 최신 기준 위에 올림으로써 충돌 가능성을 줄일 수 있습니다. + +피쳐 브랜치 업데이트: + +병합 전에 최신 기준 브랜치의 변경사항을 피쳐 브랜치에 반영할 때 사용합니다. 이렇게 하면 나중에 병합 시에 불필요한 merge commit 없이 변경 사항을 반영할 수 있습니다. + +주의사항 +공유된 브랜치에서의 Rebase: + +이미 다른 팀원과 공유된 브랜치에서 rebase를 수행하면, 커밋 해시가 변경되어 협업에 혼란을 줄 수 있으므로, 주로 개인 작업이나 공유되지 않은 브랜치에서 사용하는 것이 좋습니다. + +충돌 해결: + +Rebase 도중 충돌이 발생할 수 있으며, 이 경우 충돌을 해결한 후 rebase를 계속 진행해야 합니다. + +결론 +Rebase는 브랜치의 커밋 기록을 재구성하여 선형적이고 깔끔한 이력을 만들고, 최신 기준 브랜치의 변경사항을 반영하는 데 유용한 도구입니다. 단, 공유된 브랜치에서는 사용에 주의해야 하며, 충돌 해결 과정이 필요할 수 있습니다. + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. + +Git stash는 현재 작업 중인 미완성 변경 사항(수정된 파일, 추가된 파일 등)을 임시 저장해 두어, 워킹 디렉토리를 깨끗한 상태로 만들고 다른 브랜치로 전환하거나 긴급한 작업을 처리할 때 유용하게 활용됩니다. 아래에 git stash의 주요 활용 방법과 관련 명령어들을 정리했습니다. + +--- + +## 주요 명령어와 활용 방법 + +### 1. 변경 사항 임시 저장 +- **git stash / git stash push** + - 현재 작업 디렉토리와 스테이징 영역의 변경 사항을 임시 저장소에 저장합니다. + - 기본적으로 추적된(tracked) 파일의 변경 사항을 저장하며, 미추적(untracked) 파일까지 저장하려면 `-u` 옵션을 추가합니다. + - 예시: + ```bash + git stash + git stash push -u + git stash push -m "작업 중인 변경 사항 저장" + ``` + +--- + +### 2. 저장된 Stash 목록 확인 +- **git stash list** + - 저장된 stash들을 확인할 수 있습니다. + - 출력 예시: + ``` + stash@{0}: WIP on main: 1234567 작업 내용 메시지 + stash@{1}: WIP on main: 89abcd0 이전 작업 내용 + ``` + +--- + +### 3. Stash 적용 및 제거 +- **git stash apply** + - 지정한 stash(또는 기본으로 가장 최근 stash)를 현재 작업 디렉토리에 적용합니다. + - 적용 후에도 stash 목록에는 남아 있으므로, 필요에 따라 삭제할 수 있습니다. + - 예시: + ```bash + git stash apply stash@{0} + ``` + +- **git stash pop** + - 지정한 stash(또는 기본으로 가장 최근 stash)를 적용하면서, stash 목록에서 자동으로 제거합니다. + - 예시: + ```bash + git stash pop + ``` + +--- + +### 4. 특정 Stash 삭제 +- **git stash drop** + - 더 이상 필요 없는 특정 stash 항목을 삭제합니다. + - 예시: + ```bash + git stash drop stash@{1} + ``` + +- **git stash clear** + - 저장된 모든 stash 항목을 삭제합니다. + +--- + +## 사용 사례 + +- **브랜치 전환**: + 미완성 작업을 보류하고 다른 브랜치로 전환해야 할 때, + ```bash + git stash # 현재 변경 사항 저장 + git checkout 다른-브랜치 + # 긴급 작업 후 돌아와서... + git checkout 원래-브랜치 + git stash pop # 저장된 변경 사항 복원 + ``` + +- **긴급 수정**: + 작업 도중 버그 수정 등 긴급한 작업이 필요할 때, 현재 진행 중인 작업을 임시 저장한 후 수정 작업을 진행하고 나중에 다시 복원할 수 있습니다. + +- **작업 정리**: + 실험적인 코드나 아직 완성되지 않은 변경 사항을 커밋 전에 임시로 보관하여, 커밋 기록을 깔끔하게 관리할 수 있습니다. + +--- + +## 주의 사항 +- **충돌 가능성**: + stash를 적용할 때 변경 사항 간 충돌이 발생할 수 있으며, 이 경우 수동으로 해결해야 합니다. + +- **임시 저장소 관리**: + 오래된 stash는 혼란을 줄 수 있으므로, 주기적으로 `git stash list`로 상태를 확인하고 필요 없는 항목은 `git stash drop` 또는 `git stash clear`로 정리하는 것이 좋습니다. + +--- + +Git stash는 이러한 명령어와 활용 방법을 통해 작업 흐름을 유연하게 관리하고, 임시 작업 보류나 브랜치 전환 시 유용하게 사용할 수 있는 도구입니다. + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- 브랜치관리전략에 대표적으로 Github Flow, Git Flow가 있습니다. 두 방식에서는 리포지토리를 어떻게 관리할까요? + +GitHub Flow는 빠른 개발 및 배포를 위해 단순한 브랜치 전략을 사용하여, 항상 프로덕션 배포 가능한 main 브랜치와 임시 feature 브랜치 중심으로 리포지토리를 관리합니다. + +Git Flow는 정교한 버전 관리를 위해 master, develop, feature, release, hotfix 등 여러 브랜치를 활용하며, 각 브랜치의 역할을 명확히 분리하여 대규모 프로젝트나 정해진 릴리즈 사이클에 적합한 전략입니다. + +- `git rebase --interactive`란? + +git rebase --interactive (또는 git rebase -i)는 Git에서 커밋 이력을 인터랙티브하게 수정할 수 있는 기능입니다. 이를 통해 다음과 같은 작업을 수행할 수 있습니다: + +커밋 순서 변경: 커밋 목록의 순서를 재배치하여 이력을 정리할 수 있습니다. + +커밋 합치기 (Squash/Fixup): 여러 커밋을 하나로 합쳐 이력을 깔끔하게 만들 수 있습니다. + +커밋 메시지 수정: 특정 커밋의 메시지를 변경하거나 수정할 수 있습니다. + +커밋 삭제: 불필요한 커밋을 제거하여 이력을 간소화할 수 있습니다. + +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From 9d8e21701cfb161bae752abd96cd12aa9b335537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B3=91=EC=B0=AC?= <114278878+mark77234@users.noreply.github.com> Date: Sat, 22 Mar 2025 15:58:45 +0900 Subject: [PATCH 59/73] =?UTF-8?q?Step=201=20=EC=9D=B4=EB=B3=91=EC=B0=AC=20?= =?UTF-8?q?(#119)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 README 작성완료 --- git-basics/22nd/README-BYENGCHAN.md | 192 ++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 git-basics/22nd/README-BYENGCHAN.md diff --git a/git-basics/22nd/README-BYENGCHAN.md b/git-basics/22nd/README-BYENGCHAN.md new file mode 100644 index 0000000..fb3f969 --- /dev/null +++ b/git-basics/22nd/README-BYENGCHAN.md @@ -0,0 +1,192 @@ +## Git 과 Github의 차이 + +### Git + +- 버전 관리 소프트웨어 + +프로젝트의 수정한 코드가 동작하지 않을 때 버전을 롤백 할 수 있음 + +로컬 저장소의 모든 변경사항을 기록하여 파일의 버전관리 + +### Github + +- Git을 사용하는 프로젝트를 지원하는 **웹 호스팅 서비스**이다. + +Git은 **로컬(local)** 저장소에서 작동하여 다른 개발자와 작업을 공유하고 협업하기 어렵다. + +Github은 웹 상에서 클라우드 서버(**원격(remote)** 서버)를 통해 **로컬(local)** 저장소의 코드를 업로드하고 공유할 수 있다. + +다른 사람들과 작업물 공유 및 사용할 수 있다. + +## Git Workflow + + + +### Git 파일의 상태 + +Git은 파일을 크게 `Commited`, `Modified`, `Staged`의 세 가지 상태로 관리함 + +| 상태 | 설명 | +| -------- | --------------------------------------------------- | +| Commited | 데이터가 로컬 저장소에 안전하게 저장됨 | +| Modified | 수정한 파일을 아직 로컬 저장소에 커밋하지 않은 상태 | +| Staged | 수정한 파일을 곧 commit 할 것이라고 표시한 상태 | + +Git Directory(Repostiry)는 현재 작업하는 디렉터리에서 파일을 가져와 **Working Directory**를 만듭니다. + +1. Working Directory에서 파일을 수정 +2. 수정한 파일을 git add 로 Staging Area에 올림 +3. Staging Area에 있는 파일들을 git commit으로 Repository에 영구적으로 저장 + +### add / commit / push 의 차이 + +| 명령어 | 설명 | +| ------------ | ---------------------------------------------------------- | +| `git add` | 다음 변경을 기록할 때 까지 변경 내용을 모아놓기 위해 사용 | +| `git commit` | 변경 내용을 로컬 repositry에 기록(내 컴퓨터의 로컬 저장소) | +| `git push` | 변경 내용을 원격 repositry에 기록 (github) | + +`git add` 명령어를 통해 Staging Area로 변경 내용의 일부 혹은 전부를 이동시킨다. + +`git status` 명령어를 통해 현재 Working Directory와 Staging Area의 상태를 확인할 수 있다. + +Staging Area에 들어간 변경 내용을 `git commit`으로 로컬 저장소에 기록한다. + +`git push`로 원격 저장소에 업데이트 할 수 있다. + +## Branch, HEAD + +- Branch: 특정 커밋을 가리키는 포인터 +- HEAD: 현재 작업 중인 브랜치를 가리키는 포인터 + - 일반적으로 현재 체크아웃된 브랜치를 나타냄 + +```cmd +git branch <생성할 브랜치명> +``` + +- 브랜치 생성 +- 브랜치명에는 공백이 들어가면 안된다. + +- 브랜치 전환 + +```cmd +git switch <전환할 브랜치명> +Git 2.23 이후 추천방식 +git checkout <전환할 브랜치명> +``` + +- 브랜치 전환 + +```cmd +git checkout -c <브랜치명> +``` + +- 브랜치 생성 후 바로 이동 + +```cmd +git branch -d <브랜치명> +강제삭제 +git branch -D 브랜치이름 +``` + +- 병합이 완료된 브랜치 삭제 +- 병합이 완료되지 않으면 -D 사용 + +## clone, init, origin + +git 저장소 생성 방법에는 `git init` 방식과 `git clone` 방식이 있다 + +| 명령어 | `git clone` | `git init` | +| ----------- | ---------------------------------------------- | --------------------------- | +| 용도 | 기존 원격 저장소를 복제 | 새로운 로컬 레포지토리 생성 | +| 동작방식 | 원격 저장소의 전체 데이터를 가져와 로컬에 복사 | 빈 Git 저장소를 생성 | +| origin 설정 | 자동으로 origin 설정 | 원격 저장소 없음(수동) | + +### origin 이란? + +- 원격 저장소의 기본 이름 +- `git clone`을 사용하면 자동으로 origin 설정 +- `git init`을 사용하면 직접 origin 설정 + +## reset + +### 1. `--soft` + +- HEAD가 특정 커밋(과거 또는 미래)을 새롭게 가리킨다. +- 현재 작업 중인 working directory, stagin area는 영향 받지 않음 X + +### 2. `--mixed` + +- HEAD가 특정 커밋(과거 또는 미래)을 새롭게 가리킨다. +- staging area도 해당 커밋의 모습과 동일하게 변한다. +- working directory는 영향 받지 않는다 X + +### 3. `--hard` + +- HEAD가 특정 커밋(과거 또는 미래)을 새롭게 가리킨다. +- staging area , working directory 모두 해당 커밋의 모습과 동일하게 변함. + +## Pull Request, Merge + +### Merge란? + +- 두 개의 브랜치를 합치는 과정 + - `git merge <브랜치명>` + - Fast-Forward Merge & 3-Way Merge 두 가지 방식이 존재 + +1. 3-way merge + +- 브랜치마다 신규 커밋이 하나 이상 있는 경우, 새로운 커밋을 생성하며 합쳐줌 + + + +2. fast-forward merge + +- 메인브랜치에 신규 커밋이 없는 경우, 그냥 브랜치의 최신 커밋을 main브랜치에 하기로 한다. + + + +### PR이란? + +- 코드 변경 사항을 병합(Merge) 하기 전 검토하는 과정 +- 병합 전 코드 리뷰 받을 수 있음 + +## rebase + +- Git에서 한 브랜치에서 다른 브랜치로 합치는 방법은 Merge와 Rebase 두 가지 있다. +- 둘 다 실행 결과는 같지만 커밋 히스토리가 달라짐. +- merge는 히스토리가 지저분함, But Rebase는 잘 모르고 사용하지만 않으면 히스토리를 깔끔하게 관리할 수 있다. +- base를 새롭게 설정한다. + +## stash + +- 작업중인 사항을 잠시 치워두는 방법 +- 잠시 코드를 보관한 후, 내가 원하는 branch에 적용할 수 있다 + +### 사용하는 이유 + +- 변경사항을 커밋하기엔 아직 이른 경우 +- 다른 브랜치로 체크아웃할 때 변경사항을 유지하고 싶은 경우 +- 변경사항을 일시적으로 저장하고 싶은 경우 + +## Advanced + +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. + +- 브랜치관리전략에 대표적으로 Github Flow, Git Flow가 있습니다. 두 방식에서는 리포지토리를 어떻게 관리할까요? +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions + +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. + +``` + +``` From 4be70dccfab2a51393a40cd6e5a5704dfead6b5e Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Sat, 22 Mar 2025 15:59:23 +0900 Subject: [PATCH 60/73] =?UTF-8?q?step-1-=EA=B9=80=ED=83=9C=EC=9A=B0=20(#12?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 새로 구현한 기능 및 주요 변경점 # 버그 해결 💊 해결한 버그 # 리팩토링 🛠 리팩토링 내역 # 스크린샷 🖼 변경된 부분에 대한 스크린샷 # 비고 ✏ 리뷰어에게 전하는 말 등
    사용하지 않은 항목은 모두 지워주세요. Co-authored-by: minecoby --- ...E-\352\271\200\355\203\234\354\232\260.md" | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) rename git-basics/22nd/README.md => "git-basics/22nd/README-\352\271\200\355\203\234\354\232\260.md" (50%) diff --git a/git-basics/22nd/README.md "b/git-basics/22nd/README-\352\271\200\355\203\234\354\232\260.md" similarity index 50% rename from git-basics/22nd/README.md rename to "git-basics/22nd/README-\352\271\200\355\203\234\354\232\260.md" index 67ff3e7..d7fd027 100644 --- a/git-basics/22nd/README.md +++ "b/git-basics/22nd/README-\352\271\200\355\203\234\354\232\260.md" @@ -6,41 +6,71 @@ Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 git과 github는 같은 의미가 아닙니다. local, remote와 연관지어 적어주세요. +git - local에서 프로젝트의 작업 내용을 기록하고, 이전상태로 되돌리는 등의 역할을 한다. +github - git저장소를 온라인에서 관리하도록 하여 협업을 용이하게 해준다. 즉 remote 저장소 역할을 한다. + ## Git Workflow ![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) 위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. Git Merge, Git Fetch는 생략해도 됩니다. +- Working Directory : 현재 작업중인 파일이 있는 공간, 코드작성 및 수정을 하는 공간이다. +- Git Add : git add 파일 , 커밋을 하기전에 어떤 파일을 변경사항에 포함할지 정하는 단계이다. git add를 통해 staging Area에 파일을 올린다. +- Git Commit : git commit -m "커밋내용" , staging Area에 올라와있는 변경사항을 locale에서 확정하는 단계이다. +- Git Push : git push origin 브랜치 , locale 레포에 있는 변경사항을 remote 저장소로 올린다. + ## Branch, HEAD ![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) git이 동작하는 기본 단위는 commit과 branch입니다. branch와 HEAD, git checkout을 포함하여 작성 바랍니다. branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. +-branch를 생성하고 이동하는 명령어 : git checkout -b 새로운-브랜치명 +-HEAD : 현재 작업 중인 브랜치를 가리키는 포인터이다. ## clone, init, origin 리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. - git clone과 git init의 차이점, 이용방법 - origin이란 키워드는 무엇인지, 어떻게 설정하는지 +- git clone : 이미 존재하는 원격 리포지토리를 로컬에 복제할 때 사용한다. 원격 저장소를 복제하여 폴더가 자동으로 생성되고, 해당 폴더에서 바로 Git이 활성화된다. +- git init : 완전히 새로운 Git 리포지토리를 로컬에서 처음부터 생성할 때 사용한다. 원격 저장소는 따로 설정되지 않아, 필요할 시 수동으로 추가해야한다. + +- origin : 기본적으로 원격 저장소를 가리키는 별칭이다. git clone을 하면 자동으로 설정되지만, git init을 사용한 경우 수동으로 설정해야한다. (git remote add origin <원격_저장소_URL> 명령어 이용용) + + ## reset ![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) reset에는 3가지 타입이 있습니다. 각 타입에 대해 작성 바랍니다. +- git reset --soft : 최근 커밋을 취소하고, 변경 사항을 Staging Area로 유지한다. 즉 커밋만 되돌리고, git add 한 상태는 유지하는 것이다. +- git reset --mixed : 최근 커밋을 취소하고, 변경 사항을 Staging Area에서도 삭제한다. 즉, git add한 것도 취소되지만 파일 자체는 working directory에 남아있다. +- git reset --hard : 최근 커밋을 취소하고, Staging Area와 Working Directory의 변경 사항도 모두 삭제한다. 즉 수정내용이 전부 완전히 삭제된다. + ## Pull Request, Merge ![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) Pull Request와 Merge에 대한 내용을 적어주세요. 특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. +- Pull Request : 브랜치에서 작업한 변경 사항을 메인 브랜치에 Merge하기 전에 검토 요청을 보내는 과정이다. +- Merge + - 다른 브랜치에서 작업한 내용을 현재 브랜치로 합치는 과정이다. + - 브랜치가 한 방향으로만 진행된 경우, 새로운 Merge 커밋을 생성하지않고 단순히 최신 커밋으로 이동하는데, 이를 Fast-Forward Merge라고한다. 이는 충돌이 발생할 확률이 거의없지만 기록유지는 힘들다. + - 브랜치가 서로 다른 커밋을 포함하고 있을 때 하는 Merge 방식으로 3-Way Merge가 있다. 독립적으로 진행된 변경 사항을 통합해야 하므로 충돌이 일어날 수 있고, 작업기록을 명확히 남긴다. ## rebase ![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. +- Git Rebase + -브랜치를 다른 브랜치의 최신 상태로 변경하는 작업이다. + -git merge를 이용해 병합할때 ,병합커밋으로 인해 복잡할 수 있는 기록을 rebase를 이용하여 커밋을 깔끔하게 관리한다. ## stash ![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) git stash를 활용하는 방법에 대해 적어주세요. +- 현재 변경 사항을 Stash에 저장하고, working directory는 수정전으로 돌아간다. +- pull을 통해 최신 코드를 불러오고 stash에 저장해두었던 코드를 불러와 이전 변경 사항을 복원시킨다. ## Advanced 다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. From 466ef93c6292056aaba938469720d01174cfb606 Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Sat, 22 Mar 2025 16:00:16 +0900 Subject: [PATCH 61/73] =?UTF-8?q?Step=201=20=EB=B0=95=EC=86=8C=EC=98=81=20?= =?UTF-8?q?(#128)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 새로 구현한 기능 및 주요 변경점 # 버그 해결 💊 해결한 버그 # 리팩토링 🛠 리팩토링 내역 # 스크린샷 🖼 변경된 부분에 대한 스크린샷 # 비고 ✏ 리뷰어에게 전하는 말 등
    사용하지 않은 항목은 모두 지워주세요. --------- Co-authored-by: sysy04 --- ...E-\353\260\225\354\206\214\354\230\201.md" | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 "git-basics/22nd/README-\353\260\225\354\206\214\354\230\201.md" diff --git "a/git-basics/22nd/README-\353\260\225\354\206\214\354\230\201.md" "b/git-basics/22nd/README-\353\260\225\354\206\214\354\230\201.md" new file mode 100644 index 0000000..4f543f3 --- /dev/null +++ "b/git-basics/22nd/README-\353\260\225\354\206\214\354\230\201.md" @@ -0,0 +1,94 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. + +git은 local 저장소를 사용하기 때문에 다른 사람이 접근할 수 없다.
    +github는 git을 기반으로 하는 remote 저장소이므로 다른 사람들이 공유하고 접근할 수 있다. + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. + +working directory는 git이 관리하는 프로젝트의 실제 파일이 위치하는 곳이다.
    +staging area는 commit을 수행하기 전에 변경사항을 일시적으로 저장하는 영역이다.
    +working area에서 파일을 수정하고 이를 git에게 알리기 위해 git add를 사용하여 staging area에 추가한다.
    +staging area의 변경 사항을 local repo에 영구적으로 저장하기 위해 git commit 명령어를 사용한다.
    +local repo의 변경사항을 remote repo로 업로드 하기 위해 git push를 사용하여 변경 사항을 공유한다.
    +반대로 remote repo의 변경사항을 local repo로 가져 오기 위해서는 git pull을 사용한다 + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + +commit을 branch가 가리키고 HEAD는 branch를 가리킨다.
    +commit을 하면 HEAD가 가리키는 branch가 최신 commit으로 이동한다.
    +git checkout <브랜치명>을 하면 해당 branch로 HEAD가 이동한다.
    +git branch -b <브랜치명>을 사용하면 branch가 생성되고 git branch -d <브랜치명>을 사용하면 해당 branch가 삭제된다. + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +원하는 directory에서 git init을 사용하면 그 안에 빈 git 리포지토리를 만든다
    +git clone 을 사용하면 현재 directory의 안에 url에 해당하는 리포지토리를 복제한다.
    +origin은 현재 git에서 작업하는 local repo와 연결된 remote repo의 주소를 가리키는 단축이름으로 git 리포지토리를 복제할 때 자동으로 생성된다.
    +새로운 remote repo를 추가하려면 git remote add origin <추가할 remote repo 주소>를 사용하면 된다.
    +기존에 origin이 존재하는데 새로 추가하고 싶으면 git remote remove origin을 사용하여 기존 origin을 삭제하고 추가하면 된다. + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. + +soft에서 HEAD는 첫번째 commit을 가리킨다. 하지만 staging area와 working directory는 기존의 commit 상태로 유지된다.
    +mixed는 soft 유형에서 staging area도 함께 첫 번째 commit의 상태로 변경된다.
    +hard는 mixed 유형에서 working directory도 첫 번째 commit의 상태로 변경된다. + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. + +프로젝트 리포지토리에서 fork를 눌러 자신의 리포지토리로 가져온 후 로컬 리포지토리에서 clone한다.
    +내용 수정 후 자신의 리포지토리에 수정 브랜치를 push한다. 그 후 pull request 버튼을 누르고 메세지 작성후 보낸다.
    +프로젝트 리포지토리 관리자는 pr의 변경 내용을 확인 후 merge한다.
    +fast-forward : 메인 branch에 변경 사항이 없다면 head가 병합하려는 branch의 마지막 commit으로 이동한다.
    +3-way merge : 메인 branch에 변경 사항이 있다면 병합하려는 branch와의 공통 commit을 찾아 병합하고 새로운 commit을 생성하여 두 개의 branch와 연결한다. + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. + +rebase는 branch가 갈라질 때 메인 branch의 마지막 commit을 조상으로 하는 새로운 commit들을 생성하여 병합하려는 branch의 변경사항들을 차례대로 적용하는 것이다.
    +commit history를 시간 순서대로 남길 수 있어서 과거 commit history를 수정하기 좋다. + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. + +현재 작업하던 브랜치가 아닌 다른 브랜치에서 작업해야 할 때 git stash를 사용하여 변경 내용을 로컬 저장소에 임시로 저장할 수 있다.
    +git stash list를 통해 저장된 내용을 볼 수 있고 git stash apply를 통해 치워둔 마지막 항목을 불러올 수 있다. 끝에 번호를 적으면 항목 지정이 가능하다. + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- 브랜치관리전략에 대표적으로 Github Flow, Git Flow가 있습니다. 두 방식에서는 리포지토리를 어떻게 관리할까요? +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From b3099520631eb0932646da9eda33f8a0cb21e44c Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Sat, 22 Mar 2025 16:00:58 +0900 Subject: [PATCH 62/73] =?UTF-8?q?Step=201=20=EC=97=AC=EC=B1=84=EC=96=B8=20?= =?UTF-8?q?(#129)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 새로 구현한 기능 및 주요 변경점 # 버그 해결 💊 해결한 버그 # 리팩토링 🛠 리팩토링 내역 # 스크린샷 🖼 변경된 부분에 대한 스크린샷 # 비고 ✏ 리뷰어에게 전하는 말 등
    사용하지 않은 항목은 모두 지워주세요. --------- Co-authored-by: yeochaeeon --- git-basics/22nd/README-Yeochaeeon.md | 155 +++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 git-basics/22nd/README-Yeochaeeon.md diff --git a/git-basics/22nd/README-Yeochaeeon.md b/git-basics/22nd/README-Yeochaeeon.md new file mode 100644 index 0000000..de94ec6 --- /dev/null +++ b/git-basics/22nd/README-Yeochaeeon.md @@ -0,0 +1,155 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) + +- git + - 버전을 관리해주는 소프트웨어 + - local에서 작동하며 로컬 저장소상의 코드의 변경사항을 추적하고 관리하는데 사용한다. +- github + - git을 기반으로 한 원격(remote) 호스팅 웹 서비스이다. + - git 레포를 클라우드에 저장하고, 협업 및 코드 공유를 쉽게 할 수 있도록 돕는다. + - github는 원격 저장소(remote repository)를 관리하는데 사용된다. + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) + +- Working Directory + - 현재 작업중인 파일들이 위치한 디렉토리. 파일을 수정 및 생성하는 곳. + - Working Directory 에서는 파일을 tracked와 untracked로 구분한다. + > untracked 상태 + - 저장소 내의 모든 파일은 untracked상태로 시작하며 untracked 상태의 파일들은 git이 코드 변경 이력을 추적하지 않음. + > tracked 상태 + - tracked 상태의 파일들은 git에 의해 파일의 변경 이력이 추적된다. (ex.이전에 커밋된 파일) +- Git Add + - `git add` 는 Working Directory 에서 변경된 파일을 **staging area** 로 이동시킨다. + - 이 명령어를 사용하면 해당 파일을 tracked 상태로 등록한다. + - tracked 상태의 파일들을 임시로 저장하는 공간. + - `git add . `은 현재 디렉토리의 모든 변경 사항을 스테이징하는 명령어이다. +- Git Commit + - 스테이징 영역의 변경사항을 **로컬 레포**에 저장하는 명령어이다. + - 커밋은 변경 사항의 스냅샷을 따서 Git 히스토리에 저장한다. + - 커밋메시지를 함께 남겨 변경 사항에 대한 정보를 기록한다. + - 이 단계는 **로컬**에서 이루어지며, 원격 레포에는 아직 반영되지 않는다. +- Git Push + - 로컬 레포의 커밋을 **원격 레포로 전송**한다. + - github에 변경 사항이 반영된다. + - 로컬과 원격 간의 동기화를 해주는 역할을 한다. +- Git Merge + - 두 브랜치의 변경사항을 하나로 통합한다. +- Git Fetch + - 원격 레포의 최신 정보를 로컬로 가져온다. + - 그러나 로컬 브랜치에 바로 반영하지는 않는다. + - `git merge`나 `git pull`을 추가로 실행함으로써 변경사항을 반영할 수 있다. +- Git Pull + - `git fetch`와 `git merge`를 합친 명령어 + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) + +- Branch + - 브랜치 생성 후 전환 : `git checkout -b step-1-여채언` + - 브랜치 전환 : `git checkout step-1` +- HEAD + - HEAD는 현재 작업중인 커밋을 가리키는 포인터이다. + - 보통 현재 브랜치의 최신 커밋을 가리킨다. + - `git checkout`으로 브랜치를 전환하면, HEAD도 해당 브랜치로 이동한다. +## clone, init, origin + +### `git clone` vs `git init` +> `git clone` +- 원격 레포지토리를 로컬로 복사하여 로컬 레포를 생성하는 명령어이다. 원격 레포의 모든 커밋 기록, 브랜치, 파일을 가져온다. +- 데이터를 로컬로 복사하면서, 원격 레포와 자동으로 연결된다. +> `git init` +- 현재 디렉토리를 새로운 git 로컬 레포로 초기화하는 명령어. +- 빈 레포를 생성하고, 원격 레포와의 연결은 설정되지 않은 상태로 시작한다. +- init 으로 생성한 레포를 원격 레포와 연결하려면, +`git remote add origin <원격레포URL>` 을 사용한다. +### Origin 이란? +- 원격 레포 (Remote Repository)의 기본 이름름 +- origin은 원격 레포지토리의 URL을 가리키며, git push, git pull, git fetch 같은 명령어에서 사용됨. +- 원격 레포지토리의 브랜치는 origin/브랜치명 형식으로 표시됨(예: origin/step-0). +- 연결된 원격 저장소 확인 : `git remote -v` + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) + +> `git reset`은 git에서 커밋 히스토리를 되돌리거나 변경사항을 취소하는데 사용되는 명령어이고 세가지의 타입이 있다. +- ` --soft` + - HEAD를 지정한 커밋으로 이동시킨다. 하지만 스테이징 영역과 작업 디렉토리의 변경사항은은 그대로 유지된다. + - 커밋만 취소하고 변경된 파일들은 그대로 스테이징 영역에 남아있다.- HEAD를 바로 직전 커밋으로 이동하고자 할 때 : `git reset --soft HEAD^` +- ` --mixed` (default) + - HEAD를 지정한 커밋으로 이동시키고, 스테이징 영역을 초기화하지만 작업 디렉토리의 변경 사항은 유지한다. + - 즉, 커밋과 스테이징 상태를 되돌리지만 파일 자체의 변경 내용은 남아 있다. +- ` --hard` + - HEAD를 지정한 커밋으로 이동시키고, 스테이징 영역과 작업 디렉토리까지 모두 해당 커밋 상태로 되돌린다. + - 즉, 커밋, 스테이징, 작업 디렉토리의 모든 변경 사항이 삭제된다. +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) + +- Pull Request + - 한 브랜치의 변경 사항을 다른 브랜치에 병합하기 위해 요청하는 기능 + - PR에서 병합하기 전에 코드리뷰, 테스트 등을 거치고 협업을 용이하게 한다. + - 원격 레포에서 브랜치 간의 변경 사항을 비교하고 병합하는 과정을 제공한다. +- Merge + - 두 브랜치의 변경 사항을 하나로 통합한다. + > fast-forward Merge + - 새로운 브랜치에만 commit이 있고 기준 브랜치에는 신규 commit이 없을 때. + - 병합 커밋이 남지 않는다. + - 충돌 가능성 없다. + ![fast-forward](https://codingapple-cdn.b-cdn.net/wp-content/uploads/2022/06/%EA%B7%B8%EB%A6%BC3-4.png) + > 3-way Merge + - 브랜치에 각각 신규 commit 이 1회 이상 존재하는 경우 + - 두개의 브랜치 코드를 합쳐 새로운 commit이 생성된다. + ![3way](https://codingapple-cdn.b-cdn.net/wp-content/uploads/2022/06/merge1.png) + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) + +- `git rebase`는 현재 브랜치의 커밋을 떼어내어, 지정한 브랜치의 최신 커밋 위에 재적용한다. +- rebase또한 병합 방법 중 하나이나, merge에 비해 커밋 기록을 한 줄로 깔끔하게 관리할 수 있다. 그러나 충돌 발생 가능성이 있다. +- 병합 커밋이 생성되지 않는다. + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) + +- `git stash`는 작업 디렉토리와 스테이징 영역의 변경 사항을 임시로 저장하고, 작업 디렉토리를 깨끗한 상태로 되돌리는 명령어. +- 변경 사항을 스택(stack)에 저장하고, 작업 디렉토리와 스테이징 영역을 마지막 커밋 상태로 되돌린다. +> 활용 예시 +- branch-a 에서 파일을 수정했지만, 커밋하지 않고 다른 브랜치로 전환하고자 할 때 +```bash +# 현재 작업 중인 변경 사항 저장 후 작업 디렉토리를 깨끗하게 한다 +git stash +# stash 목록을 확인한다 +git stash list +# 스택에 쌓인 가장 최근의 변경 사항을 불러와 작업 디렉토리에 적용하고 스택에서 제거된다. +git stash pop +# 변경사항을 불러와 적용하지만, 스택에서 제거는 하지 않는다 +git stash apply + +``` +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- 브랜치관리전략에 대표적으로 Github Flow, Git Flow가 있습니다. 두 방식에서는 리포지토리를 어떻게 관리할까요? +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From 835e3e7f196e03410e5b816576abba4c0368552c Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Sat, 22 Mar 2025 16:01:41 +0900 Subject: [PATCH 63/73] =?UTF-8?q?Step=201=20=EC=9E=84=EB=82=98=EB=B9=88=20?= =?UTF-8?q?(#130)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 새로 구현한 기능 및 주요 변경점 # 버그 해결 💊 해결한 버그 # 리팩토링 🛠 리팩토링 내역 # 스크린샷 🖼 변경된 부분에 대한 스크린샷 # 비고 ✏ 리뷰어에게 전하는 말 등
    사용하지 않은 항목은 모두 지워주세요. --------- Co-authored-by: yimnabin --- ...E-\354\236\204\353\202\230\353\271\210.md" | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 "git-basics/22nd/README-\354\236\204\353\202\230\353\271\210.md" diff --git "a/git-basics/22nd/README-\354\236\204\353\202\230\353\271\210.md" "b/git-basics/22nd/README-\354\236\204\353\202\230\353\271\210.md" new file mode 100644 index 0000000..9c4324a --- /dev/null +++ "b/git-basics/22nd/README-\354\236\204\353\202\230\353\271\210.md" @@ -0,0 +1,121 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +Git은 버전 관리 시스템이고 local에서 파일을 추적하고 관리합니다. Github는 Git을 기반으로 한 웹 호스팅 서비스로 remote repository를 관리할 수 있는 플랫폼이며 협업을 위해 공유하는 공간입니다 + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +- **Working Directory** : 실제 파일을 편집하는 작업 공간입니다. `git status`를 통해 변경된 파일을 확인합니다. +- **Git Add** : `git add` 명령어를 통해 변경사항을 Staging Area에 추가합니다. + - `git add [filename]` : 특정 파일을 추가 + - `git add .` : 모든 변경사항을 추가 +- **Staging Area** : 커밋할 파일이 임시로 저장되는 공간입니다 +- **Local Repo** : 로컬 저장소이며 커밋된 모든 기록이 저장됩니다 +- **Remote Repo** : 원격 저장소이며 `git fetch`로 Remote Repo의 변경사항을 Local Repo로 가져옵니다(merge는 X), `git pull`은 변경사항을 가져온 후 자동 병합합니다 (merge + fetch) + +- **Git Commit** : `git commit` 명령어를 통해 Local Repo에 변경사항이 저장됩니다. + - `git commit -m "commit message"` +- **Git Push** : `git push` 명령어를 통해 Local Repo의 변경사항을 Remote Repo로 업로드 합니다 + - `git push origin [branch_name]` + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + +- **Branch** : 코드 변경 사항을 독립적으로 작업할 수 있도록 하는 기능. 서로 독립적으로 작업하면서 나중에 merge 할 수 있습니다. + - `git branch [branch_name]` : 브랜치 생성 + - `git branch -d [branch_name]` : 브랜치 삭제 + - `git checkout [branch-name]` : 브랜치 이동 +- **HEAD** : 현재 작업 중인 브랜치의 현재 위치를 가리킵니다. Head는 특정 커밋을 가리키고, 커밋을 업데이트 하거나 이동하면 움직입니다. + - `git checkout [commit-id]` : HEAD 이동 +- **git checkout** : 브랜치 변경, 파일 복원 등에 사용합니다 + - `git checkout feature-branch` + - `git checkout [filename]` + - `git checkout [commit_id]` + + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- **git clone** : 원격 저장소의 전체 내용을 로컬로 복제하는 명령어. clone을 사용하면 원격 저장소의 모든 커밋 기록, 브랜치, 태그 등이 로컬 저장소에 복사됩니다. + - `git clone [repository-url]` +- **git init** : 새로운 로컬 저장소를 생성하는 명령어. + - `git init` +- **origin** : 원격 저장소를 나타냅니다. origin은 URL을 가리키며 로컬 저장소와 원격 저장소를 연결할 수 있습니다 + - `git remote add origin [repository_url]` : 원격 저장소 설정 + - `git remote -v` : 원격 저장소 확인 + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +- **git reset** : 작업 중인 커밋을 되돌리는 명령어 + - `git reset -- soft [commit_id]` : HEAD 포인터를 이동시켜 지정된 커밋으로 되돌리지만, Working Directory와 Staging Area는 그대로 두고, 해당 커밋 이후의 변경 사항은 그대로 Staging 상태로 남겨둡니다 + + - `git reset --mixed [commit_id]` : HEAD 포인터는 지정된 커밋으로 이동하고 변경사항은 Working Directory에는 + 남아있으나 Staging Area에서만 제거됩니다 (기본 옵션) + - `git reset --hard [commit_id]` : HEAD 포인터를 지정된 커밋으로 이동시키고 Working Directory와 Staging Area 모두를 해당 커밋 상태로 되돌립니다 (이전 변경 사항이 모두 삭제됨) + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. +- **Pull Request** : 한 브랜치에서 다른 브랜치로 변경 사항을 병합하고자 할 때 리뷰를 요청하는 과정. PR을 통해 팀원들이 코드 변경을 리뷰하고 문제를 수정하거나 논의할 수 있습니다 + + 1. 브랜치에서 작업을 완료하고 커밋 push + 2. pr을 생성하여 리뷰 요청 + + 3. 변경 사항을 리뷰하고 피드백 제공 + 4. 리뷰가 완료되면 변경사항 merge + +- **Merge** : 두 개의 브랜치를 하나로 합치는 기능. PR을 통해 이루어 지며 Git에서 자동으로 병합을 시도하고 충돌이 있을 경우 수동으로 해결해야합니다. + + - Fast-Forward Merge : HEAD 포인터를 이동시켜 병합하는 방식으로 병합 커밋이 생성되지 않습니다 + - `git checkout main` + - `git merge feature-branch` + + - 3-Way Merge : 두 브랜치가 서로 다른 변경 사항을 포함하고 있을 때 발생합니다. + + 1. 두 브랜치가 갈라지기 전의 마지막 공통 커밋을 찾는다 + 2. 브랜치 A 변경사항 확인 + 3. 브랜치 B 변경사항 + 4. 병합이 완료되면 Git이 병합 커밋 생성 + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +한 브랜치의 변경 사항을 다른 브랜치의 맨 위로 적용하는 방법. +- `git checkout featchure-branch` +- `git rebase main` + + 1. feature-branch에 있는 커밋들이 main 브랜치의 최신 커밋 뒤에 재적용됨 (병합 커밋 생성X) + 2. 충돌이 발생할 경우 해결 후 `git rebase --coninue`를 실행하여 계속 진행 +- 병합 커밋 없이 커밋 히스토리를 관리할 때 유용합니다 + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +현재 작업 중인 변경 사항을 임시로 저장하고 Working Directory를 깨끗하게 되돌리는 기능. 다른 브랜치로 이동하거나 작업을 잠시 중단해야 할 때 사용됩니다. +- `git stash` +- `git stash list` : 저장한 목록 보기 +- `git stash pop` : 가장 최근 stash 복원 + +- `git stash apply stash@{idx}` : 특정 stash 복원 +- `git stash drop stash@{idx}` : 특정 stash 삭제 +- `git stash clear` : 모든 stash 삭제 + + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- 브랜치관리전략에 대표적으로 Github Flow, Git Flow가 있습니다. 두 방식에서는 리포지토리를 어떻게 관리할까요? +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. + +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From 83b2421f58708f9151454fbf0d7259b6f3dce9c9 Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Sat, 22 Mar 2025 16:02:34 +0900 Subject: [PATCH 64/73] =?UTF-8?q?Step=201=20=EC=A7=80=EC=9A=B0=EA=B0=80?= =?UTF-8?q?=EB=9E=8C=20(#131)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 새로 구현한 기능 및 주요 변경점 # 버그 해결 💊 해결한 버그 # 리팩토링 🛠 리팩토링 내역 # 스크린샷 🖼 변경된 부분에 대한 스크린샷 # 비고 ✏ 리뷰어에게 전하는 말 등
    사용하지 않은 항목은 모두 지워주세요. --------- Co-authored-by: Maius --- git-basics/README.md | 49 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/git-basics/README.md b/git-basics/README.md index 67ff3e7..ee2bfc4 100644 --- a/git-basics/README.md +++ b/git-basics/README.md @@ -6,42 +6,91 @@ Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 git과 github는 같은 의미가 아닙니다. local, remote와 연관지어 적어주세요. +깃과 깃허브의 가장 큰 차이점은 깃이 소프트웨어이며, 깃허브가 서비스라는 점입니다. 깃은 개발자의 로컬(local) 컴퓨터에서 동작하며, 소스 코드의 버전 관리를 담당합니다. 반면, 깃허브는 깃 리포지토리를 호스팅하는 웹 서비스(remote)로, 프로젝트 협업을 위한 다양한 도구를 제공합니다. +-> GitHub는 Git 저장소를 호스팅하는 원격(remote) 저장소 서비스이다. + ## Git Workflow ![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) 위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. Git Merge, Git Fetch는 생략해도 됩니다. +- Working Directory : 사용자가 작업하는 로컬 파일들이 위치한 영역으로 업로드 전의 작업한 파일입니다. +- Git Add : Working Directory에서 변경된 파일을 Staging Area로 추가하여 커밋 대상으로 만듭니다. +- Git Commit : Staging Area의 변경 사항을 코멘트와 함께 로컬 저장소(Local Repository)에 기록합니다. +- Git Push : 로컬 저장소에서 원격 저장소(GitHub)로 변경 사항을 업로드합니다. +- Git Fetch : 원격 저장소의 최신 변경 사항을 로컬로 가져오지만, 자동으로 병합하지는 않습니다. +- Git Merge : 다른 브랜치의 변경 사항을 현재 브랜치에 합칩니다.(수정사항을 적용하거나 기능을 업데이트 하는 과정) +- Git Pull : 원격 저장소의 변경 사항을 가져와 로컬 저장소와 자동으로 병합(Merge)합니다. + ## Branch, HEAD ![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) git이 동작하는 기본 단위는 commit과 branch입니다. branch와 HEAD, git checkout을 포함하여 작성 바랍니다. branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. +- Commit: 변경 사항을 기록하는 Git의 기본 단위로 각 commit은 고유한 해시값을 가집니다. +- Branch: 독립적으로 개발을 진행할 수 있는 작업 공간으로, 여러 브랜치를 만들어 병렬 작업이 가능합니다. 보통 기본 작업 파일을 살려두고 나머지 기능이나 수정사항을 점검한 후 적용하기 위해 사용합니다. +- HEAD: 현재 체크아웃(작업 중)된 브랜치를 가리키는 포인터로, HEAD가 가리키는 브랜치가 변경됩니다. (HEAD = 현재 작업중인 branch) +- git checkout [브랜치명]: 특정 브랜치로 이동하거나, 특정 커밋을 체크아웃할 때 사용합니다. +- git switch -c [새로운 브랜치명]: 새 브랜치를 생성하고 해당 브랜치로 이동합니다. +- git branch [새로운 브랜치명]: 새로운 브랜치를 생성하지만, 현재 브랜치를 변경하지 않습니다. +- git branch -d [브랜치명]: 로컬 브랜치를 삭제합니다. +- git push origin --delete [브랜치명]: 원격 브랜치를 삭제합니다. ## clone, init, origin 리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. - git clone과 git init의 차이점, 이용방법 - origin이란 키워드는 무엇인지, 어떻게 설정하는지 +- git init : 로컬 저장소에 새로운 Git repository를 생성합니다. Git Hub에는 따로 연동해줘야합니다. +- git clone : 원격 저장소에 있는 기존의 repository를 복제하여 로컬로 가져옵니다. 원격 저장소와 자동으로 연동됩니다. + ## reset ![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) reset에는 3가지 타입이 있습니다. 각 타입에 대해 작성 바랍니다. +- git reset --soft [커밋ID] : 지정한 커밋으로 HEAD만 이동하고, 변경 사항은 Staging Area(=index)에 유지됩니다. 최근 커밋을 수정할때 유용합니다. +- git reset --mixed [커밋ID] : 지정한 커밋으로 HEAD와 Staging Area를 이동하지만, Working Directory는 그대로 유지됩니다. 커밋은 취소되지만 파일 변경 사항은 남아있어 다시 커밋할 수 있습니다. +- git reset --hard [커밋ID] : 지정한 커밋으로 HEAD, Staging Area, Working Directory를 모두 이동시켜 변경 사항을 완전히 삭제합니다. + ## Pull Request, Merge ![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) Pull Request와 Merge에 대한 내용을 적어주세요. 특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. +- Pull Request : GitHub, GitLab 등에서 사용하는 기능으로, 브랜치 병합을 요청하는 과정입니다. 협업을 하며 수정사항을 병합할지 검토한 후 진행할 수 있습니다. +- Merge : 한 브랜치의 변경 사항을 다른 브랜치에 적용하는 과정입니다. git merge [브랜치명] 명령어로 수행됩니다. +1) Fast-Forward Merge : 대상 브랜치가 병합하려는 브랜치의 최신 커밋을 그대로 따라갈 수 있을 때 발생합니다. 별도의 병합 커밋 없이 브랜치의 HEAD가 이동합니다. +2) 3-Way Merge : 두 브랜치가 서로 다른 변경 사항을 가질 때 발생하며, 공통 조상(ancestor)을 기준으로 병합합니다. 새로운 병합 커밋이 생성됩니다. + ## rebase ![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. +- rebase : 브랜치의 변경 사항을 다른 브랜치의 최신 상태 위로 이동시키는 명령어입니다. git merge와 달리 병합 커밋 없이 깔끔한 커밋 히스토리를 유지할 수 있습니다. + +<활용방법> +1) 협업 중 최신 코드 반영 +2) 불필요한 Merge Commit 방지 : 병합 커밋 없이 정리된 커밋 히스토리를 유지할 수 있습니다. +3) 커밋 순서 정리 및 수정 : git rebase -i HEAD~n을 사용하면 특정 개수의 커밋을 수정, 삭제, 합치기 할 수 있습니다. + ## stash ![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) git stash를 활용하는 방법에 대해 적어주세요. +- git stash : 작업 중인 변경 사항을 임시로 저장하고, 작업 디렉토리를 깨끗한 상태로 되돌리는 기능입니다. + +<활용방법> +1) 커밋하지 않고도 다른 브랜치로 이동하거나, 코드를 테스트할 때 유용합니다. +2) 변경 사항 임시 저장 : Staging Area와 Working Directory의 변경 사항이 stash로 이동하고, 작업 디렉토리는 깨끗한 상태가 됩니다. +3) 임시 저장한 변경 사항 적용 : 가장 최근에 저장한 변경 사항을 다시 적용하고, stash 목록에서 제거합니다. +4) 저장된 목록 확인 : 여러 개의 stash를 저장할 수 있으며, 목록을 확인할 수 있습니다. +5) 특정 stash 적용 : stash@{n}에 해당하는 특정 stash를 적용하지만 목록에서 제거하지 않습니다. +6) 특정 stash 삭제 +7) 모든 stash 삭제 + ## Advanced 다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. - 브랜치관리전략에 대표적으로 Github Flow, Git Flow가 있습니다. 두 방식에서는 리포지토리를 어떻게 관리할까요? From 9b0dd027f6f932e81c3c9d67867a117dd57db6c5 Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Sat, 22 Mar 2025 16:03:19 +0900 Subject: [PATCH 65/73] =?UTF-8?q?Step=201=20=EC=B5=9C=EA=B4=91=EC=A7=84=20?= =?UTF-8?q?(#132)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 새로 구현한 기능 및 주요 변경점 # 버그 해결 💊 해결한 버그 # 리팩토링 🛠 리팩토링 내역 # 스크린샷 🖼 변경된 부분에 대한 스크린샷 # 비고 ✏ 리뷰어에게 전하는 말 등
    사용하지 않은 항목은 모두 지워주세요. --------- Co-authored-by: qqwwee771441 <104188251+qqwwee771441@users.noreply.github.com> --- ...E-\354\265\234\352\264\221\354\247\204.md" | 1020 +++++++++++++++++ 1 file changed, 1020 insertions(+) create mode 100644 "git-basics/22nd/README-\354\265\234\352\264\221\354\247\204.md" diff --git "a/git-basics/22nd/README-\354\265\234\352\264\221\354\247\204.md" "b/git-basics/22nd/README-\354\265\234\352\264\221\354\247\204.md" new file mode 100644 index 0000000..a0564cf --- /dev/null +++ "b/git-basics/22nd/README-\354\265\234\352\264\221\354\247\204.md" @@ -0,0 +1,1020 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. + +Git과 GitHub는 같은 의미가 아니며, **Local(로컬)과 Remote(원격)** 개념과 관련이 있습니다. + +- **Git**: 분산형 버전 관리 시스템(DVCS)으로, **로컬(Local)에서 코드의 변경 이력을 추적하고 버전 관리를 할 수 있도록 해주는 도구**입니다. 개발자는 Git을 사용하여 변경 사항을 커밋하고, 브랜치를 생성하여 독립적인 개발을 진행하며, 필요에 따라 이전 버전으로 롤백할 수 있습니다. Git은 네트워크 없이도 사용할 수 있으며, 개발자의 **로컬 저장소(Local Repository)** 에 코드가 저장됩니다. + +- **GitHub**: Git을 기반으로 하는 **원격(Remote) 저장소 서비스**로, 로컬에서 관리하던 Git 저장소를 인터넷을 통해 **다른 사람과 공유하거나 협업할 수 있도록 지원하는 플랫폼**입니다. GitHub를 활용하면 원격 저장소(Remote Repository)에 코드를 푸시(Push)하여 백업할 수 있고, 팀원들과 Pull Request(PR) 및 코드 리뷰를 통해 협업할 수 있습니다. + +### **Git과 GitHub의 관계 (Local & Remote 연관)** +1. **Git은 로컬(Local)에서 코드 버전 관리를 담당하고**, GitHub는 원격(Remote)에서 저장소를 호스팅하여 협업할 수 있도록 돕습니다. +2. 로컬에서 `git add` → `git commit`을 수행하여 변경 사항을 기록한 후, `git push`를 사용하여 원격 저장소(GitHub)로 업로드합니다. +3. 반대로, 팀원이 업데이트한 코드가 원격 저장소에 있다면, `git pull`을 사용하여 로컬 저장소로 가져올 수 있습니다. + +즉, **Git은 버전 관리를 위한 도구이고, GitHub는 Git 저장소를 호스팅하는 원격 서비스**입니다. Git을 이용해 로컬에서 작업하고, GitHub를 통해 협업하는 방식으로 활용됩니다. 😊 + + + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. + +### **Git 동작 과정 설명 (다이어그램 기반)** + +Git은 코드의 변경 사항을 추적하고 버전 관리를 수행하는 도구입니다. 다이어그램을 기반으로 각 개념을 설명하겠습니다. + +--- + +### **1. Working Directory (작업 디렉토리)** +- 현재 작업 중인 디렉토리로, 프로젝트의 소스 코드 파일들이 위치하는 곳입니다. +- 새로운 파일을 생성하거나, 기존 파일을 수정하는 등 모든 변경 사항은 **Working Directory에서 발생**합니다. +- Git의 버전 관리에 포함되지 않은 상태이며, 추적되지 않은(Untracked) 상태일 수 있습니다. + +--- + +### **2. Git Add (스테이징 영역에 추가)** +- `git add` 명령어를 사용하면 **Working Directory에서 변경된 파일을 Staging Area로 이동**시킵니다. +- 변경 사항을 커밋하기 전에 확인하고 준비하는 과정으로, 아직 Git의 최종 버전에 기록되지 않은 상태입니다. +- 예제: + ```bash + git add 파일명 # 특정 파일 추가 + git add . # 모든 변경 사항 추가 + ``` + +--- + +### **3. Staging Area (스테이징 영역, 인덱스)** +- Git이 커밋할 파일을 임시로 저장하는 공간입니다. +- `git add`를 수행한 후 파일이 저장되며, 이후 `git commit`을 통해 로컬 저장소에 기록됩니다. +- 여러 개의 파일을 수정한 후, 원하는 파일만 선택하여 커밋할 수 있습니다. + +--- + +### **4. Git Commit (로컬 저장소에 기록)** +- `git commit`을 수행하면 **Staging Area의 변경 사항이 Local Repository에 저장**됩니다. +- 커밋은 특정 시점의 프로젝트 상태를 기록하는 스냅샷과 같으며, 이후 원격 저장소에 업로드할 수 있습니다. +- 예제: + ```bash + git commit -m "변경 사항 설명" + ``` + +--- + +### **5. Local Repo (HEAD) (로컬 저장소, HEAD 포인터)** +- `git commit`을 수행하면 변경 사항이 Local Repository에 저장됩니다. +- **HEAD는 현재 작업 중인 브랜치의 최신 커밋을 가리키는 포인터**입니다. +- 이 상태에서는 아직 원격 저장소에 업로드되지 않았으며, 다른 사람과 공유할 수 없습니다. + +--- + +### **6. Git Push (원격 저장소로 업로드)** +- `git push`를 사용하면 **Local Repository의 변경 사항을 Remote Repository(GitHub, GitLab 등)로 업로드**할 수 있습니다. +- 원격 저장소에 있는 팀원들이 내 변경 사항을 확인할 수 있도록 공유하는 과정입니다. +- 예제: + ```bash + git push origin main # main 브랜치에 업로드 + ``` + +--- + +### **7. Remote Repo (MASTER) (원격 저장소)** +- GitHub, GitLab, Bitbucket 등의 서비스에 저장되는 **원격 저장소**입니다. +- 여러 개발자가 협업할 때 변경 사항을 공유하는 공간입니다. +- 원격 저장소에 있는 코드를 내려받거나(`git pull`), 최신 내용을 가져올 수 있습니다(`git fetch`). + +--- + +### **8. Git Fetch (원격 저장소의 변경 사항을 가져오기)** +- `git fetch`는 **원격 저장소(Remote)에서 최신 변경 사항을 가져오지만, 자동으로 병합하지 않습니다.** +- 로컬 저장소에 영향을 주지 않으며, 단순히 최신 정보를 가져오는 역할을 합니다. +- 이후 `git merge`를 사용해 원격 변경 사항을 로컬에 반영할 수 있습니다. +- 예제: + ```bash + git fetch origin + ``` + +--- + +### **9. Git Merge (브랜치 병합)** +- `git merge`는 **다른 브랜치에서 가져온 변경 사항을 현재 브랜치에 병합**하는 명령어입니다. +- 일반적으로 `git fetch` 후 변경 사항을 로컬 브랜치에 적용할 때 사용됩니다. +- 예제: + ```bash + git merge origin/main + ``` + +--- + +### **10. Git Pull (원격 저장소의 변경 사항을 로컬에 반영)** +- `git pull`은 `git fetch` + `git merge`를 합친 명령어입니다. +- **원격 저장소(Remote)의 최신 변경 사항을 가져오고(Local), 자동으로 병합(Merge)합니다.** +- 팀원들의 코드 변경 사항을 받아올 때 사용됩니다. +- 예제: + ```bash + git pull origin main + ``` + +--- + +### **정리** +1. **Working Directory**: 실제 작업하는 공간 (파일 추가/수정/삭제 가능) +2. **Git Add**: 변경된 파일을 **Staging Area(스테이징 영역)** 에 추가 +3. **Staging Area**: 커밋할 파일을 준비하는 공간 +4. **Git Commit**: 변경 사항을 **Local Repository(로컬 저장소)** 에 기록 +5. **Git Push**: 로컬 변경 사항을 **Remote Repository(원격 저장소)** 로 업로드 +6. **Git Fetch**: 원격 저장소의 최신 변경 사항을 가져옴 (병합하지 않음) +7. **Git Merge**: 다른 브랜치 또는 원격 저장소의 변경 사항을 현재 브랜치에 병합 +8. **Git Pull**: 원격 저장소에서 변경 사항을 가져오고 자동으로 병합 + +--- + +이제 Git의 흐름을 정리하면 다음과 같습니다. +1️⃣ **파일을 수정/추가 (Working Directory)** +2️⃣ `git add` → 스테이징 영역에 추가 +3️⃣ `git commit` → 로컬 저장소에 기록 +4️⃣ `git push` → 원격 저장소로 업로드 +5️⃣ 다른 팀원의 변경 사항을 반영하려면 `git pull` + +위 내용을 바탕으로 추가 설명이 필요하거나 궁금한 점이 있다면 알려주세요! 😊 + + + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + +### **Git의 기본 단위: Commit과 Branch** + +Git은 **Commit(커밋)**과 **Branch(브랜치)** 개념을 기반으로 동작합니다. +- **Commit**: 코드의 변경 사항을 저장하는 스냅샷으로, 특정 시점의 프로젝트 상태를 기록합니다. +- **Branch**: 독립적인 작업을 수행할 수 있도록 만든 **분기(branch)** 입니다. + +--- + +## **1. Branch (브랜치)란?** +브랜치는 **커밋의 흐름을 나누어 독립적인 작업을 진행할 수 있도록 돕는 기능**입니다. +- 여러 개발자가 동시에 작업할 수 있도록 분리된 작업 공간을 제공합니다. +- 기본적으로 Git은 `master`(또는 `main`) 브랜치를 생성하며, 새로운 브랜치를 만들어 병렬 작업이 가능합니다. + +💡 **브랜치를 사용하면 여러 기능을 동시에 개발하고, 이후 병합(merge)할 수 있습니다.** + +--- + +## **2. HEAD란?** +`HEAD`는 **현재 작업 중인 브랜치를 가리키는 포인터**입니다. +- 항상 최신 커밋을 가리키며, 브랜치를 이동하면 HEAD도 함께 이동합니다. +- 현재 작업 중인 브랜치가 어디인지 알려주는 역할을 합니다. +- 위 다이어그램에서는 `FEATURE BRANCH`에 `HEAD`가 위치해 있습니다. + +--- + +## **3. 브랜치 관련 Git 명령어** + +### 🔹 **(1) 브랜치 확인** +```bash +git branch # 현재 브랜치 목록 확인 +git branch -a # 로컬 + 원격 저장소 브랜치 확인 +``` + +### 🔹 **(2) 새로운 브랜치 생성** +```bash +git branch feature-branch # feature-branch라는 새 브랜치 생성 +``` + +### 🔹 **(3) 브랜치 이동 (checkout)** +```bash +git checkout feature-branch # feature-branch로 이동 +``` +- `checkout`을 사용하면 다른 브랜치로 이동할 수 있으며, HEAD도 해당 브랜치를 가리키게 됩니다. + +💡 **Git 2.23 이후 버전에서는 `git switch`를 사용할 수도 있습니다.** +```bash +git switch feature-branch +``` + +### 🔹 **(4) 브랜치 생성과 동시에 이동** +```bash +git checkout -b feature-branch # 새 브랜치를 만들고 바로 이동 +``` +또는 +```bash +git switch -c feature-branch +``` + +### 🔹 **(5) 브랜치 병합 (merge)** +```bash +git checkout main # 메인 브랜치로 이동 +git merge feature-branch # feature-branch를 main에 병합 +``` + +### 🔹 **(6) 브랜치 삭제** +```bash +git branch -d feature-branch # 병합된 브랜치 삭제 (안전한 삭제) +git branch -D feature-branch # 병합되지 않은 브랜치 강제 삭제 +``` + +--- + +## **4. Git에서 브랜치를 활용하는 기본적인 흐름** +1️⃣ `git branch feature-branch` → 새로운 브랜치 생성 +2️⃣ `git checkout feature-branch` → 브랜치 이동 +3️⃣ `git add . && git commit -m "작업 완료"` → 변경 사항 커밋 +4️⃣ `git checkout main` → 메인 브랜치로 이동 +5️⃣ `git merge feature-branch` → 브랜치를 병합 +6️⃣ `git branch -d feature-branch` → 병합된 브랜치 삭제 + +--- + +## **5. 추가적으로 알아두면 좋은 개념** +🔹 `git rebase` → 브랜치를 최신 커밋으로 정리할 때 사용 +🔹 `git stash` → 변경 사항을 임시로 저장하고 브랜치를 이동할 때 사용 +🔹 `git cherry-pick` → 특정 커밋만 선택하여 적용할 때 사용 + +--- + +### **결론** +- `HEAD`는 현재 작업 중인 브랜치를 가리킵니다. +- `git checkout` 또는 `git switch`를 사용하면 브랜치를 변경할 수 있습니다. +- 브랜치를 활용하면 독립적인 작업이 가능하며, 병합(merge)을 통해 코드 변경 사항을 반영할 수 있습니다. + +🚀 **Git 브랜치를 활용하면 여러 기능을 동시에 개발하고 안전하게 관리할 수 있습니다!** +추가 질문이 있다면 알려주세요. 😊 + + + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +## **Git 리포지토리 생성 방법: `git clone` vs `git init`** + +Git에서 로컬에 리포지토리를 생성하는 방법에는 **`git clone`**과 **`git init`** 두 가지가 있습니다. +이 두 가지 방법의 차이점과 함께, 원격 저장소를 의미하는 `origin`의 개념과 설정 방법도 설명하겠습니다. + +--- + +## **1. `git clone` vs `git init` 차이점** + +| 명령어 | 사용 목적 | 원격 저장소 연결 여부 | 기본 사용 예시 | +|--------|------------|----------------|----------------| +| `git clone` | **기존 원격 저장소를 로컬로 복제** | O (자동으로 `origin` 설정됨) | `git clone ` | +| `git init` | **새로운 로컬 저장소 생성** | X (별도로 원격 저장소 연결 필요) | `git init` | + +### **✅ `git clone`** +- **기존 원격 저장소(GitHub, GitLab 등)를 로컬에 복사**하는 명령어입니다. +- 원격 저장소가 있는 경우 사용하며, 자동으로 `origin`이라는 원격 저장소가 설정됩니다. +- 기본적으로 원격 저장소의 모든 내용(파일, 커밋, 브랜치 등)이 복사됩니다. + +#### **🛠 사용 예시** +```bash +git clone https://github.com/user/repository.git +``` +- 위 명령어를 실행하면 `repository` 폴더가 생성되고, 해당 저장소의 코드가 로컬로 복제됩니다. +- `git remote -v`를 실행하면 `origin`이 자동으로 설정된 것을 확인할 수 있습니다. + +--- + +### **✅ `git init`** +- **새로운 로컬 저장소를 생성**할 때 사용합니다. +- 기존의 원격 저장소가 없는 프로젝트에서 처음으로 Git을 사용하려 할 때 유용합니다. +- 원격 저장소(`origin`)와 연결되지 않으므로, 원격 저장소를 따로 설정해야 합니다. + +#### **🛠 사용 예시** +```bash +mkdir my_project +cd my_project +git init +``` +- 위 명령어를 실행하면 `.git` 폴더가 생성되며, Git으로 버전 관리를 시작할 수 있습니다. + +--- + +## **2. `origin`이란?** +- `origin`은 **로컬 저장소에서 기본적으로 가리키는 원격 저장소의 이름**입니다. +- `git clone`을 하면 자동으로 `origin`이 설정됩니다. +- `git init`을 한 경우에는 원격 저장소가 없으므로, `origin`을 직접 설정해야 합니다. + +--- + +## **3. `origin` 설정 방법** + +### **✅ `git clone`을 사용한 경우** +- `git clone`을 하면 `origin`이 자동으로 설정됩니다. +- 확인 방법: + ```bash + git remote -v + ``` + 예제 출력: + ``` + origin https://github.com/user/repository.git (fetch) + origin https://github.com/user/repository.git (push) + ``` + +--- + +### **✅ `git init`을 사용한 경우 (`origin` 직접 설정)** +- `git init`으로 생성한 로컬 저장소에 원격 저장소를 추가하려면 다음과 같이 설정합니다. + +#### **🛠 원격 저장소 추가하기** +```bash +git remote add origin https://github.com/user/repository.git +``` +- 이제 `git push origin main` 등의 명령어를 사용할 수 있습니다. +- `git remote -v`로 `origin`이 정상적으로 추가되었는지 확인할 수 있습니다. + +#### **🛠 원격 저장소 변경하기** +```bash +git remote set-url origin https://github.com/newuser/newrepository.git +``` + +#### **🛠 원격 저장소 삭제** +```bash +git remote remove origin +``` + +--- + +## **4. 실전 예제: `git init` + 원격 저장소 연결** +1️⃣ **새 프로젝트를 생성하고 Git을 초기화** +```bash +mkdir new_project +cd new_project +git init +``` + +2️⃣ **파일 추가 및 첫 커밋** +```bash +echo "# New Project" > README.md +git add . +git commit -m "Initial commit" +``` + +3️⃣ **GitHub 원격 저장소 추가 (`origin` 설정)** +```bash +git remote add origin https://github.com/user/new_project.git +``` + +4️⃣ **로컬 커밋을 원격 저장소에 푸시** +```bash +git push -u origin main +``` + +--- + +## **5. 정리** +| 명령어 | 설명 | +|--------|------------| +| `git clone ` | 원격 저장소를 로컬에 복제 (자동으로 `origin` 설정) | +| `git init` | 새로운 로컬 저장소 생성 (원격 저장소 미연결) | +| `git remote add origin ` | 원격 저장소를 `origin`으로 추가 | +| `git remote -v` | 현재 설정된 원격 저장소 확인 | +| `git remote set-url origin ` | `origin`의 URL 변경 | +| `git remote remove origin` | 원격 저장소 `origin` 삭제 | + +**🚀 `git clone`은 기존 원격 저장소를 복제할 때, `git init`은 새로운 프로젝트를 Git으로 관리할 때 사용됩니다.** +추가 질문이 있다면 알려주세요! 😊 + + + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. + +## **Git `reset`의 3가지 타입: `soft`, `mixed`, `hard`** + +Git의 `reset` 명령어는 특정 커밋으로 되돌아갈 때 사용됩니다. +이때 **되돌아가는 방식**에 따라 **`--soft`, `--mixed`, `--hard`** 세 가지 옵션이 있습니다. + +--- + +## **1. `git reset --soft`** +- **HEAD만 이동**, Staging Area(= Index)와 Working Directory는 그대로 유지 +- 되돌아간 커밋 이후의 변경 사항이 **Staging Area에 남아 있음** +- `git commit --amend` 또는 추가적인 수정 후 다시 커밋할 때 유용 + +### **🛠 사용 예시** +```bash +git reset --soft HEAD~1 +``` +- 마지막 커밋을 되돌리지만, 변경된 파일들은 여전히 **Staging Area**에 있음 +- 다시 `git commit`을 하면 기존 커밋을 수정할 수 있음 + +--- + +## **2. `git reset --mixed` (기본값)** +- **HEAD와 Staging Area(Index)만 이동**, Working Directory는 유지 +- 즉, 되돌아간 커밋 이후의 변경 사항이 **Unstaged 상태(Working Directory)로 이동** +- 기본 옵션이므로 `--mixed`를 생략하면 자동으로 적용됨 +- 수정한 내용을 다시 Staging하고 싶다면 `git add .`를 실행해야 함 + +### **🛠 사용 예시** +```bash +git reset --mixed HEAD~1 +``` +- 마지막 커밋을 되돌리지만, 변경된 파일들은 **Staging Area에서 빠지고(unstaged)**, **Working Directory에는 남아 있음** + +--- + +## **3. `git reset --hard`** +- **HEAD, Staging Area(Index), Working Directory 모두 되돌림** +- 되돌아간 커밋 이후의 변경 사항이 **완전히 삭제됨** (복구 불가!) +- 정말 되돌리고 싶은 경우에만 신중하게 사용 + +### **🛠 사용 예시** +```bash +git reset --hard HEAD~1 +``` +- 마지막 커밋을 완전히 삭제하고, 변경 사항도 모두 사라짐 +- 복구가 불가능하므로 **사용에 주의해야 함!** + +--- + +## **📌 `reset` 3가지 옵션 비교** + +| 옵션 | HEAD 이동 | Staging Area 영향 | Working Directory 영향 | 되돌린 후 변경 사항 | +|------|-----------|------------------|----------------------|----------------| +| `--soft` | ✅ 이동 | ❌ 유지 | ❌ 유지 | **Staged 상태 유지 (commit만 취소됨)** | +| `--mixed` | ✅ 이동 | ✅ 초기화 | ❌ 유지 | **Unstaged 상태로 이동** | +| `--hard` | ✅ 이동 | ✅ 초기화 | ✅ 초기화 | **모든 변경 사항 삭제 (복구 불가)** | + +--- + +## **🎯 실전 예제: `reset`을 활용한 커밋 취소** +```bash +git reset --soft HEAD~1 # 마지막 커밋 취소 (Staged 상태 유지) +git reset --mixed HEAD~1 # 마지막 커밋 취소 (Unstaged 상태로 이동) +git reset --hard HEAD~1 # 마지막 커밋 및 변경 사항 완전히 삭제 +``` + +--- + +## **🔹 추가 정보: `reset` 사용 시 주의할 점** +1. **`--hard` 옵션은 되돌릴 수 없으므로 신중하게 사용해야 합니다!** + - 실수로 실행했을 경우, `git reflog`를 통해 이전 상태를 확인하고 복구할 수 있음 + +2. **공유된 원격 저장소에서는 `reset` 대신 `revert` 사용을 고려** + - `reset`은 과거 커밋을 변경하기 때문에 협업 시 충돌이 발생할 가능성이 있음 + - `git revert`를 사용하면 **이전 커밋을 되돌리는 새 커밋을 생성**하여 이력을 유지할 수 있음 + +--- + +## **🔹 `git reset`과 `git revert` 차이점** +| 명령어 | 원격 저장소에서 사용 가능? | 기존 커밋 유지 여부 | 사용 목적 | +|--------|--------------------|--------------|------------| +| `git reset` | ❌ (공유된 브랜치에서는 사용 지양) | ❌ (커밋 삭제됨) | 특정 커밋 이후 변경 사항 제거 | +| `git revert` | ✅ (안전하게 사용 가능) | ✅ (이력을 유지하며 취소) | 특정 커밋을 취소하는 새로운 커밋 생성 | + +--- + +### **🚀 결론** +- `git reset --soft` → **최근 커밋을 취소하고, Staging Area 유지** +- `git reset --mixed` → **최근 커밋을 취소하고, 변경 사항을 Unstaged 상태로 이동** +- `git reset --hard` → **모든 변경 사항을 완전히 삭제 (주의!)** + +🔥 **원격 저장소와 협업할 때는 `reset`보다 `revert`를 고려하세요!** +추가 질문이 있다면 알려주세요 😊 + + + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. + +# **Pull Request와 Merge** + +## **1. Pull Request(PR)란?** +- Pull Request(이하 PR)는 **GitHub, GitLab, Bitbucket 등에서 코드 변경 사항을 병합하기 전 리뷰를 요청하는 기능** +- `feature` 브랜치에서 작업한 내용을 `main` 또는 `develop` 브랜치로 합칠 때 사용 +- PR을 통해 팀원들이 변경 사항을 검토하고, 코드 리뷰 후 승인되면 병합(Merge) + +### **🔹 Pull Request 과정** +1. `feature-branch`에서 새로운 기능을 개발 +2. 원격 저장소(Remote Repo)로 `git push` +3. GitHub(GitLab 등)에서 `main` 브랜치로 PR 생성 +4. 팀원들이 코드 리뷰 후 승인 (필요하면 수정) +5. PR을 `Merge`하여 변경 사항을 반영 + +--- + +## **2. Merge란?** +- Git에서 **두 개 이상의 브랜치를 하나로 합치는 과정** +- PR이 승인되면 `merge`를 수행하여 `feature` 브랜치의 변경 사항을 `main` 브랜치에 반영 +- Merge는 방식에 따라 **Fast-Forward Merge**와 **3-Way Merge**로 나뉨 + +--- + +## **3. Merge의 두 가지 타입** + +### **🔹 (1) Fast-Forward Merge** +- 새로운 브랜치에서 작업한 후, `main` 브랜치에 다른 변경 사항이 없는 경우 +- 브랜치의 HEAD가 단순히 앞으로 이동하는 방식 +- 커밋 그래프가 직선 형태로 유지됨 + +### **🛠 Fast-Forward Merge 예제** +```bash +# feature 브랜치 생성 후 작업 +git checkout -b feature-branch +# 작업 후 커밋 +git add . +git commit -m "Add new feature" +# main 브랜치로 체크아웃 +git checkout main +# Fast-Forward Merge 실행 +git merge feature-branch +``` + +### **✅ Fast-Forward Merge의 특징** +- **장점**: 커밋 기록이 깔끔하고 단순 +- **단점**: 브랜치가 독립적으로 존재하지 않으므로, 이력이 명확하지 않을 수 있음 + +--- + +### **🔹 (2) 3-Way Merge** +- `main` 브랜치가 변경된 후, `feature` 브랜치를 Merge하려고 하면 Fast-Forward가 불가능 +- Git이 **공통 조상(Common Ancestor) 커밋을 기준으로 세 개의 커밋을 비교하여 병합** +- 새로운 병합 커밋(Merge Commit)이 생성됨 + +### **🛠 3-Way Merge 예제** +```bash +# main 브랜치에서 변경 사항이 생김 +git checkout main +git pull origin main +# feature 브랜치에서 작업 후 main으로 병합 +git checkout feature-branch +git merge main +# main 브랜치로 돌아가서 병합 수행 +git checkout main +git merge feature-branch +``` + +### **✅ 3-Way Merge의 특징** +- **장점**: Merge 커밋이 남아 있어 변경 이력을 명확하게 확인 가능 +- **단점**: 불필요한 Merge Commit이 많아질 수 있음 + +--- + +## **4. Merge vs. Rebase** +- `git rebase`는 **브랜치를 병합하는 또 다른 방식** +- 기존 커밋을 재배열하여 깔끔한 히스토리를 유지 +- Merge와 비교하면 `git rebase`는 **브랜치 커밋을 새롭게 쌓는 방식**, Merge는 **Merge Commit을 생성** + +### **🛠 Rebase 예제** +```bash +git checkout feature-branch +git rebase main +``` + +### **✅ Merge vs. Rebase 비교** +| 방식 | 히스토리 유지 | 새로운 Merge Commit 생성 | 협업 추천 여부 | +|------|------------|-----------------|------------| +| `merge` | O | O (3-Way Merge) / X (Fast-Forward) | O | +| `rebase` | X (커밋이 새롭게 정렬됨) | X | X (협업 시 주의 필요) | + +--- + +## **🎯 결론** +1. **PR(Pull Request)**는 협업에서 변경 사항을 병합하기 전에 코드 리뷰를 거치는 과정 +2. **Merge**는 브랜치를 하나로 합치는 과정이며, **Fast-Forward Merge**와 **3-Way Merge**가 있음 +3. **Fast-Forward Merge**는 브랜치 HEAD가 단순 이동하는 방식으로 **히스토리가 깔끔** +4. **3-Way Merge**는 공통 조상을 기준으로 **Merge Commit이 생성**되며, **히스토리 보존** +5. **Rebase**는 커밋을 다시 정렬하여 히스토리를 깔끔하게 하지만 협업 시 주의 필요 + +🔹 **협업 시에는 PR을 활용하여 코드 리뷰 후 Merge하는 것이 베스트!** +추가 질문이 있다면 알려주세요 😊 + + + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. + +# **Rebase란?** + +## **1. Rebase란 무엇인가?** +`git rebase`는 브랜치의 기반(Base) 커밋을 변경하여 **커밋 히스토리를 다시 정렬하는 Git 명령어**입니다. +즉, 특정 브랜치에서의 변경 사항을 다른 브랜치의 최신 커밋 위에 다시 적용하는 방식입니다. + +**💡 간단히 말하면?** +👉 **"현재 브랜치가 마치 최신 브랜치에서 시작된 것처럼 보이게 만든다!"** + +--- + +## **2. Rebase의 동작 방식** + +### **🔹 Rebase 전 (기존 구조)** +```bash +A---B---C (main) + \ + D---E---F (feature) +``` +- `feature` 브랜치는 `main`에서 분기되어 독립적으로 진행됨 + +### **🔹 Rebase 후 (main 브랜치 기준으로 재배치)** +```bash +A---B---C (main) + \ + D'--E'--F' (feature) +``` +- `feature` 브랜치의 모든 커밋(D, E, F)이 `main`의 최신 커밋(C) 위로 다시 적용됨 +- 즉, **D, E, F 커밋이 새롭게 만들어진 것처럼 보이게 됨** + +--- + +## **3. Rebase 사용 방법** + +### **(1) 기본적인 Rebase 명령어** +```bash +git checkout feature +git rebase main +``` +- `feature` 브랜치를 `main` 브랜치의 최신 상태로 재배열 +- `feature` 브랜치에서의 변경 사항이 `main`의 최신 커밋 뒤에 다시 적용됨 + +### **(2) Rebase 충돌 해결 방법** +- Rebase 도중 충돌이 발생하면 Git이 경고 메시지를 표시하고 Rebase가 중단됨 +- 충돌을 해결한 후 다음 명령어를 실행하면 Rebase가 계속 진행됨 +```bash +git add . +git rebase --continue +``` +- 만약 Rebase를 취소하고 싶다면? +```bash +git rebase --abort +``` + +--- + +## **4. Rebase가 유용한 경우** + +### ✅ **1) 히스토리를 깔끔하게 유지하고 싶을 때** +- `git merge`를 사용하면 **Merge Commit**이 남게 되어 불필요한 커밋이 많아질 수 있음 +- `git rebase`는 **브랜치를 직선 형태로 정리**하여 **히스토리를 단순하고 깔끔하게 유지** + +### ✅ **2) 여러 개발자가 협업하는 프로젝트에서 최신 변경 사항을 반영하고 싶을 때** +- `main` 브랜치에서 새로운 변경 사항이 생겼다면, `feature` 브랜치를 최신 상태로 업데이트 +- `git pull --rebase`를 사용하면, 최신 변경 사항을 적용하면서 불필요한 Merge Commit 없이 유지 가능 + +```bash +git pull --rebase origin main +``` + +### ✅ **3) Feature 브랜치를 최신 상태로 유지하고 싶을 때** +- 여러 명이 공동 작업하는 경우, `git merge main`을 수행하면 불필요한 Merge Commit이 생성됨 +- `git rebase main`을 하면 `main` 브랜치의 최신 변경 사항을 반영하면서도 **커밋 히스토리를 깨끗하게 유지** + +--- + +## **5. Merge vs. Rebase 차이점** + +| 비교 항목 | Merge | Rebase | +|-----------|---------|---------| +| **커밋 히스토리** | Merge Commit이 생성됨 | 직선형 히스토리를 유지 | +| **사용 목적** | 협업 시 변경 사항을 명확히 남길 때 | 히스토리를 깔끔하게 정리할 때 | +| **충돌 처리** | Merge 시점에 한 번에 처리 | 각 커밋마다 개별적으로 충돌 해결 필요 | +| **커밋 순서 유지** | 유지됨 | 변경될 수 있음 | + +--- + +## **6. Rebase 사용 시 주의할 점** + +⚠ **🚨 이미 Push한 커밋을 Rebase하지 말 것! 🚨** +- **Rebase는 커밋을 새롭게 생성하는 것과 동일**하므로, 이미 원격 저장소(Remote Repository)에 Push한 후에 Rebase하면 문제가 발생할 수 있음 +- 다른 사람이 같은 브랜치를 사용 중이라면 **충돌 위험**이 있음 +- **해결 방법:** `git push --force`를 사용할 수 있지만, 이는 협업 프로젝트에서는 권장되지 않음 + +```bash +git push --force # 강제로 Push (주의!) +``` + +### **🔹 안전한 Rebase 사용 방법** +- `git rebase`는 **로컬에서 작업 중인 브랜치**에서만 사용 +- 이미 원격에 Push한 경우에는 `merge`를 사용하는 것이 더 안전함 + +--- + +## **🎯 결론: 언제 Rebase를 사용할까?** + +✅ **Rebase를 사용하면 좋은 경우** +- 커밋 히스토리를 깨끗하게 정리하고 싶을 때 +- 개인 작업을 정리하여 `main`에 반영하기 전에 깔끔한 히스토리 유지 +- `main` 브랜치의 최신 상태를 `feature` 브랜치에 반영할 때 + +❌ **Rebase를 피해야 하는 경우** +- 원격 저장소에 Push한 후 다른 사람이 같은 브랜치를 사용할 가능성이 있을 때 +- 협업 중인 브랜치에서 Rebase 후 `--force push`를 해야 하는 상황 + +--- + +## **📌 요약** +1. `git rebase`는 브랜치의 기반(Base) 커밋을 변경하여 **커밋 히스토리를 깔끔하게 유지**하는 Git 명령어 +2. `git merge`와 달리 **불필요한 Merge Commit 없이 직선형 히스토리를 유지** +3. `git pull --rebase`를 사용하면 최신 변경 사항을 반영하면서도 히스토리를 깨끗하게 유지 가능 +4. 하지만, **이미 Push된 커밋을 Rebase하면 충돌 위험이 커지므로 주의해야 함** +5. 협업 중이라면 `merge`를, 개인 브랜치 정리에는 `rebase`를 추천! + +💡 **협업 시에는 Merge, 개인 브랜치 정리에는 Rebase를 활용하면 최적의 Git 관리 가능!** 🚀 + + + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. + +# **Git Stash 활용 방법** + +## **1. Git Stash란?** +`git stash`는 **현재 작업 중인 변경 사항을 임시로 저장**하고, 작업 디렉터리를 깨끗한 상태로 만들 수 있는 Git 명령어입니다. +즉, **작업을 중단하고 다른 브랜치로 전환해야 할 때 유용하게 사용**됩니다. + +💡 **한마디로?** +👉 **"현재 작업 내용을 임시 저장해 두고, 나중에 다시 복구하는 기능!"** + +--- + +## **2. Git Stash 기본 사용법** + +### **🔹 Stash 저장하기** +```bash +git stash +``` +- **현재 변경된 파일과 Staging Area의 변경 사항을 모두 저장** +- 저장 후에는 `git status`를 확인하면, **작업 디렉터리가 깨끗한 상태**가 됨 + +💡 **Stash 저장과 동시에 메시지 추가하기** +```bash +git stash save "임시 저장 메시지" +``` +- 여러 개의 Stash를 저장할 경우 구분하기 쉽게 메시지를 추가할 수 있음 + +--- + +## **3. Stash 목록 확인 및 복원** + +### **🔹 Stash 목록 확인** +```bash +git stash list +``` +- 현재 저장된 Stash 목록을 확인 가능 +- 예제 출력: + ``` + stash@{0}: WIP on feature-branch: 123abc 작업 내용1 + stash@{1}: WIP on main: 456def 작업 내용2 + ``` +- `stash@{0}`이 가장 최근에 저장된 Stash + +### **🔹 Stash 적용 (복원하기)** +```bash +git stash apply +``` +- 가장 최근에 저장된 Stash를 적용하지만, **Stash는 삭제되지 않음** +- 만약 특정 Stash를 적용하려면? + ```bash + git stash apply stash@{1} + ``` + +### **🔹 Stash 적용 후 삭제까지 하기 (pop)** +```bash +git stash pop +``` +- Stash를 적용한 후, **적용된 Stash는 자동으로 삭제됨** + +--- + +## **4. 특정 Stash 삭제 및 전체 삭제** + +### **🔹 특정 Stash 삭제** +```bash +git stash drop stash@{0} +``` +- `stash@{0}` Stash만 삭제 + +### **🔹 모든 Stash 삭제** +```bash +git stash clear +``` +- **모든 Stash를 한 번에 삭제** + +--- + +## **5. Stash에 특정 파일만 저장하기** + +### **🔹 Untracked 파일 제외하고 Stash 저장** +```bash +git stash -u +``` +- **Tracked 파일만 저장 (Untracked 파일은 제외)** + +### **🔹 Untracked & Ignored 파일까지 Stash 저장** +```bash +git stash -a +``` +- **모든 파일(Untracked, Ignored 포함)을 Stash에 저장** + +--- + +## **6. Stash를 활용하는 실전 시나리오** + +### ✅ **1) 작업 도중 급하게 다른 브랜치로 이동해야 할 때** +```bash +git stash +git checkout main +git pull origin main +git checkout feature-branch +git stash pop +``` +- 변경 사항을 임시로 저장 후, `main` 브랜치 업데이트 후 다시 원래 브랜치에서 작업 재개 + +### ✅ **2) 여러 개의 Stash를 관리하며 특정 시점의 변경 사항 적용** +```bash +git stash list +git stash apply stash@{2} +``` +- 특정 Stash(`stash@{2}`)만 적용 가능 + +### ✅ **3) 특정 파일만 Stash에서 복구하고 싶을 때** +```bash +git checkout stash@{0} -- file.txt +``` +- `stash@{0}`에서 `file.txt`만 복구 + +--- + +## **7. Git Stash vs. Git Commit 비교** + +| 기능 | Git Stash | Git Commit | +|------|----------|------------| +| 목적 | 임시 저장 | 영구 저장 | +| 적용 대상 | 현재 작업 디렉터리 변경 사항 | 모든 변경 사항 | +| 히스토리 유지 | 유지되지 않음 (stash list에서만 조회 가능) | 유지됨 (Git Log에서 조회 가능) | +| 브랜치 전환 가능 여부 | 가능 | 불가능 (Commit 후에만 가능) | +| 삭제 가능 여부 | 가능 (`git stash drop`, `git stash clear`) | 가능 (`git reset`, `git revert`) | + +💡 **Stash는 임시 저장 용도로만 사용하고, 장기적인 변경 사항은 Commit을 활용하는 것이 좋음!** + +--- + +## **🎯 결론: 언제 Git Stash를 사용할까?** + +✅ **Git Stash를 사용하면 좋은 경우** +- **작업 중인데 급하게 브랜치를 변경해야 할 때** +- **Commit하기 애매한 작업 내용을 임시로 저장하고 싶을 때** +- **다른 작업을 먼저 해야 할 때 현재 진행 중인 변경 사항을 임시로 보관** +- **Untracked 파일까지 포함해 임시 저장하고 싶을 때 (`git stash -u` or `git stash -a`)** + +❌ **Git Stash를 피해야 하는 경우** +- 장기적으로 변경 사항을 저장하려면 **Commit을 사용하는 것이 더 적절함** +- 협업 중이라면 Stash보다는 **Branch를 활용하여 명확한 기록을 남기는 것이 좋음** + +--- + +## **📌 요약** +1. `git stash`는 **작업 중인 변경 사항을 임시로 저장하고, 나중에 다시 불러올 수 있는 Git 명령어** +2. `git stash list`로 Stash 목록을 확인하고, `git stash apply` 또는 `git stash pop`으로 복원 가능 +3. `git stash drop stash@{n}`으로 특정 Stash 삭제, `git stash clear`로 모든 Stash 삭제 가능 +4. `git stash -u`는 Untracked 파일 포함, `git stash -a`는 Ignored 파일까지 포함 가능 +5. Stash는 **임시 저장 용도로만 사용**하고, 변경 사항을 확정할 때는 Commit을 활용하는 것이 좋음 + +🚀 **Git Stash를 적절히 활용하면, 작업 흐름을 유지하면서도 유연하게 브랜치를 전환할 수 있음!** + + + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- 브랜치관리전략에 대표적으로 Github Flow, Git Flow가 있습니다. 두 방식에서는 리포지토리를 어떻게 관리할까요? +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +좋은 주제들이네요! 각각의 개념을 깊이 있게 이해하면 Git을 보다 효과적으로 활용할 수 있습니다. 간략한 설명과 함께 더 깊이 조사할 수 있는 방향을 제시해볼게요. + +--- + +### **1. 브랜치 관리 전략: Github Flow vs. Git Flow** +- **Github Flow** + - `main` 브랜치에서 직접 feature 브랜치를 만들고 작업 후 PR을 통해 머지하는 방식 + - 단순한 워크플로우, CI/CD와의 연계가 쉬움 + - 작은 프로젝트, 빠른 배포가 필요한 경우 적합 + +- **Git Flow** + - `develop`, `feature`, `release`, `hotfix` 등의 여러 브랜치를 활용하는 방식 + - 배포 주기가 긴 프로젝트나 팀 단위 협업에서 적합 + - 브랜치 간 머지 전략이 중요 + +📌 **조사 포인트:** +- Github Flow에서는 `main` 브랜치에서 직접 배포하는데, Git Flow에서는 왜 `develop` 브랜치가 필요한가? +- 두 방식이 충돌하는 경우 어떻게 해결할까? + +--- + +### **2. `git rebase --interactive`란?** +- `git rebase -i HEAD~n`을 사용하면 최근 `n`개의 커밋을 수정, 병합, 삭제할 수 있음 +- `pick`, `squash`, `reword`, `edit`, `drop` 등의 옵션을 활용 가능 + +📌 **조사 포인트:** +- `squash`와 `fixup`의 차이 +- `edit`을 활용해 특정 커밋만 수정하는 방법 + +--- + +### **3. 브랜치의 upstream이란? (`git push --set-upstream`)** +- `git push --set-upstream origin feature-branch`를 실행하면 로컬 브랜치와 원격 브랜치를 연결 +- 이후 `git push`나 `git pull`을 별도의 옵션 없이 사용 가능 + +📌 **조사 포인트:** +- `upstream`을 변경하려면? (`git branch --unset-upstream` 활용) +- `git pull --rebase`와 함께 사용하면 어떤 이점이 있을까? + +--- + +### **4. Fork는 언제 유용한가?** +- `PR`은 같은 리포지토리의 브랜치뿐만 아니라 **Fork한 리포지토리**에서도 가능 +- **Fork가 유용한 경우:** + - 원본 프로젝트를 유지하면서 개인적으로 기능을 추가하고 싶을 때 + - 오픈소스 프로젝트에 기여할 때 + +📌 **조사 포인트:** +- Fork 후 원본 리포지토리(`upstream`)의 변경 사항을 동기화하는 방법 (`git remote add upstream`) +- PR을 보낼 때 내 브랜치와 원본 브랜치의 충돌을 해결하는 방법 + +--- + +### **5. `git fetch`와 `git pull`의 차이점** +- `git fetch`: 원격 저장소의 변경 사항을 가져오지만 **로컬 브랜치에는 반영하지 않음** +- `git pull`: `fetch + merge` (로컬 브랜치에 직접 반영됨) + +📌 **조사 포인트:** +- `git fetch --prune` 옵션을 활용하면 어떤 장점이 있을까? +- `git fetch`를 사용한 후 `git diff origin/main`으로 변경 사항을 확인하는 방법 + +--- + +### **6. `reset --hard`와 `push --force`의 적절한 사용법** +- `git reset --hard HEAD~1`: 가장 최근의 커밋을 삭제하고 변경 사항도 함께 제거 +- `git push --force`: 원격 저장소의 히스토리를 강제로 덮어씀 + +📌 **조사 포인트:** +- `--force-with-lease` 옵션은 어떻게 동작하는가? +- 협업 중에 `push --force`를 사용할 경우 생길 수 있는 문제 + +--- + +### **7. `.gitignore` 사용법** +- 특정 파일을 Git에 추가하지 않도록 설정하는 파일 +- 패턴 예제: + ``` + *.log # 모든 .log 파일 무시 + /node_modules/ # 특정 폴더 무시 + !important.log # 예외적으로 추가할 파일 지정 + ``` + +📌 **조사 포인트:** +- `.gitignore`을 프로젝트 초반에 설정하지 않고 후에 적용하면 어떻게 될까? +- `.gitignore`을 잘못 설정해서 커밋된 파일을 제거하려면? (`git rm --cached`) + +--- + +### **8. 브랜치 이름의 계층적 구조** +- 브랜치 이름에 `/`를 포함하면 계층 구조처럼 보이지만, 실제 Git은 폴더 개념이 아님 +- `parent/child/grandchild`와 `parent/child`를 동시에 가질 수 없는 이유: + - `parent/child`가 하나의 브랜치라면 `parent/child/grandchild`는 독립적인 브랜치로 인식되지 않음 + +📌 **조사 포인트:** +- Git의 브랜치 네이밍 규칙과 `refs/heads/` 내부 구조 +- Git에서 브랜치 삭제 시 주의할 점 + +--- + +### **9. Detached HEAD란?** +- 특정 커밋을 체크아웃하면 HEAD가 브랜치가 아닌 특정 커밋을 가리키는 상태 +- Detached HEAD 상태에서 커밋을 하면 임시 브랜치가 생기지만, 브랜치를 생성하지 않으면 커밋이 사라짐 + +📌 **조사 포인트:** +- Detached HEAD에서 만든 커밋을 유지하는 방법 (`git checkout -b new-branch`) +- `git switch -`를 활용한 빠른 브랜치 이동 + +--- + +이 주제들에 대해 직접 실습해보거나 공식 문서를 찾아보면서 학습하면 Git을 훨씬 더 깊이 이해할 수 있을 거예요! 🚀 + + + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From cd1b51db1b649b1e6b775301711cdcd2fab52764 Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Sat, 22 Mar 2025 16:03:55 +0900 Subject: [PATCH 66/73] =?UTF-8?q?<=EC=BB=A4=EB=B0=8B=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80>=20(#133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 새로 구현한 기능 및 주요 변경점 # 버그 해결 💊 해결한 버그 # 리팩토링 🛠 리팩토링 내역 # 스크린샷 🖼 변경된 부분에 대한 스크린샷 # 비고 ✏ 리뷰어에게 전하는 말 등
    사용하지 않은 항목은 모두 지워주세요. Co-authored-by: sssssoyoung --- git-basics/22nd/README-soyoung.md | 58 +++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 git-basics/22nd/README-soyoung.md diff --git a/git-basics/22nd/README-soyoung.md b/git-basics/22nd/README-soyoung.md new file mode 100644 index 0000000..67ff3e7 --- /dev/null +++ b/git-basics/22nd/README-soyoung.md @@ -0,0 +1,58 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- 브랜치관리전략에 대표적으로 Github Flow, Git Flow가 있습니다. 두 방식에서는 리포지토리를 어떻게 관리할까요? +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From 2789a18dd2297a0c041dad7203065a546fd012d6 Mon Sep 17 00:00:00 2001 From: Giyun Kim Date: Sat, 22 Mar 2025 16:04:27 +0900 Subject: [PATCH 67/73] =?UTF-8?q?git=5Freadme=EC=9E=91=EC=84=B1=20(#134)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 새로 구현한 기능 및 주요 변경점 # 버그 해결 💊 해결한 버그 # 리팩토링 🛠 리팩토링 내역 # 스크린샷 🖼 변경된 부분에 대한 스크린샷 # 비고 ✏ 리뷰어에게 전하는 말 등
    사용하지 않은 항목은 모두 지워주세요. Co-authored-by: sinsehwan --- git-basics/22nd/README-sinsehwan.md | 137 ++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 git-basics/22nd/README-sinsehwan.md diff --git a/git-basics/22nd/README-sinsehwan.md b/git-basics/22nd/README-sinsehwan.md new file mode 100644 index 0000000..50c83ac --- /dev/null +++ b/git-basics/22nd/README-sinsehwan.md @@ -0,0 +1,137 @@ +# Git 기초 + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) + +Git은 분산형 버전 관리 시스템. 로컬에서 코드의 변경 사항을 추적하기 위해 사용하는 도구이다. + +GitHub는 Git을 기반으로 한 원격 저장소 호스팅 서비스이다. + +Local : 사용자 컴퓨터에서 동작하는 Git저장소 +Remote : GitHub, GitLab, Bitbuchet과 같은 원격 저장소. + +로컬에서의 Git 저장소롤 원격 저장소에 push해서 공유하는 형태. + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. + +### Working Directory +소스 코드가 실제로 존재하는 작업 공간 + +### Git Add +git add를 사용하면 변경된 파일을 Staging Area로 올린다. + +### Staging Area +커밋 전 변경 사항을 저장하는 공간. + +### Git Commit +git commit -m ""형식. 변경 사항을 로컬 저장소에 저장한다. + +### Git Push +git push origin <브랜치> 형식. 로컬에서 커밋된 변경 사항을 원격 저장소에 업로드한다. + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +### Branch +독립적인 작업 공간. + +### HEAD +현재 작업 중인 브랜치를 가리키는 포인터 + +### 관련 명령어 +git branch <> : 새 브랜치 생성 +git checkout <> : 브랜치 변경 +git switch <> : 브랜치 변경 +git branch -d <> : 브랜치 삭제 +git merge <> : 현재 브랜치에 지정된 브랜치 병합 + +## clone, init, origin +1. git clone +원격 저장소를 복제해서 로컬 저장소를 생성한다. + +2. git init +새로운 Git 저장소를 로컬에서 초기화한다. + +3. origin +Git에서 원격 저장소의 기본 이름. git remove add origin 명령어로 설정 가능. + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +1. git reset --soft +HEAD를 이전 커밋으로 이동하지만, 변경 사항은 Staging Area에 남긴다. + +2. git reset --mixed +HEAD를 이전 커밋으로 이동하고 Staging Area를 초기화하지만, Working Directory에는 변경 사항이 남는다. + +3. git reset --hard +HEAD를 이전 커밋으로 이동하고, Staging Area와 Working Directory 모두 초기화한다. + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +1. Pull Request(PR) +협업할 때 다른 브랜치의 변경 사항을 병합하기 전에 검토 요청 + +2. Merge +(1) Fast-Forward Merge +변경 사항이 직선적인 경우 빠르게 병합된다. + +(2) 3-Way Merge +서로 다른 브랜치의 변경 사항을 병합할 때 공통 조상을 고려해서 새로운 커밋을 생성한다. + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +브랜치를 다른 브랜치의 최신 상태로 업데이트 하는 방법이다. +git rebase <브랜치> 형식. +커밋 히스토리를 깔끔하게 유지할 때 유용하다. + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 사용하면 현재 작업 내용을 임시로 저장하고 나중에 복원할 수 있다. + +git stash save "메시지" : 변경사항 임시 저장 +git stash list : 저장된 stash 목록 확인 +git stash apply : 마지막 stash 복원 +git stash drop : stash 삭제 + +## Advanced +- GitHub Flow : 메인 브랜치에서 작업 후 바로 배포 +- Git Flow : feature, develop, release 브랜치를 활용해서 관리 + +- `git rebase --interactive`란? +커밋을 합치거나 수정하는 데 사용 + +- branch의 upstream이란? (`git push --set-upstream origin <브랜치>`) +기본 원격 브랜치를 설정한다. + +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +다른 사용자의 저장소 복제해서 독립적으로 개발할 때 사용. + +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +git fetch : 원격 저장소의 변경 사항을 가져오기만 하고 병합하지 않는다. +git pull : 원격 저장소의 변경 사항을 가져오고 자동 병합. + +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +제외시킬 파일 지정 + +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +Git에서 브랜치 자체를 디렉토리로 관리하기 때문이다. + +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 +브랜치 없이 특정 커밋을 Checkout한 상태. 이 상태에서 커밋하면 브랜치 없어서 사라질 수 있음. 이런게 왜 생기는거지 + +git log --oneline --graph --decorate --all +커밋 로그 확인 + +## Questions +1. git reset --soft +HEAD를 이전 커밋으로 이동하지만, 변경 사항은 Staging Area에 남긴다. + +2. git reset --mixed +HEAD를 이전 커밋으로 이동하고 Staging Area를 초기화하지만, Working Directory에는 변경 사항이 남는다. +이 둘의 차이가 체감이 잘 안됩니다. + +3. detached HEAD 발생상황 + +4. fetch에서 변경사항은 가져오는데 병합하지 않는다는게 잘 이해 안됨. \ No newline at end of file From 533f755a82e60379c12bcedb05c0f044c15439e0 Mon Sep 17 00:00:00 2001 From: Wonseok Date: Tue, 30 Sep 2025 13:56:51 +0900 Subject: [PATCH 68/73] =?UTF-8?q?fix:=20=EB=88=84=EA=B5=B0=EA=B0=80=20?= =?UTF-8?q?=EB=8D=A7=EC=94=8C=EC=9A=B4=20=EC=A1=B0=EC=82=AC=EB=82=B4?= =?UTF-8?q?=EC=97=AD=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- git-basics/README.md | 44 +------------------------------------------- 1 file changed, 1 insertion(+), 43 deletions(-) diff --git a/git-basics/README.md b/git-basics/README.md index ee2bfc4..ff07a0d 100644 --- a/git-basics/README.md +++ b/git-basics/README.md @@ -6,8 +6,6 @@ Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 git과 github는 같은 의미가 아닙니다. local, remote와 연관지어 적어주세요. -깃과 깃허브의 가장 큰 차이점은 깃이 소프트웨어이며, 깃허브가 서비스라는 점입니다. 깃은 개발자의 로컬(local) 컴퓨터에서 동작하며, 소스 코드의 버전 관리를 담당합니다. 반면, 깃허브는 깃 리포지토리를 호스팅하는 웹 서비스(remote)로, 프로젝트 협업을 위한 다양한 도구를 제공합니다. --> GitHub는 Git 저장소를 호스팅하는 원격(remote) 저장소 서비스이다. ## Git Workflow ![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) @@ -15,13 +13,6 @@ local, remote와 연관지어 적어주세요. Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. Git Merge, Git Fetch는 생략해도 됩니다. -- Working Directory : 사용자가 작업하는 로컬 파일들이 위치한 영역으로 업로드 전의 작업한 파일입니다. -- Git Add : Working Directory에서 변경된 파일을 Staging Area로 추가하여 커밋 대상으로 만듭니다. -- Git Commit : Staging Area의 변경 사항을 코멘트와 함께 로컬 저장소(Local Repository)에 기록합니다. -- Git Push : 로컬 저장소에서 원격 저장소(GitHub)로 변경 사항을 업로드합니다. -- Git Fetch : 원격 저장소의 최신 변경 사항을 로컬로 가져오지만, 자동으로 병합하지는 않습니다. -- Git Merge : 다른 브랜치의 변경 사항을 현재 브랜치에 합칩니다.(수정사항을 적용하거나 기능을 업데이트 하는 과정) -- Git Pull : 원격 저장소의 변경 사항을 가져와 로컬 저장소와 자동으로 병합(Merge)합니다. ## Branch, HEAD ![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) @@ -29,67 +20,34 @@ git이 동작하는 기본 단위는 commit과 branch입니다. branch와 HEAD, git checkout을 포함하여 작성 바랍니다. branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. -- Commit: 변경 사항을 기록하는 Git의 기본 단위로 각 commit은 고유한 해시값을 가집니다. -- Branch: 독립적으로 개발을 진행할 수 있는 작업 공간으로, 여러 브랜치를 만들어 병렬 작업이 가능합니다. 보통 기본 작업 파일을 살려두고 나머지 기능이나 수정사항을 점검한 후 적용하기 위해 사용합니다. -- HEAD: 현재 체크아웃(작업 중)된 브랜치를 가리키는 포인터로, HEAD가 가리키는 브랜치가 변경됩니다. (HEAD = 현재 작업중인 branch) -- git checkout [브랜치명]: 특정 브랜치로 이동하거나, 특정 커밋을 체크아웃할 때 사용합니다. -- git switch -c [새로운 브랜치명]: 새 브랜치를 생성하고 해당 브랜치로 이동합니다. -- git branch [새로운 브랜치명]: 새로운 브랜치를 생성하지만, 현재 브랜치를 변경하지 않습니다. -- git branch -d [브랜치명]: 로컬 브랜치를 삭제합니다. -- git push origin --delete [브랜치명]: 원격 브랜치를 삭제합니다. ## clone, init, origin 리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. - git clone과 git init의 차이점, 이용방법 - origin이란 키워드는 무엇인지, 어떻게 설정하는지 - -- git init : 로컬 저장소에 새로운 Git repository를 생성합니다. Git Hub에는 따로 연동해줘야합니다. -- git clone : 원격 저장소에 있는 기존의 repository를 복제하여 로컬로 가져옵니다. 원격 저장소와 자동으로 연동됩니다. + ## reset ![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) reset에는 3가지 타입이 있습니다. 각 타입에 대해 작성 바랍니다. -- git reset --soft [커밋ID] : 지정한 커밋으로 HEAD만 이동하고, 변경 사항은 Staging Area(=index)에 유지됩니다. 최근 커밋을 수정할때 유용합니다. -- git reset --mixed [커밋ID] : 지정한 커밋으로 HEAD와 Staging Area를 이동하지만, Working Directory는 그대로 유지됩니다. 커밋은 취소되지만 파일 변경 사항은 남아있어 다시 커밋할 수 있습니다. -- git reset --hard [커밋ID] : 지정한 커밋으로 HEAD, Staging Area, Working Directory를 모두 이동시켜 변경 사항을 완전히 삭제합니다. ## Pull Request, Merge ![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) Pull Request와 Merge에 대한 내용을 적어주세요. 특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. -- Pull Request : GitHub, GitLab 등에서 사용하는 기능으로, 브랜치 병합을 요청하는 과정입니다. 협업을 하며 수정사항을 병합할지 검토한 후 진행할 수 있습니다. -- Merge : 한 브랜치의 변경 사항을 다른 브랜치에 적용하는 과정입니다. git merge [브랜치명] 명령어로 수행됩니다. -1) Fast-Forward Merge : 대상 브랜치가 병합하려는 브랜치의 최신 커밋을 그대로 따라갈 수 있을 때 발생합니다. 별도의 병합 커밋 없이 브랜치의 HEAD가 이동합니다. -2) 3-Way Merge : 두 브랜치가 서로 다른 변경 사항을 가질 때 발생하며, 공통 조상(ancestor)을 기준으로 병합합니다. 새로운 병합 커밋이 생성됩니다. ## rebase ![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. -- rebase : 브랜치의 변경 사항을 다른 브랜치의 최신 상태 위로 이동시키는 명령어입니다. git merge와 달리 병합 커밋 없이 깔끔한 커밋 히스토리를 유지할 수 있습니다. - -<활용방법> -1) 협업 중 최신 코드 반영 -2) 불필요한 Merge Commit 방지 : 병합 커밋 없이 정리된 커밋 히스토리를 유지할 수 있습니다. -3) 커밋 순서 정리 및 수정 : git rebase -i HEAD~n을 사용하면 특정 개수의 커밋을 수정, 삭제, 합치기 할 수 있습니다. ## stash ![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) git stash를 활용하는 방법에 대해 적어주세요. -- git stash : 작업 중인 변경 사항을 임시로 저장하고, 작업 디렉토리를 깨끗한 상태로 되돌리는 기능입니다. - -<활용방법> -1) 커밋하지 않고도 다른 브랜치로 이동하거나, 코드를 테스트할 때 유용합니다. -2) 변경 사항 임시 저장 : Staging Area와 Working Directory의 변경 사항이 stash로 이동하고, 작업 디렉토리는 깨끗한 상태가 됩니다. -3) 임시 저장한 변경 사항 적용 : 가장 최근에 저장한 변경 사항을 다시 적용하고, stash 목록에서 제거합니다. -4) 저장된 목록 확인 : 여러 개의 stash를 저장할 수 있으며, 목록을 확인할 수 있습니다. -5) 특정 stash 적용 : stash@{n}에 해당하는 특정 stash를 적용하지만 목록에서 제거하지 않습니다. -6) 특정 stash 삭제 -7) 모든 stash 삭제 ## Advanced 다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. From 0f29fef225213885e4740bf9753bb8e691f7e98f Mon Sep 17 00:00:00 2001 From: Park Jae Hong <105151063+PHJ2000@users.noreply.github.com> Date: Thu, 23 Oct 2025 01:11:46 +0900 Subject: [PATCH 69/73] =?UTF-8?q?step-1=20=EB=B0=95=EC=9E=AC=ED=99=8D=20(#?= =?UTF-8?q?141)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit step-1 실습 완료 --- ...E-\353\260\225\354\236\254\355\231\215.md" | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 "git-basics/23rd/README-\353\260\225\354\236\254\355\231\215.md" diff --git "a/git-basics/23rd/README-\353\260\225\354\236\254\355\231\215.md" "b/git-basics/23rd/README-\353\260\225\354\236\254\355\231\215.md" new file mode 100644 index 0000000..ee2bfc4 --- /dev/null +++ "b/git-basics/23rd/README-\353\260\225\354\236\254\355\231\215.md" @@ -0,0 +1,107 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. + +깃과 깃허브의 가장 큰 차이점은 깃이 소프트웨어이며, 깃허브가 서비스라는 점입니다. 깃은 개발자의 로컬(local) 컴퓨터에서 동작하며, 소스 코드의 버전 관리를 담당합니다. 반면, 깃허브는 깃 리포지토리를 호스팅하는 웹 서비스(remote)로, 프로젝트 협업을 위한 다양한 도구를 제공합니다. +-> GitHub는 Git 저장소를 호스팅하는 원격(remote) 저장소 서비스이다. + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. + +- Working Directory : 사용자가 작업하는 로컬 파일들이 위치한 영역으로 업로드 전의 작업한 파일입니다. +- Git Add : Working Directory에서 변경된 파일을 Staging Area로 추가하여 커밋 대상으로 만듭니다. +- Git Commit : Staging Area의 변경 사항을 코멘트와 함께 로컬 저장소(Local Repository)에 기록합니다. +- Git Push : 로컬 저장소에서 원격 저장소(GitHub)로 변경 사항을 업로드합니다. +- Git Fetch : 원격 저장소의 최신 변경 사항을 로컬로 가져오지만, 자동으로 병합하지는 않습니다. +- Git Merge : 다른 브랜치의 변경 사항을 현재 브랜치에 합칩니다.(수정사항을 적용하거나 기능을 업데이트 하는 과정) +- Git Pull : 원격 저장소의 변경 사항을 가져와 로컬 저장소와 자동으로 병합(Merge)합니다. + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + +- Commit: 변경 사항을 기록하는 Git의 기본 단위로 각 commit은 고유한 해시값을 가집니다. +- Branch: 독립적으로 개발을 진행할 수 있는 작업 공간으로, 여러 브랜치를 만들어 병렬 작업이 가능합니다. 보통 기본 작업 파일을 살려두고 나머지 기능이나 수정사항을 점검한 후 적용하기 위해 사용합니다. +- HEAD: 현재 체크아웃(작업 중)된 브랜치를 가리키는 포인터로, HEAD가 가리키는 브랜치가 변경됩니다. (HEAD = 현재 작업중인 branch) +- git checkout [브랜치명]: 특정 브랜치로 이동하거나, 특정 커밋을 체크아웃할 때 사용합니다. +- git switch -c [새로운 브랜치명]: 새 브랜치를 생성하고 해당 브랜치로 이동합니다. +- git branch [새로운 브랜치명]: 새로운 브랜치를 생성하지만, 현재 브랜치를 변경하지 않습니다. +- git branch -d [브랜치명]: 로컬 브랜치를 삭제합니다. +- git push origin --delete [브랜치명]: 원격 브랜치를 삭제합니다. + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +- git init : 로컬 저장소에 새로운 Git repository를 생성합니다. Git Hub에는 따로 연동해줘야합니다. +- git clone : 원격 저장소에 있는 기존의 repository를 복제하여 로컬로 가져옵니다. 원격 저장소와 자동으로 연동됩니다. + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. + +- git reset --soft [커밋ID] : 지정한 커밋으로 HEAD만 이동하고, 변경 사항은 Staging Area(=index)에 유지됩니다. 최근 커밋을 수정할때 유용합니다. +- git reset --mixed [커밋ID] : 지정한 커밋으로 HEAD와 Staging Area를 이동하지만, Working Directory는 그대로 유지됩니다. 커밋은 취소되지만 파일 변경 사항은 남아있어 다시 커밋할 수 있습니다. +- git reset --hard [커밋ID] : 지정한 커밋으로 HEAD, Staging Area, Working Directory를 모두 이동시켜 변경 사항을 완전히 삭제합니다. + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. + +- Pull Request : GitHub, GitLab 등에서 사용하는 기능으로, 브랜치 병합을 요청하는 과정입니다. 협업을 하며 수정사항을 병합할지 검토한 후 진행할 수 있습니다. +- Merge : 한 브랜치의 변경 사항을 다른 브랜치에 적용하는 과정입니다. git merge [브랜치명] 명령어로 수행됩니다. +1) Fast-Forward Merge : 대상 브랜치가 병합하려는 브랜치의 최신 커밋을 그대로 따라갈 수 있을 때 발생합니다. 별도의 병합 커밋 없이 브랜치의 HEAD가 이동합니다. +2) 3-Way Merge : 두 브랜치가 서로 다른 변경 사항을 가질 때 발생하며, 공통 조상(ancestor)을 기준으로 병합합니다. 새로운 병합 커밋이 생성됩니다. + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. + +- rebase : 브랜치의 변경 사항을 다른 브랜치의 최신 상태 위로 이동시키는 명령어입니다. git merge와 달리 병합 커밋 없이 깔끔한 커밋 히스토리를 유지할 수 있습니다. + +<활용방법> +1) 협업 중 최신 코드 반영 +2) 불필요한 Merge Commit 방지 : 병합 커밋 없이 정리된 커밋 히스토리를 유지할 수 있습니다. +3) 커밋 순서 정리 및 수정 : git rebase -i HEAD~n을 사용하면 특정 개수의 커밋을 수정, 삭제, 합치기 할 수 있습니다. + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. + +- git stash : 작업 중인 변경 사항을 임시로 저장하고, 작업 디렉토리를 깨끗한 상태로 되돌리는 기능입니다. + +<활용방법> +1) 커밋하지 않고도 다른 브랜치로 이동하거나, 코드를 테스트할 때 유용합니다. +2) 변경 사항 임시 저장 : Staging Area와 Working Directory의 변경 사항이 stash로 이동하고, 작업 디렉토리는 깨끗한 상태가 됩니다. +3) 임시 저장한 변경 사항 적용 : 가장 최근에 저장한 변경 사항을 다시 적용하고, stash 목록에서 제거합니다. +4) 저장된 목록 확인 : 여러 개의 stash를 저장할 수 있으며, 목록을 확인할 수 있습니다. +5) 특정 stash 적용 : stash@{n}에 해당하는 특정 stash를 적용하지만 목록에서 제거하지 않습니다. +6) 특정 stash 삭제 +7) 모든 stash 삭제 + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- 브랜치관리전략에 대표적으로 Github Flow, Git Flow가 있습니다. 두 방식에서는 리포지토리를 어떻게 관리할까요? +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From 51a4d45a49033acac701df0eefbec9ba2fbffb3d Mon Sep 17 00:00:00 2001 From: Cheonseo Lee <137674190+BeepBeepMaeae@users.noreply.github.com> Date: Thu, 23 Oct 2025 01:12:19 +0900 Subject: [PATCH 70/73] =?UTF-8?q?Step-1-=EC=9D=B4=EC=B2=9C=EC=84=9C=20(#13?= =?UTF-8?q?9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 step-1 깃 조사 --- ...E-\354\235\264\354\262\234\354\204\234.md" | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 "git-basics/23rd/README-\354\235\264\354\262\234\354\204\234.md" diff --git "a/git-basics/23rd/README-\354\235\264\354\262\234\354\204\234.md" "b/git-basics/23rd/README-\354\235\264\354\262\234\354\204\234.md" new file mode 100644 index 0000000..a9a023a --- /dev/null +++ "b/git-basics/23rd/README-\354\235\264\354\262\234\354\204\234.md" @@ -0,0 +1,103 @@ +# Git 기초 + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. + +- Git: 분산 버전관리 도구, Local에서도 전 기능 동작. +- GitHub: Git 저장소를 호스팅하고 PR·리뷰·권한·CI 등을 제공하는 Remote 서비스 중 하나. + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. + +- Working Directory: 실제 파일이 있는 작업 폴더. 수정·생성·삭제 발생. +- Git Add: 작업 파일을 Staging Area에 올림. +- Git Commit: Staging Area의 스냅샷을 로컬 저장소에 새 커밋으로 기록. +- Git Push: 로컬 브랜치의 새 커밋을 원격 저장소로 전송. + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + +- commit: 시점 스냅샷 + 부모 참조 + 메시지. 불변. +- branch: 어느 커밋을 가리키는 이동 포인터. 새 커밋이 생기면 브랜치 참조가 앞으로 이동. +- HEAD: 현재 체크아웃한 브랜치를 가리키는 특수 포인터. + +주요 명령 +- git branch: 목록 +- git branch : 생성 +- git switch : 이동 +- git switch -c : 생성+이동 +- git branch -d : 병합된 브랜치 삭제 +- git branch -D : 강제 삭제 + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +- git clone : 원격 저장소를 통째로 복제하여 새 폴더를 만들고, 기본 원격 별칭을 origin 으로 자동 등록. +- git init: 현재 폴더에 빈 Git 저장소 생성. 기존 코드에서 버전관리 시작할 때 사용. +- origin: 가장 일반적으로 쓰는 원격 저장소 별칭. 변경 가능. + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. + +- --soft: 브랜치 포인터만 되돌림. 스테이징은 유지, 워킹 디렉터리도 유지. +- --mixed: 브랜치 포인터 이동 + 인덱스 초기화. 워킹 디렉터리의 파일 변경은 남음. +- --hard: 브랜치 포인터 이동 + 인덱스/워킹 디렉터리 모두 되돌림. 로컬 변경 완전 폐기. + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. + +- PR: 한 브랜치의 변경을 다른 저장소/브랜치로 병합해달라고 요청. 코드리뷰, CI, 승인 규칙 등을 통과한 뒤 Merge 수행. + +Merge 유형 +- Fast-Forward: 대상 브랜치가 소스 브랜치의 조상일 때 참조만 앞으로 이동. +- 3-Way Merge: 히스토리가 분기되어 공통 조상이 존재하면 새 머지 커밋을 만들며 통합. + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. + +- rebase: 브랜치의 기반을 다른 커밋으로 바꾸면서, 내 커밋들을 다시 적용해 직선 히스토리를 만드는 작업. + +- 리뷰 전 커밋 정리 +- 오래된 분기를 최신 기반으로 업데이트하여 FF 머지 가능하게 만들 때 +- 히스토리를 깔끔하게 + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. + +- git stash : 현재 작업 변경(스테이지드/언스테이지드)을 임시로 치워 브랜치를 바꾸거나 풀/리베이스 등을 안전하게 수행. + +- 부분 적용 +- 인덱스 유지 테스트 +- 새 브랜치로 바로 빼기 +- 특정 경로만 스태시 + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- 브랜치관리전략에 대표적으로 Github Flow, Git Flow가 있습니다. 두 방식에서는 리포지토리를 어떻게 관리할까요? +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From f1053917a102d72ccae09d1893e635e0fd989a1c Mon Sep 17 00:00:00 2001 From: scholar-star Date: Thu, 23 Oct 2025 01:12:58 +0900 Subject: [PATCH 71/73] =?UTF-8?q?Step-1-=EC=A0=95=EC=9C=A0=EC=A7=84=20(#13?= =?UTF-8?q?7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 23rd 디렉토리를 만들고, README.md에 Git과 Github에 조사한 내용을 정리해 두었습니다! --- ...E-\354\240\225\354\234\240\354\247\204.md" | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 "git-basics/23rd/README-\354\240\225\354\234\240\354\247\204.md" diff --git "a/git-basics/23rd/README-\354\240\225\354\234\240\354\247\204.md" "b/git-basics/23rd/README-\354\240\225\354\234\240\354\247\204.md" new file mode 100644 index 0000000..d0bd6b1 --- /dev/null +++ "b/git-basics/23rd/README-\354\240\225\354\234\240\354\247\204.md" @@ -0,0 +1,91 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. + +git은 "local 파일"의 변경 사항을 추적하고 관리하는 분산 버전 제어 시스템이고, +github는 "remote 저장소"에서 git을 기반으로 프로젝트를 인터넷에서 관리할 수 있는 온라인 플랫폼이다. + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. + +- Working Directory : 사용자가 작업하는 로컬 파일들이 위치한 디렉토리이다. +- Git Add : Working Directory에서 변경된 파일들을 Staging 상태(커밋 준비 상태)로 올린다. +- Git Commit : Staging 상태 파일들의 변경 사항을 로컬 저장소에 새 버전으로 기록한다. +- Git Push : 로컬 저장소에서 원격 저장소(GitHub)로 변경 사항을 업로드한다. +- Git Pull : 원격 저장소의 변경 사항을 가져와, 로컬 저장소의 작업과 합친다. + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + +- Commit: 변경 사항을 기록해놓은 것으로, 각 commit은 고유한 해시값인 커밋 번호를 가진다. +- Branch: 독립적인 개발 라인으로, 기능 개발/버그 수정을 다른 작업과 분리하여 안전하게 진행하게 한다. +- HEAD: 특정 branch의 가장 최신(마지막으로 수행된) commit +- git checkout [브랜치명]: 특정 브랜치/커밋으로 전환 +- git switch -c [새로운 브랜치명]: 새 브랜치를 생성 후 해당 브랜치로 이동 +- git branch [새로운 브랜치명]: 새로운 브랜치를 생성하지만 그 브랜치로 전환하지는 않는다. +- git branch -d [브랜치명]: 로컬 브랜치 삭제 +- git push origin --delete [브랜치명]: 원격 저장소의 브랜치 삭제 + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +- git init : 현재 디렉토리를 Git 로컬 저장소로 만든다. +- git clone : 원격 저장소의 정보들을 내 로컬시스템으로 복제해온다. + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. + +- git reset --soft [커밋ID] : 지정한 커밋으로 HEAD만 이동하고, 변경 사항은 Staging Area(=index)에 유지됩니다. 최근 커밋을 수정할때 유용합니다. +- git reset --mixed [커밋ID] : 지정한 커밋으로 HEAD와 Staging Area를 이동하지만, Working Directory는 그대로 유지됩니다. 커밋은 취소되지만 파일 변경 사항은 남아있어 다시 커밋할 수 있습니다. +- git reset --hard [커밋ID] : 지정한 커밋으로 HEAD, Staging Area, Working Directory를 모두 이동시켜 변경 사항을 완전히 삭제합니다. + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. + +- Pull Request : 특정 branch의 코드 변경 사항을 원본 저장소의 다른 branch에 병합을 요청하는 과정이다. +- Merge : 2개 이상의 branch를 하나로 통합하는 과정이다. git merge [브랜치명] 명령어로 수행된다. +1) Fast-Forward Merge : 병합되는 branch에는 신규 commit이 없을 때, 별도의 병합 커밋 없이 브랜치의 HEAD만 이동해 병합한다. +2) 3-Way Merge : 각 branch에 신규 commit이 있을 경우, 새로운 병합 커밋이 생성되면서 병합한다. + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. + +- rebase : merge와 결과는 비슷하지만, merge와 달리 커밋 히스토리에 여러 갈래 branch를 남게 하지 않고 한 줄로 정리하는 기능이다. 커밋 히스토리를 깔끔하게 관리하고 싶을 때 유용하다. + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. + +- git stash : 작업중인 파일의 변경 내용을 일시적으로 기록해두는 명령이다. 작업 중 갑작스럽게 다른 작업을 진행해야 할 때, 임시로 이를 저장하고 해당 작업이 끝난 후 저장한 작업을 진행하는 방식으로 활용할 수 있다. + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- 브랜치관리전략에 대표적으로 Github Flow, Git Flow가 있습니다. 두 방식에서는 리포지토리를 어떻게 관리할까요? +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. From 963b8b40a923363d732bb3c53a253c04c0ad64a3 Mon Sep 17 00:00:00 2001 From: yuyeol3 <102399989+yuyeol3@users.noreply.github.com> Date: Thu, 23 Oct 2025 01:13:14 +0900 Subject: [PATCH 72/73] =?UTF-8?q?Step-1-=EC=B5=9C=EC=9C=A0=EB=A0=AC=20(#13?= =?UTF-8?q?6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # 변경점 👍 23rd 폴더 내 README-최유렬.md 추가하였습니다. Git 기초 템플릿 기반 내용 추가 및 자료 조사하였습니다. --- ...E-\354\265\234\354\234\240\353\240\254.md" | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 "git-basics/23rd/README-\354\265\234\354\234\240\353\240\254.md" diff --git "a/git-basics/23rd/README-\354\265\234\354\234\240\353\240\254.md" "b/git-basics/23rd/README-\354\265\234\354\234\240\353\240\254.md" new file mode 100644 index 0000000..cf1442f --- /dev/null +++ "b/git-basics/23rd/README-\354\265\234\354\234\240\353\240\254.md" @@ -0,0 +1,162 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. + + +git은 분산 버전 관리 시스템이고, github는 원격 레포지토리 호스팅 서비스이다. 개발자가 local repo에서 작업한 이력을 git을 통해 관리할 수 있으며, 관리한 내역을 remote repo(github 등)로 업로드해 공유할 수 있다. 다른 개발자들은 업로드된 remote repo를 복제해 local repo에서 작업할 수 있다. + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. +Git Merge, Git Fetch는 생략해도 됩니다. + +- Working Directory : git이 파일을 추적하는 작업 공간 +- Staging Area : 커밋할 변경 사항들을 모아두는 임시 공간 +- Local Repo : 내 컴퓨터에 있는 버전 이력 저장소 +- Remote Repo : 원격 서버에서 공유되는 공용 버전 이력 저장소 (예: github) + +- `git add` : 커밋할 변경사항을 Staging Area로 추가 +- `git commit` : 선택한 변경사항을 Local Repo에 기록 +- `git push` : Local Repo에 기록된 변경이력을 Remote Repo로 업로드 +- `git pull` : Remote Repo의 변경이력을 가져와 내 Working Directory에 병합 시도 + + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. +branch와 HEAD, git checkout을 포함하여 작성 바랍니다. +branch 생성 및 삭제, 이동 커맨드 등 자유롭게 내용을 추가해주세요. + +- Commit: 변경 사항을 기록하는 Git의 기본 단위로 각 commit은 고유한 해시값을 가집니다. +- Branch: 독립적으로 개발을 진행할 수 있는 작업 공간으로, 여러 브랜치를 만들어 병렬 작업이 가능합니다. 보통 기본 작업 파일을 살려두고 나머지 기능이나 수정사항을 점검한 후 적용하기 위해 사용합니다. +- HEAD: 현재 체크아웃(작업 중)된 브랜치를 가리키는 포인터로, HEAD가 가리키는 브랜치가 변경됩니다. (HEAD = 현재 작업중인 branch) +- git checkout [브랜치명]: 특정 브랜치로 이동하거나, 특정 커밋을 체크아웃할 때 사용합니다. + - git checkout -b [새로운 브랜치명] : 새 브랜치를 생성하고 해당 브랜치로 이동 +- git switch [브랜치명] : 특정 브랜치로 이동합니다. + - git switch -c [새로운 브랜치명]: 새 브랜치를 생성하고 해당 브랜치로 이동합니다. +- git branch [새로운 브랜치명]: 새로운 브랜치를 생성하지만, 현재 브랜치를 변경하지 않습니다. +- git branch -d [브랜치명]: 로컬 브랜치를 삭제합니다. +- git push origin --delete [브랜치명]: 원격 브랜치를 삭제합니다. + +### 사용 예시 +```bash +git switch -c new_branch # new_branch를 만들고 해당 브랜치로 이동 +# 변경사항을 만들었다고 가정 +git add . +git commit -m "new branch commit" +git switch main +git merge new_branch # main 브랜치에 merge +git branch -d new_branch # 필요 없으면 삭제 +``` + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. +- git clone과 git init의 차이점, 이용방법 +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +- git init : 로컬 저장소에 새로운 Git repository를 생성합니다. GitHub와는 따로 연동해줘야합니다. +- git clone : 원격 저장소에 있는 기존의 repository를 복제하여 로컬로 가져옵니다. 원격 저장소와 자동으로 연동됩니다. +- origin : git clone시 자동으로 생성되는 remote 저장소의 별칭(alias) + - 만약 따로 연동해줘야 할 경우.. + - `git remote add origin '저장소 주소'` + - `git push -u origin main` + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. +각 타입에 대해 작성 바랍니다. + +- `git reset --soft [커밋ID]` : 지정한 커밋으로 HEAD만 이동하고, 변경 사항은 Staging Area(=index)에 유지됩니다. + - 최근 커밋을 수정할 때 유용 +- `git reset --mixed [커밋ID]` : 지정한 커밋으로 HEAD와 Staging Area를 이동하지만, Working Directory는 그대로 유지됩니다. 커밋은 취소되지만 파일 변경 사항은 남아있어 다시 커밋할 수 있습니다. + - git reset의 기본값 +- `git reset --hard [커밋ID]` : 지정한 커밋으로 HEAD, Staging Area, Working Directory를 모두 이동시켜 변경 사항을 완전히 삭제합니다. + - 실행하면 되돌리기 어려움 + +- 공유된 브랜치에 대해 reset을 사용하면 커밋이 꼬일 수 있으므로 주의해야 함 + - 대안: git revert 명령어 사용 (되돌린 것에 대한 커밋이 생성됨) + + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. +특히 Merge의 두 타입인 Fast-Forward와 3-Way Merge를 포함해주세요. + +- Pull Request : GitHub, GitLab 등에서 사용하는 기능으로, 브랜치 병합을 요청하는 과정입니다. 협업을 하며 수정사항을 병합할지 검토한 후 진행할 수 있습니다. + - Fork: repo에 대한 읽기 권한이 없을 경우, repo를 복제해 수정한 다음 pull request + - Branch 생성 : 새 branch에서 변경사항을 커밋하고, merge 요청 +- Merge : 한 브랜치의 변경 사항을 다른 브랜치에 적용하는 과정입니다. `git merge [브랜치명]` 명령어로 수행됩니다. + + + +1) Fast-Forward Merge : 대상 브랜치가 병합하려는 브랜치의 최신 커밋을 그대로 따라갈 수 있을 때 발생합니다. 별도의 병합 커밋 없이 브랜치의 HEAD가 이동합니다. + - 브랜치가 선형으로 병합 +2) 3-Way Merge : 두 브랜치가 서로 다른 변경 사항을 가질 때 발생하며, 공통 조상(ancestor)을 기준으로 병합합니다. 새로운 병합 커밋이 생성됩니다. + - 브랜치가 다이아몬드 모양으로 병합 + +### main 브랜치에서 sub 브랜치를 병합 +```bash +git switch main # 메인 브랜치로 이동 +git merge sub # sub 브랜치를 병합 +``` + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. + +- rebase : 브랜치의 변경 사항을 다른 브랜치의 최신 상태 위로 이동시키는 명령어입니다. git merge와 달리 병합 커밋 없이 깔끔한 커밋 히스토리를 유지할 수 있습니다. + +<활용방법> +1) 협업 중 최신 코드 반영 +2) 불필요한 Merge Commit 방지 : 병합 커밋 없이 정리된 커밋 히스토리를 유지할 수 있습니다. +3) 커밋 순서 정리 및 수정 : git rebase -i HEAD~n을 사용하면 특정 개수의 커밋을 수정, 삭제, 합치기 할 수 있습니다. + +### sub 브랜치를 main 브랜치로 rebase +```bash +git switch sub # sub branch로 이동 +git rebase main # main branch로 rebase +``` + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. + +- git stash : 작업 중인 변경 사항을 임시로 저장하고, 작업 디렉토리를 깨끗한 상태로 되돌리는 기능입니다. + +<활용방법> +1) 커밋하지 않고도 다른 브랜치로 이동하거나, 코드를 테스트할 때 유용합니다. +2) 변경 사항 임시 저장 : Staging Area와 Working Directory의 변경 사항이 stash로 이동하고, 작업 디렉토리는 깨끗한 상태가 됩니다. +3) 임시 저장한 변경 사항 적용 : 가장 최근에 저장한 변경 사항을 다시 적용하고, stash 목록에서 제거합니다. +4) 저장된 목록 확인 : 여러 개의 stash를 저장할 수 있으며, 목록을 확인할 수 있습니다. +5) 특정 stash 적용 : stash@{n}에 해당하는 특정 stash를 적용하지만 목록에서 제거하지 않습니다. +6) 특정 stash 삭제 +7) 모든 stash 삭제 + +### 사용 예 +```bash +git stash save "임시 변경사항" +# git switch, checkout 등 작업 수행 +git stash list +git stash pop +``` + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. +- 브랜치관리전략에 대표적으로 Github Flow, Git Flow가 있습니다. 두 방식에서는 리포지토리를 어떻게 관리할까요? +- `git rebase --interactive`란? +- branch의 upstream이란? (`git push --set-upstream`) +- PR은 브랜치 뿐만 아니라 Fork한 리포지토리에서도 가능하다. fork은 언제 유용한지. +- `git fetch`와 `git pull`의 차이점, fetch는 언제 쓰는지 +- `reset --hard`와 `push --force`의 적절한 사용법 +- `.gitignore` 사용법 +- 브랜치 이름은 슬래시를 통해 계층적으로 가질 수 있다. 단, `parent/child-1`, `parent/child-2`는 동시에 가질 수 있지만 `parent/child/grandchild`, `parent/child`는 그러지 못한다. 무슨 이유 때문인지. +- detached HEAD란 어떤 상태인지, 이 상태에서 커밋을 하게 되면 어떻게 되는지, detached HEAD는 어떤 상황에서 발생할 수 있는지 + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. +- Github는 수많은 양의 레포지토리들을 어떻게 감당할까 From 825b2d6b9f0213e2f9b07701f9a082bbdef0d5e2 Mon Sep 17 00:00:00 2001 From: Haemi Date: Fri, 3 Apr 2026 14:37:26 +0900 Subject: [PATCH 73/73] Create step-1-Haemi --- step-1-Haemi | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 step-1-Haemi diff --git a/step-1-Haemi b/step-1-Haemi new file mode 100644 index 0000000..78a5af8 --- /dev/null +++ b/step-1-Haemi @@ -0,0 +1,126 @@ +# Git 기초 +Git을 사용하려면 알아야 할 기본 지식을 학습합시다. 아래 항목 위주로 조사하여 나름 이해한대로 채워주시기 바랍니다. 이 템플릿을 이용해도 되고, 자유 형식으로 정리하셔도 됩니다. 블로그 등에 정리한 경우 링크를 첨부해주세요. + +## Git != Github +![git-is-not-github](https://user-images.githubusercontent.com/51331195/160232512-3d6686ca-4ae3-4f11-a8d7-c893c0a7526a.png) +git과 github는 같은 의미가 아닙니다. +local, remote와 연관지어 적어주세요. + +Git은 버전 관리 시스템으로 파일의 변경 이력을 기록합니다. +Github는 Git 저장소를 인터넷에 올려 협업할 수 있게 해주는 서비스입니다. + +local은 내 컴퓨터, remote는 Github 서버입니다. +local에서 작업 후 commit하고 remote로 push합니다. + + +## Git Workflow +![git-workflow](https://cdn-media-1.freecodecamp.org/images/1*iL2J8k4ygQlg3xriKGimbQ.png) +위는 git이 어떻게 동작하는지 나타낸 다이어그램입니다. +Working Directory, Git Add, Git Commit, Git Push 등 각 항목에 대해 작성 바랍니다. + +Working Directory는 파일을 수정하는 공간입니다. +Git Add는 수정한 파일을 staging area에 올리는 과정입니다. +Git Commit은 변경사항을 기록으로 저장하는 단계입니다. +Git Push는 commit을 원격 저장소로 보내는 단계입니다. + +기본 흐름은 수정 → add → commit → push 입니다. + + +## Branch, HEAD +![branch-and-head](https://ihatetomatoes.net/wp-content/uploads/2020/04/07-head-pointer.png) +git이 동작하는 기본 단위는 commit과 branch입니다. + +branch는 작업을 나누는 기능으로, main과 별도로 작업할 수 있습니다. +HEAD는 현재 작업 위치를 가리키는 포인터입니다. + +git checkout을 사용하면 브랜치를 이동할 수 있습니다. + +- git checkout 브랜치이름 +- git checkout -b 새브랜치 +- git branch +- git branch -d 브랜치이름 + + +## clone, init, origin +리포지토리를 로컬에 생성하는 방법은 clone, init이 있습니다. 다음을 포함하여 작성 바랍니다. + +- git clone과 git init의 차이점, 이용방법 + +git clone은 원격 저장소를 복사해오는 것이고, +git init은 새 저장소를 만드는 것입니다. + +- origin이란 키워드는 무엇인지, 어떻게 설정하는지 + +origin은 원격 저장소의 기본 이름입니다. + +git remote add origin 저장소주소 + + +## reset +![reset](https://user-images.githubusercontent.com/51331195/160235594-8836570b-e8bf-484a-bb92-b2bd6d873066.png) +reset에는 3가지 타입이 있습니다. + +soft: commit만 취소 +mixed: staging area 초기화 +hard: 모든 변경 삭제 + + +## Pull Request, Merge +![pull-request-merge](https://atlassianblog.wpengine.com/wp-content/uploads/bitbucket411-blog-1200x-branches2.png) +Pull Request와 Merge에 대한 내용을 적어주세요. + +Pull Request는 내가 작업한 브랜치를 합쳐달라고 요청하는 것입니다. +Merge는 브랜치를 합치는 작업입니다. + +Fast-Forward는 단순 이동 방식이고 +3-Way Merge는 새로운 commit을 만들어 합치는 방식입니다. + + +## rebase +![rebase](https://user-images.githubusercontent.com/51331195/160234052-7fe70f85-5906-4474-b809-782adae92b3c.png) +rebase란 무엇인지, 어떤 때에 유용한지 등에 대해 적어주세요. + +rebase는 commit을 다른 브랜치 위로 옮기는 기능입니다. +히스토리를 깔끔하게 정리할 때 사용합니다. + + +## stash +![stash](https://d8it4huxumps7.cloudfront.net/bites/wp-content/banners/2023/4/642a663eaff96_git_stash.png) +git stash를 활용하는 방법에 대해 적어주세요. + +git stash는 작업 중인 내용을 임시 저장하는 기능입니다. + +git stash: 저장 +git stash pop: 다시 적용 + + +## Advanced +다음 주제는 더 조사해볼만한, 생각해볼만한 것들입니다. + +- Github Flow: main 브랜치를 중심으로 간단하게 운영하는 방식 +- Git Flow: develop, feature, release 등 여러 브랜치를 사용하는 복잡한 방식 + +- git rebase --interactive: commit을 수정하거나 합칠 수 있는 기능 + +- upstream: 원격 브랜치와 연결하는 개념 + git push --set-upstream origin 브랜치이름 + +- fork: 다른 사람의 저장소를 복사해서 사용하는 것 (오픈소스 기여할 때 유용) + +- fetch vs pull: + fetch는 가져오기만 하고, pull은 가져와서 merge까지 함 + +- reset --hard / push --force: 강제로 되돌리는 명령어 (협업 시 주의) + +- .gitignore: 특정 파일을 git 관리에서 제외 + +- 브랜치 이름 구조 제한: 내부적으로 파일처럼 관리되기 때문에 충돌 발생 + +- detached HEAD: 브랜치가 아닌 특정 commit을 가리키는 상태 + + +## Questions +조사/실습하면서 생긴 궁금점이 있다면 여기에 적어서 공유해주세요. + +- rebase와 merge의 차이가 아직 헷갈립니다. +- 협업할 때 branch를 어떻게 나누는 것이 좋은지 궁금합니다.