├── .DS_Store ├── License ├── README.md └── docs ├── .nojekyll ├── README.md ├── images ├── .DS_Store ├── 070848b0-b343-4300-89e7-78fc374eb672.png ├── 1581b8f6-a8f4-455b-bd61-abc98be062db.png ├── 171e7a0a-b9e7-43d0-b07b-3ed1e2eceeb4.png ├── 1be45d6b-9b55-439b-bfd9-67b76dbf3860.png ├── 6382ff87-4c55-4c3f-9c99-ff92906e6df4.png ├── 63c9f406-7978-40bd-b3bd-53781bae8b07.png ├── 6400a29a-92fd-476e-9389-6bcd37f58dab.png ├── 99dda035-cfa6-4586-9827-82902cdeb609.png ├── ae9b3394-acce-41e5-ba59-773d3236829f.png ├── c1887b04-8634-4965-a853-e76ab10887f6.png ├── df9d1bfd-9a09-4158-91e2-3809424877b2.png ├── edc03865-0e75-4fca-9577-8d63c5547808.png ├── f7c3fb60-63bd-4611-9db8-6b694028228d.png └── fcd72616-69b0-4712-9098-9206df777cad.png └── index.html /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KennethanCeyer/tutorial-git/ec42388f1eaa66ef9e71c27fb2d07a6085ff1915/.DS_Store -------------------------------------------------------------------------------- /License: -------------------------------------------------------------------------------- 1 | Copyright (c) 2018, the LSSTDESC CCL contributors (https://github.com/LSSTDESC/CCL/graphs/contributors). 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without 5 | modification, are permitted provided that the following conditions are met: 6 | 7 | * Redistributions of source code must retain the above copyright notice, this 8 | list of conditions and the following disclaimer. 9 | 10 | * Redistributions in binary form must reproduce the above copyright notice, 11 | this list of conditions and the following disclaimer in the documentation 12 | and/or other materials provided with the distribution. 13 | 14 | * Neither the name of CCL nor the names of its 15 | contributors may be used to endorse or promote products derived from 16 | this software without specific prior written permission. 17 | 18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 22 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 24 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 25 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 26 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

어떻게 깃을 사용하는지 빠르게 알아봅시다

2 | 3 |

4 | 5 |

Quick learn How to use the Git

6 | 7 |

가이드 페이지에서 보기

8 | 9 | ## :innocent: 바쁘잖아요 다들 10 | 11 | - 읽는데 걸리는 예상시간 `15분` 12 | - 다 외우기 위하여 반복 학습이 필요한 횟수 `3번` 13 | 14 | ## :flushed: 누가 읽어야 할까요 15 | 16 | - 개발 회사에 일하는 Git을 모르시는 개발자. 17 | - Git을 도입할지 망설이시는 관리자, 담당자. 18 | - 2명이상의 협업을 하는 스타트업 담당자, 인디 개발자는 도입을 고려해주세요. 19 | 20 | ## :clap: 시작하며 21 | 22 | ### 깃을 왜 사용하죠? 23 | 24 | - 빠른 협업환경 조성 25 | - 누가, 언제, 무엇을, 왜, 어떻게 수정했는지 코드리뷰가 가능. 26 | - 이슈트래커 (Issue Tracker) 지원. 27 | - 깃헙 (GitHub)을 이용하여 자신의 git을 쉽게 공유 가능. 28 | - 지속적인 통합 (Continuous Integration) 지원. 29 | - Visual Studio, Jetbrains IntelliJ, Android Studio 등 대부분의 IDE에서 git 연동 제공. 30 | 31 | - **요약**: 협업을 위해서, 개발에서 사용, 두명 이상이 똑똑하게 소스를 공유하고 개발한 소스들을 합치세요! 32 | 33 | ### 도대체 깃헙(GitHub)이 뭐야!? 34 | 35 | - 디자이너에게는 [Dribbble](https://dribbble.com/), 데이터사이언티스트에게는 [Kaggle](https://www.kaggle.com/)이 있듯이 개발자에게는 [깃헙 (Github)](https://github.com)이 있습니다. 36 | - 여러분이 퇴근길에 페이스북으로 글을 둘러보며 좋아요 하듯이 개발자들은 깃헙으로 [스타(star)](https://help.github.com/articles/about-stars/)를 날립니다. 37 | - ~진짜 퇴근길에 깃헙 들어가는 개발자가 있다면 :scream:~ 38 | - 깃헙(Github)랑 깃(Git)은 다른 것입니다. 깃헙이 깃을 기반으로 온라인으로 서비스하는 형태입니다. 39 | - 쉽게 생각해서 Microsoft® Office를 Office 365로 서비스하는 것과 비슷하다 생각해주세요. 40 | 41 | ### 깃이 어떤 역할을 하는건가요? 42 | 43 | - 소스 병합 (merge, rebase) 44 | - 소스 리비전 관리 (reset, commit, branch) 45 | - 소스 릴리즈 (push) 46 | - 소스 태깅 (tag) 47 | - 소스 변경사항 검토 (diff, log) 48 | 49 | ### 깃은 어디에서 지원하나요? 50 | 51 | - 윈도우즈 (Windows) 52 | - 맥 (OS X) 53 | - 리눅스 (Ubuntu, CentOS, Redhat, Debian, etc) 54 | - 유닉스 (FreeBSD, Solaris, etc) 55 | 56 | ## :wrench: 설정 57 | 58 | - 처음 시작하는 것이라면 git의 config 과정을 진행해야합니다. 59 | - `git config` 명령어를 이용하여 계정에 대한 정보를 설정합니다. 60 | 61 | ```bash 62 | $ git config --global user.name "Kenneth" 63 | $ git config --global user.email "kenneth@pigno.se" 64 | ``` 65 | 66 | - 깃은 초기에 `git init` 작업을 진행합니다 67 | - 혹여나 GitHub에서 클론을 받은경우 이 작업은 필요하지 않습니다. 68 | - 아래 샘플 코드를 확인해주세요. 69 | 70 | ```bash 71 | $ git init 72 | ``` 73 | 74 | - `git init`을 하셨으면 git 리모트를 설정하실 수 있습니다. 75 | - git 리모트란 git을 원격저장소에 저장하는 앤드포인트를 의미합니다. 76 | 77 | ```bash 78 | $ git remote add origin https://github.com/KennethanCeyer/tutorial.git 79 | ``` 80 | 81 | - git 리모트 URL을 이용하여 원격저장소에 저장된 파일을 컴퓨터로 복사해올 수 있습니다. 82 | - 이때 `git clone` 명령어를 사용하여 복사를 시작합니다. 83 | 84 | ```bash 85 | $ git clone https://github.com/KennethanCeyer/tutorial.git 86 | ``` 87 | 88 | - `git clone`을 통해 원격파일을 복사해오면, `origin` 에는 기본적으로 클론해온 리모트 URL이 저장되있습니다. 89 | 90 | ## :lock: SSH 91 | 92 | - git 연결을 보다 안전하고 빠르게 하기 위해서는 `SSH Key` 등록을 권장합니다. 93 | - 이미 존재하는 문서로 [SSH 생성 가이드](https://git-scm.com/book/ko/v1/Git-%EC%84%9C%EB%B2%84-SSH-%EA%B3%B5%EA%B0%9C%ED%82%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0)를 참고하시거나 아래 절차를 따라주시면 됩니다. 94 | - 우선 `ssh-keygen` 명령어로 SSH Key를 생성하시면 됩니다. 95 | 96 | Refer SSH 97 | 98 | - SSH Key를 생성하셨으면 `~/[사용자 폴더]/.ssh/` 에 파일이 존재하는 것을 확인하실 수 있습니다. 99 | 100 | Refer folder ssh 101 | 102 | - 생성한 키 중 `id_rsa.pub`는 GitHub에 등록해주셔야 합니다. 103 | - 아래 절차를 따라해주시면 됩니다. 104 | - [GitHub 홈페이지](http://www.github.com)를 접속하셔서 로그인을 해주세요. 105 | - `Profile` 중 `Settings` 메뉴를 눌러주세요 (아래 그림을 참고해주세요.) 106 | 107 | Refer Setting 108 | 109 | - `Settings` 화면 중 우측 사이드메뉴에서 `SSH and GPG keys`를 클릭해주세요. 110 | 111 | Refer SSH Keys 112 | 113 | - `SSH Keys` 화면에서 `New SSH key` 버튼을 찾아 클릭 해주세요. 114 | 115 | Refer New SSH key 116 | 117 | - 입력 화면에 아까전의 `id_rsa.pub`의 내용을 입력해주시면 됩니다. 118 | 119 | Refer SSH contents 120 | 121 | **Q. SSH 설정을 해도 아이디와 비밀번호를 물어봐요!** 122 | 123 | > 접속 정보에서 Use SSH를 클릭해 SSH 접속 정보를 이용하시기 바랍니다. 124 | 125 | SSH connection string 126 | 127 | 이때, `git remote set-url` 명령어를 이용하여 기존의 원격지 주소를 수정해야 합니다. 128 | 129 | SSH remote set-url 130 | 131 | ```bash 132 | # 혹시 HTTPS 주소를 Remote URL로 사용하는지 체크해주세요. 133 | # Remote URL은 ssh 포맷을 사용해주셔야 ssh 인증을 통해 아이디/비밀번호 입력을 넘어가실 수 있습니다. 134 | 135 | # origin의 Remote URL 변경방법. 136 | $ git remote set-url origin git@github.com:KennethanCeyer/tutorial-git.git 137 | 138 | # origin의 Remote URL이 제대로 변경됬는지 체크해주세요. 139 | $ git remote show origin 140 | ``` 141 | 142 | ## :page_with_curl: 소스 기록 143 | 144 | - 소스를 업로드 하기 위해서는 `git add` 명령어를 이용합니다. 145 | - 샘플을 참고하세요 146 | 147 | ```bash 148 | $ git add . 149 | ``` 150 | 151 | - ignore 파일이나, 삭제한 파일 이력까지 커밋을 하실 경우, `-f` 옵션을 이용합니다. 152 | 153 | ```bash 154 | $ git add . -f 155 | ``` 156 | 157 | - `git remote show origin`을 통해 origin에 리모트 주소가 잘 등록되었는지 확인해보세요. 158 | 159 | Remote show origin 160 | 161 | ## :pencil2: 소스 커밋 162 | 163 | - 소스를 커밋하시면 `staged` 상태의 파일이 히스토리로 기록되고 적재됩니다. 164 | - 파일 추적상태의 경우 `git status` 명령을 이용해서 확인합니다. 165 | 166 | ```bash 167 | $ git status 168 | ``` 169 | 170 | - `git add` 이후 `git status`를 하면 아래와 같은 화면이 나옵니다. 171 | 172 | Git add files 173 | 174 | - Staged 상태의 파일은 아직 기록된 상태가 아닙니다. 175 | - 파일의 기록을 위해서는 `커밋` 작업이 필요합니다. 176 | - `git commit` 명령을 통해 Staged 상태의 파일을 커밋할 수 있습니다. 177 | 178 | Git commit 179 | 180 | - `-m` 옵션을 이용하여 커밋 메시지를 작성하는 것을 권장합니다. 181 | - 실수로 커밋을 하여, 다시 커밋을 할 경우 커밋을 덮어씌울 수 있습니다. 이때 `--amend` 옵션을 이용합니다. 182 | 183 | ```bash 184 | $ git add * 185 | $ git commit -m "UI 레이아웃 이슈 수정." 186 | 187 | # 수정사항 발생 188 | $ git add * 189 | $ git commit -m "UI 레이아웃 이슈 수정 및 관리자 벨리데이션 추가." --amend 190 | ``` 191 | 192 | ## :tada: 소스 업데이트 193 | 194 | - 상대방이 커밋한 파일은 명령어를 통해서 직접 업데이트를 하셔야 동기화가 됩니다. 195 | - 이때 사용하는 명령어는 `git pull`과 `git fetch`가 있습니다. 196 | 197 | ```bash 198 | # main 브랜치를 pull하여 업데이트 199 | $ git pull origin main 200 | 201 | # main 브랜치를 fetch하여 업데이트 202 | $ git fetch origin main 203 | ``` 204 | 205 | - `pull` 과 `fetch` 의 차이점은 `merge` 작업을 하느냐 안하느냐로 나뉘어지며. 206 | - `pull` 은 `fetch` + `merge` 작업이라고 생각하시면 됩니다. 207 | 208 | ## :clock11: 소스 복원 209 | 210 | - 여러분이 git을 쓰는 이유중에 중요한 부분을 차지하는 영역입니다. 211 | - 정상적으로 커밋된 히스토리는, 리비전으로 git에 관리됩니다. 212 | - 실수로 잘못 작업하였거나, 예전 버전으로 롤백하여 적용할 경우 여러분은 예전 버전으로 리셋하실 수 있습니다. 213 | - 리셋은 `git reset` 명령을 사용합니다. 214 | 215 | ```bash 216 | $ git reset HEAD^ --soft 217 | ``` 218 | 219 | - `git reset` 다음 인수로는 되돌리는 버전의 위치를 가리킵니다. 220 | - 현재위치(HEAD)를 기준하여 상대적인 위치를 설정하거나, 특정 버전 리비전 고유의 해시값을 지정합니다. 221 | - HEAD를 확인하시고 싶으면 `git reflog` 명령을 이용합니다. 222 | 223 | - `git reset`의 옵션 중 리셋 특성을 정하는 `--soft, --hard, --mixed` 옵션이 있습니다. 224 | - 위 옵션은 아래에서 자세히 설명합니다. 225 | 226 | - `--soft`는 약한특성의 리셋입니다, 되돌릴 때 기존의 인덱스와 워킹트리를 보존합니다. 227 | - `--hard`는 강한특성의 리셋입니다, 되돌릴 때 기존의 인덱스와 워킹트리를 버립니다. 228 | - `--mixed`는 중간특성의 리셋입니다, 되돌릴 때 기존의 인덱스는 버리고 워킹트리를 보존합니다. 229 | 230 | - 되돌리는 위치의 경우 아래와 같은 타입이 있습니다. 231 | 232 | ```bash 233 | # 바로 이전 단계로 인덱스와 워킹트리를 버리고 리셋. 234 | $ git reset HEAD^ --hard 235 | 236 | # 바로 두번째 전 단계로 인덱스와 워킹트리를 버리고 리셋. 237 | $ git reset HEAD~2 --hard 238 | 239 | # 특정 리비전의 기록으로 인덱스는 버리고 워킹트리를 보존하여 리셋. 240 | $ git reset 991ee8c --mixed 241 | ``` 242 | 243 | ## :seedling: 브랜치 244 | 245 | - 브랜치는 한국말로 가지(branch)입니다. 246 | - git에서는 마치 가지를 펼치듯 하나의 근본에서 여러 갈래로 쪼개어 관리할 수 있습니다. 247 | 248 | Git branch 249 | 250 | 이미지 출처 [StackOverflow](http://stackoverflow.com/questions/23142731/push-a-feature-branch-to-develop-branch-using-git) 251 | 252 | - branch의 특징은 아래와 같습니다. 253 | 254 | - 기본은 main 브랜치라고 불리며, 필수로 제공되는 브랜치이다. 255 | - 서로다른 브랜치들은 같은 조상을 가지고 있다. 256 | 257 | - 브랜치를 새로 만드신다면 `git branch [브랜치명]`으로 생성합니다. 258 | - 아래 명령라인에서는 new라는 브랜치를 생성하고 있습니다. 259 | 260 | ```bash 261 | $ git branch new 262 | ``` 263 | 264 | - main 기준으로 new를 브랜치(가지치기)하면 main와 똑같은 소스코드가 new에도 적용됩니다. 265 | _(\* 예전에는 main 대신 master 브랜치를 기본으로 썼습니다, 예전 git 프로그램을 사용하시는 분은 master가 기본 브랜치로 보이게 됩니다.)_ 266 | - 하지만 이 이후로 new에서 코드를 수정하면, main과 new는 서로 다른 코드가 되기 때문에 갈라집니다. 267 | 268 | - 생성된 new 브랜치로 접속하기 위해서는 `git checkout [브랜치명]`을 이용합니다. 269 | 270 | ```bash 271 | $ git checkout new 272 | ``` 273 | 274 | - 생성과정과 브랜치 이동과정을 동시에 하고자 하면 `git checkout`에 `-b` 옵션을 이용합니다. 275 | 276 | ```bash 277 | # 브랜치 new를 생성과 동시에 체크아웃. 278 | $ git checkout -b new 279 | ``` 280 | 281 | - 생성한 브랜치는 현재 로컬에 저장되어 있습니다. 282 | - 협업 작업에서는 생성한 브랜치를 원격 저장소에 등록해주어야 합니다. 283 | - 이때는 `git push [브랜치명]`을 이용합니다. 284 | 285 | ```bash 286 | $ git push origin new 287 | ``` 288 | 289 | - 브랜치 생성 및 등록의 과정은 아래 화면과 같습니다. 290 | 291 | Git new branch 292 | 293 | - 브랜치의 삭제는 `git branch` 명령에서 `-d` 옵션을 사용합니다. 294 | 295 | Git delete branch 296 | 297 | - 삭제된 브랜치 또한 원격 저장소에 반영을 해야합니다. 298 | - 이때 브랜치 명 앞에 콜론(:)을 붙여주어야 하니 이 점 주의해주세요. 299 | 300 | ## :fearful: 소스 병합 301 | 302 | - 브랜치를 사용하는 과정에서 가장 중요한 머지와 리베이스 등의 병합 기법입니다. 303 | - 서로 다른 브랜치에서 서로 다른 코드가 개발되었고, 실제 배포에서 이를 합쳐야 할 때 사용합니다. 304 | - 병합 방식에서는 크게 `git merge`와 `git rebase`가 존재합니다. 305 | - 머지 방식과 리베이스 방식의 차이는 아래 이미지를 확인해주세요. 306 | 307 | Difference between merge and rebase 308 | 309 | 이미지 출처 [http://git.mikeward.org/](http://git.mikeward.org/) 310 | 311 | - 아래는 머지해야 하는 상황을 구현해봤습니다. 312 | - `main`에서 `sub` branch가 생성되었으며, main 브랜치에서 sub 브랜치를 머지하고자 합니다. 313 | - 파일 구성은 아래와 같습니다. 314 | 315 | ```plaintext 316 | * main -> some_file.txt의 내용 317 | * 1번째 단계 HEAD 318 | I'm a file. 319 | ``` 320 | 321 | ```plaintext 322 | * sub -> some_file.txt의 내용 323 | * 2번째 단계 HEAD (최신) 324 | I'm a file. 325 | 326 | Inserted new line from the sub branch. 327 | ``` 328 | 329 | ```bash 330 | $ git checkout -f main 331 | $ git merge sub 332 | # 현재 브랜치 main, 대상 브랜치 sub. 333 | # main에서 sub를 머지합니다. 334 | # HEAD -> main 335 | # sub -> sub 336 | ``` 337 | 338 | - 머지 이후 main에서 파일을 보면, 아래와 같은 내용을 얻습니다. 339 | 340 | ```plaintext 341 | * merge 이후 main -> some_file.txt 342 | I'm a file. 343 | 344 | Inserted new line from the sub branch. 345 | ``` 346 | 347 | ## :sob: 충돌과 해결 348 | 349 | - git으로 merge, rebase 수행시 충돌(conflict)가 발생 할 수 있습니다. 350 | - 이는 같은 조상을 기준으로, 서로 다른 두개의 브랜치가 같은 소스코드를 변경했을 때 발생합니다. 351 | 352 | ```plaintext 353 | * main -> some_file.txt의 내용 354 | Apple 355 | ``` 356 | 357 | - 위는 `main` 브랜치의 some_file.txt의 내용이다. 358 | - 아래는 해당 브랜치를 복제한 `sub` 브랜치이며, 복제 이후 한번 내용을 수정하였습니다. 359 | 360 | ```plaintext 361 | * sub -> some_file.txt의 내용 362 | * 2번째 단계 HEAD 363 | Banana 364 | ``` 365 | 366 | - 이후 main에서도 내용을 변경하여 버전을 업데이트 합니다. 367 | 368 | ```plaintext 369 | * main -> some_file.txt의 내용 370 | * 2번째 단계 HEAD(sub랑 단계가 겹침) 371 | Strawberry 372 | ``` 373 | 374 | - 둘 모두 버전이 같으나 같은 라인에서 변경사항이 발생했습니다. 375 | - 이 경우 충돌이 발생합니다. 376 | - 충돌이 발생한 some_file.txt를 열어보면 아래와 같은 내용을 보실 수 있습니다. 377 | 378 | ```plaintext 379 | * 머지 이후 main -> some_file.txt (충돌) 380 | <<<<<<< HEAD 381 | Strawberry 382 | ======= 383 | Banana 384 | >>>>>>> sub 385 | ``` 386 | 387 | - 여기서 `HEAD`는 현재 브랜치(main)를 의미합니다. 388 | - HEAD와 sub의 각각 내용을 보여주고 있는데 꺽쇠(<, >), 이퀄(=)기호가 없도록 문장 하나를 선택해서 반영해주어야 389 | - 충돌이 해결 될 수 있습니다. 390 | - 여기서는 `main` 브랜치의 Strawberry를 선택하여 충돌을 해결하겠습니다. 391 | 392 | ```plaintext 393 | * 머지 이후 main -> some_file.txt (수정) 394 | Strawberry 395 | ``` 396 | 397 | - 수정이 되었다면 머지 해결을 위해 `git add`와 `git commit`으로 충돌(conflict)을 해결하세요. 398 | 399 | ```bash 400 | $ git add * 401 | $ git commit -m "Solved the conflict issue." 402 | ``` 403 | 404 | ## :mag: 라이센스 405 | 406 | ![cc license](./docs/images/c1887b04-8634-4965-a853-e76ab10887f6.png) 407 | 408 | 이 가이드는 Creative Commons Attribution 4.0 (CCL 4.0)을 따릅니다. 409 | -------------------------------------------------------------------------------- /docs/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KennethanCeyer/tutorial-git/ec42388f1eaa66ef9e71c27fb2d07a6085ff1915/docs/.nojekyll -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 |

어떻게 깃을 사용하는지 빠르게 알아봅시다

2 | 3 |

4 | 5 |

Quick learn How to use the Git

6 | 7 |

가이드 페이지에서 보기

8 | 9 | ## :innocent: 바쁘잖아요 다들 10 | 11 | - 읽는데 걸리는 예상시간 `15분` 12 | - 다 외우기 위하여 반복 학습이 필요한 횟수 `3번` 13 | 14 | ## :flushed: 누가 읽어야 할까요 15 | 16 | - 개발 회사에 일하는 Git을 모르시는 개발자. 17 | - Git을 도입할지 망설이시는 관리자, 담당자. 18 | - 2명이상의 협업을 하는 스타트업 담당자, 인디 개발자는 도입을 고려해주세요. 19 | 20 | ## :clap: 시작하며 21 | 22 | ### 깃을 왜 사용하죠? 23 | 24 | - 빠른 협업환경 조성 25 | - 누가, 언제, 무엇을, 왜, 어떻게 수정했는지 코드리뷰가 가능. 26 | - 이슈트래커 (Issue Tracker) 지원. 27 | - 깃헙 (GitHub)을 이용하여 자신의 git을 쉽게 공유 가능. 28 | - 지속적인 통합 (Continuous Integration) 지원. 29 | - Visual Studio, Jetbrains IntelliJ, Android Studio 등 대부분의 IDE에서 git 연동 제공. 30 | 31 | - **요약**: 협업을 위해서, 개발에서 사용, 두명 이상이 똑똑하게 소스를 공유하고 개발한 소스들을 합치세요! 32 | 33 | ### 도대체 깃헙(GitHub)이 뭐야!? 34 | 35 | - 디자이너에게는 [Dribbble](https://dribbble.com/), 데이터사이언티스트에게는 [Kaggle](https://www.kaggle.com/)이 있듯이 개발자에게는 [깃헙 (Github)](https://github.com)이 있습니다. 36 | - 여러분이 퇴근길에 페이스북으로 글을 둘러보며 좋아요 하듯이 개발자들은 깃헙으로 [스타(star)](https://help.github.com/articles/about-stars/)를 날립니다. 37 | - ~진짜 퇴근길에 깃헙 들어가는 개발자가 있다면 :scream:~ 38 | - 깃헙(Github)랑 깃(Git)은 다른 것입니다. 깃헙이 깃을 기반으로 온라인으로 서비스하는 형태입니다. 39 | - 쉽게 생각해서 Microsoft® Office를 Office 365로 서비스하는 것과 비슷하다 생각해주세요. 40 | 41 | ### 깃이 어떤 역할을 하는건가요? 42 | 43 | - 소스 병합 (merge, rebase) 44 | - 소스 리비전 관리 (reset, commit, branch) 45 | - 소스 릴리즈 (push) 46 | - 소스 태깅 (tag) 47 | - 소스 변경사항 검토 (diff, log) 48 | 49 | ### 깃은 어디에서 지원하나요? 50 | 51 | - 윈도우즈 (Windows) 52 | - 맥 (OS X) 53 | - 리눅스 (Ubuntu, CentOS, Redhat, Debian, etc) 54 | - 유닉스 (FreeBSD, Solaris, etc) 55 | 56 | ## :wrench: 설정 57 | 58 | - 처음 시작하는 것이라면 git의 config 과정을 진행해야합니다. 59 | - `git config` 명령어를 이용하여 계정에 대한 정보를 설정합니다. 60 | 61 | ```bash 62 | $ git config --global user.name "Kenneth" 63 | $ git config --global user.email "kenneth@pigno.se" 64 | ``` 65 | 66 | - 깃은 초기에 `git init` 작업을 진행합니다 67 | - 혹여나 GitHub에서 클론을 받은경우 이 작업은 필요하지 않습니다. 68 | - 아래 샘플 코드를 확인해주세요. 69 | 70 | ```bash 71 | $ git init 72 | ``` 73 | 74 | - `git init`을 하셨으면 git 리모트를 설정하실 수 있습니다. 75 | - git 리모트란 git을 원격저장소에 저장하는 앤드포인트를 의미합니다. 76 | 77 | ```bash 78 | $ git remote add origin https://github.com/KennethanCeyer/tutorial.git 79 | ``` 80 | 81 | - git 리모트 URL을 이용하여 원격저장소에 저장된 파일을 컴퓨터로 복사해올 수 있습니다. 82 | - 이때 `git clone` 명령어를 사용하여 복사를 시작합니다. 83 | 84 | ```bash 85 | $ git clone https://github.com/KennethanCeyer/tutorial.git 86 | ``` 87 | 88 | - `git clone`을 통해 원격파일을 복사해오면, `origin` 에는 기본적으로 클론해온 리모트 URL이 저장되있습니다. 89 | 90 | ## :lock: SSH 91 | 92 | - git 연결을 보다 안전하고 빠르게 하기 위해서는 `SSH Key` 등록을 권장합니다. 93 | - 이미 존재하는 문서로 [SSH 생성 가이드](https://git-scm.com/book/ko/v1/Git-%EC%84%9C%EB%B2%84-SSH-%EA%B3%B5%EA%B0%9C%ED%82%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0)를 참고하시거나 아래 절차를 따라주시면 됩니다. 94 | - 우선 `ssh-keygen` 명령어로 SSH Key를 생성하시면 됩니다. 95 | 96 | ![Refer SSH](../docs/images/fcd72616-69b0-4712-9098-9206df777cad.png) 97 | 98 | - SSH Key를 생성하셨으면 `~/[사용자 폴더]/.ssh/` 에 파일이 존재하는 것을 확인하실 수 있습니다. 99 | 100 | ![Refer folder ssh](../docs/images/f7c3fb60-63bd-4611-9db8-6b694028228d.png) 101 | 102 | - 생성한 키 중 `id_rsa.pub`는 GitHub에 등록해주셔야 합니다. 103 | - 아래 절차를 따라해주시면 됩니다. 104 | - [GitHub 홈페이지](http://www.github.com)를 접속하셔서 로그인을 해주세요. 105 | - `Profile` 중 `Settings` 메뉴를 눌러주세요 (아래 그림을 참고해주세요.) 106 | 107 | ![Refer Setting](../docs/images/edc03865-0e75-4fca-9577-8d63c5547808.png) 108 | 109 | - `Settings` 화면 중 우측 사이드메뉴에서 `SSH and GPG keys`를 클릭해주세요. 110 | 111 | ![Refer SSH Keys](../docs/images/6400a29a-92fd-476e-9389-6bcd37f58dab.png) 112 | 113 | - `SSH Keys` 화면에서 `New SSH key` 버튼을 찾아 클릭 해주세요. 114 | 115 | ![Refer New SSH key](../docs/images/1581b8f6-a8f4-455b-bd61-abc98be062db.png) 116 | 117 | - 입력 화면에 아까전의 `id_rsa.pub`의 내용을 입력해주시면 됩니다. 118 | 119 | ![Refer SSH contents](../docs/images/1be45d6b-9b55-439b-bfd9-67b76dbf3860.png) 120 | 121 | **Q. SSH 설정을 해도 아이디와 비밀번호를 물어봐요!** 122 | 123 | > 접속 정보에서 Use SSH를 클릭해 SSH 접속 정보를 이용하시기 바랍니다. 124 | 125 | ![SSH connection string](../docs/images/99dda035-cfa6-4586-9827-82902cdeb609.png) 126 | 127 | 이때, `git remote set-url` 명령어를 이용하여 기존의 원격지 주소를 수정해야 합니다. 128 | 129 | ![SSH remote set-url](../docs/images/63c9f406-7978-40bd-b3bd-53781bae8b07.png) 130 | 131 | ```bash 132 | # 혹시 HTTPS 주소를 Remote URL로 사용하는지 체크해주세요. 133 | # Remote URL은 ssh 포맷을 사용해주셔야 ssh 인증을 통해 아이디/비밀번호 입력을 넘어가실 수 있습니다. 134 | 135 | # origin의 Remote URL 변경방법. 136 | $ git remote set-url origin git@github.com:KennethanCeyer/tutorial-git.git 137 | 138 | # origin의 Remote URL이 제대로 변경됬는지 체크해주세요. 139 | $ git remote show origin 140 | ``` 141 | 142 | ## :page_with_curl: 소스 기록 143 | 144 | - 소스를 업로드 하기 위해서는 `git add` 명령어를 이용합니다. 145 | - 샘플을 참고하세요 146 | 147 | ```bash 148 | $ git add . 149 | ``` 150 | 151 | - ignore 파일이나, 삭제한 파일 이력까지 커밋을 하실 경우, `-f` 옵션을 이용합니다. 152 | 153 | ```bash 154 | $ git add . -f 155 | ``` 156 | 157 | - `git remote show origin`을 통해 origin에 리모트 주소가 잘 등록되었는지 확인해보세요. 158 | 159 | ![Remote show origin](../docs/images/171e7a0a-b9e7-43d0-b07b-3ed1e2eceeb4.png) 160 | 161 | ## :pencil2: 소스 커밋 162 | 163 | - 소스를 커밋하시면 `staged` 상태의 파일이 히스토리로 기록되고 적재됩니다. 164 | - 파일 추적상태의 경우 `git status` 명령을 이용해서 확인합니다. 165 | 166 | ```bash 167 | $ git status 168 | ``` 169 | 170 | - `git add` 이후 `git status`를 하면 아래와 같은 화면이 나옵니다. 171 | 172 | ![Git add files](../docs/images/6382ff87-4c55-4c3f-9c99-ff92906e6df4.png) 173 | 174 | - Staged 상태의 파일은 아직 기록된 상태가 아닙니다. 175 | - 파일의 기록을 위해서는 `커밋` 작업이 필요합니다. 176 | - `git commit` 명령을 통해 Staged 상태의 파일을 커밋할 수 있습니다. 177 | 178 | ![Git commit](../docs/images/ae9b3394-acce-41e5-ba59-773d3236829f.png) 179 | 180 | - `-m` 옵션을 이용하여 커밋 메시지를 작성하는 것을 권장합니다. 181 | - 실수로 커밋을 하여, 다시 커밋을 할 경우 커밋을 덮어씌울 수 있습니다. 이때 `--amend` 옵션을 이용합니다. 182 | 183 | ```bash 184 | $ git add * 185 | $ git commit -m "UI 레이아웃 이슈 수정." 186 | 187 | # 수정사항 발생 188 | $ git add * 189 | $ git commit -m "UI 레이아웃 이슈 수정 및 관리자 벨리데이션 추가." --amend 190 | ``` 191 | 192 | ## :tada: 소스 업데이트 193 | 194 | - 상대방이 커밋한 파일은 명령어를 통해서 직접 업데이트를 하셔야 동기화가 됩니다. 195 | - 이때 사용하는 명령어는 `git pull`과 `git fetch`가 있습니다. 196 | 197 | ```bash 198 | # main 브랜치를 pull하여 업데이트 199 | $ git pull origin main 200 | 201 | # main 브랜치를 fetch하여 업데이트 202 | $ git fetch origin main 203 | ``` 204 | 205 | - `pull` 과 `fetch` 의 차이점은 `merge` 작업을 하느냐 안하느냐로 나뉘어지며. 206 | - `pull` 은 `fetch` + `merge` 작업이라고 생각하시면 됩니다. 207 | 208 | ## :clock11: 소스 복원 209 | 210 | - 여러분이 git을 쓰는 이유중에 중요한 부분을 차지하는 영역입니다. 211 | - 정상적으로 커밋된 히스토리는, 리비전으로 git에 관리됩니다. 212 | - 실수로 잘못 작업하였거나, 예전 버전으로 롤백하여 적용할 경우 여러분은 예전 버전으로 리셋하실 수 있습니다. 213 | - 리셋은 `git reset` 명령을 사용합니다. 214 | 215 | ```bash 216 | $ git reset HEAD^ --soft 217 | ``` 218 | 219 | - `git reset` 다음 인수로는 되돌리는 버전의 위치를 가리킵니다. 220 | - 현재위치(HEAD)를 기준하여 상대적인 위치를 설정하거나, 특정 버전 리비전 고유의 해시값을 지정합니다. 221 | - HEAD를 확인하시고 싶으면 `git reflog` 명령을 이용합니다. 222 | 223 | - `git reset`의 옵션 중 리셋 특성을 정하는 `--soft, --hard, --mixed` 옵션이 있습니다. 224 | - 위 옵션은 아래에서 자세히 설명합니다. 225 | 226 | - `--soft`는 약한특성의 리셋입니다, 되돌릴 때 기존의 인덱스와 워킹트리를 보존합니다. 227 | - `--hard`는 강한특성의 리셋입니다, 되돌릴 때 기존의 인덱스와 워킹트리를 버립니다. 228 | - `--mixed`는 중간특성의 리셋입니다, 되돌릴 때 기존의 인덱스는 버리고 워킹트리를 보존합니다. 229 | 230 | - 되돌리는 위치의 경우 아래와 같은 타입이 있습니다. 231 | 232 | ```bash 233 | # 바로 이전 단계로 인덱스와 워킹트리를 버리고 리셋. 234 | $ git reset HEAD^ --hard 235 | 236 | # 바로 두번째 전 단계로 인덱스와 워킹트리를 버리고 리셋. 237 | $ git reset HEAD~2 --hard 238 | 239 | # 특정 리비전의 기록으로 인덱스는 버리고 워킹트리를 보존하여 리셋. 240 | $ git reset 991ee8c --mixed 241 | ``` 242 | 243 | ## :seedling: 브랜치 244 | 245 | - 브랜치는 한국말로 가지(branch)입니다. 246 | - git에서는 마치 가지를 펼치듯 하나의 근본에서 여러 갈래로 쪼개어 관리할 수 있습니다. 247 | 248 | ![Git branch](https://www.pigno.se/static/assets/images/git_tutorial_branch.png) 249 | 이미지 출처 [StackOverflow](http://stackoverflow.com/questions/23142731/push-a-feature-branch-to-develop-branch-using-git) 250 | 251 | - branch의 특징은 아래와 같습니다. 252 | 253 | - 기본은 main 브랜치라고 불리며, 필수로 제공되는 브랜치이다. 254 | - 서로다른 브랜치들은 같은 조상을 가지고 있다. 255 | 256 | - 브랜치를 새로 만드신다면 `git branch [브랜치명]`으로 생성합니다. 257 | - 아래 명령라인에서는 new라는 브랜치를 생성하고 있습니다. 258 | 259 | ```bash 260 | $ git branch new 261 | ``` 262 | 263 | - main 기준으로 new를 브랜치(가지치기)하면 main와 똑같은 소스코드가 new에도 적용됩니다. 264 | _(\* 예전에는 main 대신 master 브랜치를 기본으로 썼습니다, 예전 git 프로그램을 사용하시는 분은 master가 기본 브랜치로 보이게 됩니다.)_ 265 | - 하지만 이 이후로 new에서 코드를 수정하면, main과 new는 서로 다른 코드가 되기 때문에 갈라집니다. 266 | 267 | - 생성된 new 브랜치로 접속하기 위해서는 `git checkout [브랜치명]`을 이용합니다. 268 | 269 | ```bash 270 | $ git checkout new 271 | ``` 272 | 273 | - 생성과정과 브랜치 이동과정을 동시에 하고자 하면 `git checkout`에 `-b` 옵션을 이용합니다. 274 | 275 | ```bash 276 | # 브랜치 new를 생성과 동시에 체크아웃. 277 | $ git checkout -b new 278 | ``` 279 | 280 | - 생성한 브랜치는 현재 로컬에 저장되어 있습니다. 281 | - 협업 작업에서는 생성한 브랜치를 원격 저장소에 등록해주어야 합니다. 282 | - 이때는 `git push [브랜치명]`을 이용합니다. 283 | 284 | ```bash 285 | $ git push origin new 286 | ``` 287 | 288 | - 브랜치 생성 및 등록의 과정은 아래 화면과 같습니다. 289 | 290 | ![Git new branch](../docs/images/df9d1bfd-9a09-4158-91e2-3809424877b2.png) 291 | 292 | - 브랜치의 삭제는 `git branch` 명령에서 `-d` 옵션을 사용합니다. 293 | 294 | ![Git delete branch](../docs/images/070848b0-b343-4300-89e7-78fc374eb672.png) 295 | 296 | - 삭제된 브랜치 또한 원격 저장소에 반영을 해야합니다. 297 | - 이때 브랜치 명 앞에 콜론(:)을 붙여주어야 하니 이 점 주의해주세요. 298 | 299 | ## :fearful: 소스 병합 300 | 301 | - 브랜치를 사용하는 과정에서 가장 중요한 머지와 리베이스 등의 병합 기법입니다. 302 | - 서로 다른 브랜치에서 서로 다른 코드가 개발되었고, 실제 배포에서 이를 합쳐야 할 때 사용합니다. 303 | - 병합 방식에서는 크게 `git merge`와 `git rebase`가 존재합니다. 304 | - 머지 방식과 리베이스 방식의 차이는 아래 이미지를 확인해주세요. 305 | 306 | ![Difference between merge and rebase](https://www.pigno.se/static/assets/images/git_tutorial_merge_rebase.png) 307 | 308 | 이미지 출처 [http://git.mikeward.org/](http://git.mikeward.org/) 309 | 310 | - 아래는 머지해야 하는 상황을 구현해봤습니다. 311 | - `main`에서 `sub` branch가 생성되었으며, main 브랜치에서 sub 브랜치를 머지하고자 합니다. 312 | - 파일 구성은 아래와 같습니다. 313 | 314 | ```plaintext 315 | * main -> some_file.txt의 내용 316 | * 1번째 단계 HEAD 317 | I'm a file. 318 | ``` 319 | 320 | ```plaintext 321 | * sub -> some_file.txt의 내용 322 | * 2번째 단계 HEAD (최신) 323 | I'm a file. 324 | 325 | Inserted new line from the sub branch. 326 | ``` 327 | 328 | ```bash 329 | $ git checkout -f main 330 | $ git merge sub 331 | # 현재 브랜치 main, 대상 브랜치 sub. 332 | # main에서 sub를 머지합니다. 333 | # HEAD -> main 334 | # sub -> sub 335 | ``` 336 | 337 | - 머지 이후 main에서 파일을 보면, 아래와 같은 내용을 얻습니다. 338 | 339 | ```plaintext 340 | * merge 이후 main -> some_file.txt 341 | I'm a file. 342 | 343 | Inserted new line from the sub branch. 344 | ``` 345 | 346 | ## :sob: 충돌과 해결 347 | 348 | - git으로 merge, rebase 수행시 충돌(conflict)가 발생 할 수 있습니다. 349 | - 이는 같은 조상을 기준으로, 서로 다른 두개의 브랜치가 같은 소스코드를 변경했을 때 발생합니다. 350 | 351 | ```plaintext 352 | * main -> some_file.txt의 내용 353 | Apple 354 | ``` 355 | 356 | - 위는 `main` 브랜치의 some_file.txt의 내용이다. 357 | - 아래는 해당 브랜치를 복제한 `sub` 브랜치이며, 복제 이후 한번 내용을 수정하였습니다. 358 | 359 | ```plaintext 360 | * sub -> some_file.txt의 내용 361 | * 2번째 단계 HEAD 362 | Banana 363 | ``` 364 | 365 | - 이후 main에서도 내용을 변경하여 버전을 업데이트 합니다. 366 | 367 | ```plaintext 368 | * main -> some_file.txt의 내용 369 | * 2번째 단계 HEAD(sub랑 단계가 겹침) 370 | Strawberry 371 | ``` 372 | 373 | - 둘 모두 버전이 같으나 같은 라인에서 변경사항이 발생했습니다. 374 | - 이 경우 충돌이 발생합니다. 375 | - 충돌이 발생한 some_file.txt를 열어보면 아래와 같은 내용을 보실 수 있습니다. 376 | 377 | ```plaintext 378 | * 머지 이후 main -> some_file.txt (충돌) 379 | <<<<<<< HEAD 380 | Strawberry 381 | ======= 382 | Banana 383 | >>>>>>> sub 384 | ``` 385 | 386 | - 여기서 `HEAD`는 현재 브랜치(main)를 의미합니다. 387 | - HEAD와 sub의 각각 내용을 보여주고 있는데 꺽쇠(<, >), 이퀄(=)기호가 없도록 문장 하나를 선택해서 반영해주어야 388 | - 충돌이 해결 될 수 있습니다. 389 | - 여기서는 `main` 브랜치의 Strawberry를 선택하여 충돌을 해결하겠습니다. 390 | 391 | ```plaintext 392 | * 머지 이후 main -> some_file.txt (수정) 393 | Strawberry 394 | ``` 395 | 396 | - 수정이 되었다면 머지 해결을 위해 `git add`와 `git commit`으로 충돌(conflict)을 해결하세요. 397 | 398 | ```bash 399 | $ git add * 400 | $ git commit -m "Solved the conflict issue." 401 | ``` 402 | 403 | ## :mag: 라이센스 404 | 405 | ![cc license](../docs/images/c1887b04-8634-4965-a853-e76ab10887f6.png) 406 | 407 | 이 가이드는 Creative Commons Attribution 4.0 (CCL 4.0)을 따릅니다. 408 | -------------------------------------------------------------------------------- /docs/images/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KennethanCeyer/tutorial-git/ec42388f1eaa66ef9e71c27fb2d07a6085ff1915/docs/images/.DS_Store -------------------------------------------------------------------------------- /docs/images/070848b0-b343-4300-89e7-78fc374eb672.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KennethanCeyer/tutorial-git/ec42388f1eaa66ef9e71c27fb2d07a6085ff1915/docs/images/070848b0-b343-4300-89e7-78fc374eb672.png -------------------------------------------------------------------------------- /docs/images/1581b8f6-a8f4-455b-bd61-abc98be062db.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KennethanCeyer/tutorial-git/ec42388f1eaa66ef9e71c27fb2d07a6085ff1915/docs/images/1581b8f6-a8f4-455b-bd61-abc98be062db.png -------------------------------------------------------------------------------- /docs/images/171e7a0a-b9e7-43d0-b07b-3ed1e2eceeb4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KennethanCeyer/tutorial-git/ec42388f1eaa66ef9e71c27fb2d07a6085ff1915/docs/images/171e7a0a-b9e7-43d0-b07b-3ed1e2eceeb4.png -------------------------------------------------------------------------------- /docs/images/1be45d6b-9b55-439b-bfd9-67b76dbf3860.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KennethanCeyer/tutorial-git/ec42388f1eaa66ef9e71c27fb2d07a6085ff1915/docs/images/1be45d6b-9b55-439b-bfd9-67b76dbf3860.png -------------------------------------------------------------------------------- /docs/images/6382ff87-4c55-4c3f-9c99-ff92906e6df4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KennethanCeyer/tutorial-git/ec42388f1eaa66ef9e71c27fb2d07a6085ff1915/docs/images/6382ff87-4c55-4c3f-9c99-ff92906e6df4.png -------------------------------------------------------------------------------- /docs/images/63c9f406-7978-40bd-b3bd-53781bae8b07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KennethanCeyer/tutorial-git/ec42388f1eaa66ef9e71c27fb2d07a6085ff1915/docs/images/63c9f406-7978-40bd-b3bd-53781bae8b07.png -------------------------------------------------------------------------------- /docs/images/6400a29a-92fd-476e-9389-6bcd37f58dab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KennethanCeyer/tutorial-git/ec42388f1eaa66ef9e71c27fb2d07a6085ff1915/docs/images/6400a29a-92fd-476e-9389-6bcd37f58dab.png -------------------------------------------------------------------------------- /docs/images/99dda035-cfa6-4586-9827-82902cdeb609.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KennethanCeyer/tutorial-git/ec42388f1eaa66ef9e71c27fb2d07a6085ff1915/docs/images/99dda035-cfa6-4586-9827-82902cdeb609.png -------------------------------------------------------------------------------- /docs/images/ae9b3394-acce-41e5-ba59-773d3236829f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KennethanCeyer/tutorial-git/ec42388f1eaa66ef9e71c27fb2d07a6085ff1915/docs/images/ae9b3394-acce-41e5-ba59-773d3236829f.png -------------------------------------------------------------------------------- /docs/images/c1887b04-8634-4965-a853-e76ab10887f6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KennethanCeyer/tutorial-git/ec42388f1eaa66ef9e71c27fb2d07a6085ff1915/docs/images/c1887b04-8634-4965-a853-e76ab10887f6.png -------------------------------------------------------------------------------- /docs/images/df9d1bfd-9a09-4158-91e2-3809424877b2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KennethanCeyer/tutorial-git/ec42388f1eaa66ef9e71c27fb2d07a6085ff1915/docs/images/df9d1bfd-9a09-4158-91e2-3809424877b2.png -------------------------------------------------------------------------------- /docs/images/edc03865-0e75-4fca-9577-8d63c5547808.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KennethanCeyer/tutorial-git/ec42388f1eaa66ef9e71c27fb2d07a6085ff1915/docs/images/edc03865-0e75-4fca-9577-8d63c5547808.png -------------------------------------------------------------------------------- /docs/images/f7c3fb60-63bd-4611-9db8-6b694028228d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KennethanCeyer/tutorial-git/ec42388f1eaa66ef9e71c27fb2d07a6085ff1915/docs/images/f7c3fb60-63bd-4611-9db8-6b694028228d.png -------------------------------------------------------------------------------- /docs/images/fcd72616-69b0-4712-9098-9206df777cad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KennethanCeyer/tutorial-git/ec42388f1eaa66ef9e71c27fb2d07a6085ff1915/docs/images/fcd72616-69b0-4712-9098-9206df777cad.png -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Document 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | --------------------------------------------------------------------------------