{"id":15628271,"url":"https://github.com/kennethanceyer/tutorial-git","last_synced_at":"2025-04-05T15:08:46.287Z","repository":{"id":37692873,"uuid":"49103353","full_name":"KennethanCeyer/tutorial-git","owner":"KennethanCeyer","description":":blue_book: 어떻게 깃을 사용하는지 빠르게 알아봅시다. (Quick learn How to use Git.)","archived":false,"fork":false,"pushed_at":"2024-03-19T02:37:22.000Z","size":4527,"stargazers_count":335,"open_issues_count":1,"forks_count":123,"subscribers_count":14,"default_branch":"main","last_synced_at":"2025-03-29T14:11:19.756Z","etag":null,"topics":["document","git","github","guide","learning","tutorial","tutorial-git"],"latest_commit_sha":null,"homepage":"https://www.pigno.se/barn/tutorial-git/docs/#/","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KennethanCeyer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"License","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-01-06T01:19:28.000Z","updated_at":"2025-03-28T12:44:22.000Z","dependencies_parsed_at":"2024-03-19T03:43:49.323Z","dependency_job_id":null,"html_url":"https://github.com/KennethanCeyer/tutorial-git","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KennethanCeyer%2Ftutorial-git","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KennethanCeyer%2Ftutorial-git/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KennethanCeyer%2Ftutorial-git/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KennethanCeyer%2Ftutorial-git/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KennethanCeyer","download_url":"https://codeload.github.com/KennethanCeyer/tutorial-git/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247353746,"owners_count":20925329,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["document","git","github","guide","learning","tutorial","tutorial-git"],"created_at":"2024-10-03T10:21:43.819Z","updated_at":"2025-04-05T15:08:46.268Z","avatar_url":"https://github.com/KennethanCeyer.png","language":null,"readme":"\u003ch1 align=\"center\"\u003e어떻게 깃을 사용하는지 빠르게 알아봅시다\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"https://www.pigno.se/static/assets/images/octocat.svg\" width=\"240\" /\u003e\u003c/p\u003e\n\n\u003cp align=\"center\"\u003eQuick learn How to use the Git\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003ca href=\"https://www.pigno.se/barn/tutorial-git/docs\" target=\"_blank\"\u003e가이드 페이지에서 보기\u003c/a\u003e\u003c/p\u003e\n\n## :innocent: 바쁘잖아요 다들\n\n- 읽는데 걸리는 예상시간 `15분`\n- 다 외우기 위하여 반복 학습이 필요한 횟수 `3번`\n\n## :flushed: 누가 읽어야 할까요\n\n- 개발 회사에 일하는 Git을 모르시는 개발자.\n- Git을 도입할지 망설이시는 관리자, 담당자.\n- 2명이상의 협업을 하는 스타트업 담당자, 인디 개발자는 도입을 고려해주세요.\n\n## :clap: 시작하며\n\n### 깃을 왜 사용하죠?\n\n- 빠른 협업환경 조성\n- 누가, 언제, 무엇을, 왜, 어떻게 수정했는지 코드리뷰가 가능.\n- 이슈트래커 (Issue Tracker) 지원.\n- 깃헙 (GitHub)을 이용하여 자신의 git을 쉽게 공유 가능.\n- 지속적인 통합 (Continuous Integration) 지원.\n- Visual Studio, Jetbrains IntelliJ, Android Studio 등 대부분의 IDE에서 git 연동 제공.\n\n- **요약**: 협업을 위해서, 개발에서 사용, 두명 이상이 똑똑하게 소스를 공유하고 개발한 소스들을 합치세요!\n\n### 도대체 깃헙(GitHub)이 뭐야!?\n\n- 디자이너에게는 [Dribbble](https://dribbble.com/), 데이터사이언티스트에게는 [Kaggle](https://www.kaggle.com/)이 있듯이 개발자에게는 [깃헙 (Github)](https://github.com)이 있습니다.\n- 여러분이 퇴근길에 페이스북으로 글을 둘러보며 좋아요 하듯이 개발자들은 깃헙으로 [스타(star)](https://help.github.com/articles/about-stars/)를 날립니다.\n- ~진짜 퇴근길에 깃헙 들어가는 개발자가 있다면 :scream:~\n- 깃헙(Github)랑 깃(Git)은 다른 것입니다. 깃헙이 깃을 기반으로 온라인으로 서비스하는 형태입니다.\n- 쉽게 생각해서 Microsoft® Office를 Office 365로 서비스하는 것과 비슷하다 생각해주세요.\n\n### 깃이 어떤 역할을 하는건가요?\n\n- 소스 병합 (merge, rebase)\n- 소스 리비전 관리 (reset, commit, branch)\n- 소스 릴리즈 (push)\n- 소스 태깅 (tag)\n- 소스 변경사항 검토 (diff, log)\n\n### 깃은 어디에서 지원하나요?\n\n- 윈도우즈 (Windows)\n- 맥 (OS X)\n- 리눅스 (Ubuntu, CentOS, Redhat, Debian, etc)\n- 유닉스 (FreeBSD, Solaris, etc)\n\n## :wrench: 설정\n\n- 처음 시작하는 것이라면 git의 config 과정을 진행해야합니다.\n- `git config` 명령어를 이용하여 계정에 대한 정보를 설정합니다.\n\n```bash\n$ git config --global user.name \"Kenneth\"\n$ git config --global user.email \"kenneth@pigno.se\"\n```\n\n- 깃은 초기에 `git init` 작업을 진행합니다\n- 혹여나 GitHub에서 클론을 받은경우 이 작업은 필요하지 않습니다.\n- 아래 샘플 코드를 확인해주세요.\n\n```bash\n$ git init\n```\n\n- `git init`을 하셨으면 git 리모트를 설정하실 수 있습니다.\n- git 리모트란 git을 원격저장소에 저장하는 앤드포인트를 의미합니다.\n\n```bash\n$ git remote add origin https://github.com/KennethanCeyer/tutorial.git\n```\n\n- git 리모트 URL을 이용하여 원격저장소에 저장된 파일을 컴퓨터로 복사해올 수 있습니다.\n- 이때 `git clone` 명령어를 사용하여 복사를 시작합니다.\n\n```bash\n$ git clone https://github.com/KennethanCeyer/tutorial.git\n```\n\n- `git clone`을 통해 원격파일을 복사해오면, `origin` 에는 기본적으로 클론해온 리모트 URL이 저장되있습니다.\n\n## :lock: SSH\n\n- git 연결을 보다 안전하고 빠르게 하기 위해서는 `SSH Key` 등록을 권장합니다.\n- 이미 존재하는 문서로 [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)를 참고하시거나 아래 절차를 따라주시면 됩니다.\n- 우선 `ssh-keygen` 명령어로 SSH Key를 생성하시면 됩니다.\n\n\u003cimg width=\"760\" alt=\"Refer SSH\" src=\"./docs/images/fcd72616-69b0-4712-9098-9206df777cad.png\" /\u003e\n\n- SSH Key를 생성하셨으면 `~/[사용자 폴더]/.ssh/` 에 파일이 존재하는 것을 확인하실 수 있습니다.\n\n\u003cimg width=\"680\" alt=\"Refer folder ssh\" src=\"./docs/images/f7c3fb60-63bd-4611-9db8-6b694028228d.png\" /\u003e\n\n- 생성한 키 중 `id_rsa.pub`는 GitHub에 등록해주셔야 합니다.\n- 아래 절차를 따라해주시면 됩니다.\n- [GitHub 홈페이지](http://www.github.com)를 접속하셔서 로그인을 해주세요.\n- `Profile` 중 `Settings` 메뉴를 눌러주세요 (아래 그림을 참고해주세요.)\n\n\u003cimg width=\"260\" alt=\"Refer Setting\" src=\"./docs/images/edc03865-0e75-4fca-9577-8d63c5547808.png\" /\u003e\n\n- `Settings` 화면 중 우측 사이드메뉴에서 `SSH and GPG keys`를 클릭해주세요.\n\n\u003cimg width=\"760\" alt=\"Refer SSH Keys\" src=\"./docs/images/6400a29a-92fd-476e-9389-6bcd37f58dab.png\" /\u003e\n\n- `SSH Keys` 화면에서 `New SSH key` 버튼을 찾아 클릭 해주세요.\n\n\u003cimg width=\"480\" alt=\"Refer New SSH key\" src=\"./docs/images/1581b8f6-a8f4-455b-bd61-abc98be062db.png\" /\u003e\n\n- 입력 화면에 아까전의 `id_rsa.pub`의 내용을 입력해주시면 됩니다.\n\n\u003cimg width=\"640\" alt=\"Refer SSH contents\" src=\"./docs/images/1be45d6b-9b55-439b-bfd9-67b76dbf3860.png\" /\u003e\n\n**Q. SSH 설정을 해도 아이디와 비밀번호를 물어봐요!**\n\n\u003e 접속 정보에서 Use SSH를 클릭해 SSH 접속 정보를 이용하시기 바랍니다.\n\n\u003cimg width=\"400\" alt=\"SSH connection string\" src=\"./docs/images/99dda035-cfa6-4586-9827-82902cdeb609.png\" /\u003e\n\n이때, `git remote set-url` 명령어를 이용하여 기존의 원격지 주소를 수정해야 합니다.\n\n\u003cimg width=\"760\" alt=\"SSH remote set-url\" src=\"./docs/images/63c9f406-7978-40bd-b3bd-53781bae8b07.png\" /\u003e\n\n```bash\n# 혹시 HTTPS 주소를 Remote URL로 사용하는지 체크해주세요.\n# Remote URL은 ssh 포맷을 사용해주셔야 ssh 인증을 통해 아이디/비밀번호 입력을 넘어가실 수 있습니다.\n\n# origin의 Remote URL 변경방법.\n$ git remote set-url origin git@github.com:KennethanCeyer/tutorial-git.git\n\n# origin의 Remote URL이 제대로 변경됬는지 체크해주세요.\n$ git remote show origin\n```\n\n## :page_with_curl: 소스 기록\n\n- 소스를 업로드 하기 위해서는 `git add` 명령어를 이용합니다.\n- 샘플을 참고하세요\n\n```bash\n$ git add .\n```\n\n- ignore 파일이나, 삭제한 파일 이력까지 커밋을 하실 경우, `-f` 옵션을 이용합니다.\n\n```bash\n$ git add . -f\n```\n\n- `git remote show origin`을 통해 origin에 리모트 주소가 잘 등록되었는지 확인해보세요.\n\n\u003cimg width=\"760\" alt=\"Remote show origin\" src=\"./docs/images/171e7a0a-b9e7-43d0-b07b-3ed1e2eceeb4.png\" /\u003e\n\n## :pencil2: 소스 커밋\n\n- 소스를 커밋하시면 `staged` 상태의 파일이 히스토리로 기록되고 적재됩니다.\n- 파일 추적상태의 경우 `git status` 명령을 이용해서 확인합니다.\n\n```bash\n$ git status\n```\n\n- `git add` 이후 `git status`를 하면 아래와 같은 화면이 나옵니다.\n\n\u003cimg width=\"760\" alt=\"Git add files\" src=\"./docs/images/6382ff87-4c55-4c3f-9c99-ff92906e6df4.png\" /\u003e\n\n- Staged 상태의 파일은 아직 기록된 상태가 아닙니다.\n- 파일의 기록을 위해서는 `커밋` 작업이 필요합니다.\n- `git commit` 명령을 통해 Staged 상태의 파일을 커밋할 수 있습니다.\n\n\u003cimg width=\"760\" alt=\"Git commit\" src=\"./docs/images/ae9b3394-acce-41e5-ba59-773d3236829f.png\" /\u003e\n\n- `-m` 옵션을 이용하여 커밋 메시지를 작성하는 것을 권장합니다.\n- 실수로 커밋을 하여, 다시 커밋을 할 경우 커밋을 덮어씌울 수 있습니다. 이때 `--amend` 옵션을 이용합니다.\n\n```bash\n$ git add *\n$ git commit -m \"UI 레이아웃 이슈 수정.\"\n\n# 수정사항 발생\n$ git add *\n$ git commit -m \"UI 레이아웃 이슈 수정 및 관리자 벨리데이션 추가.\" --amend\n```\n\n## :tada: 소스 업데이트\n\n- 상대방이 커밋한 파일은 명령어를 통해서 직접 업데이트를 하셔야 동기화가 됩니다.\n- 이때 사용하는 명령어는 `git pull`과 `git fetch`가 있습니다.\n\n```bash\n# main 브랜치를 pull하여 업데이트\n$ git pull origin main\n\n# main 브랜치를 fetch하여 업데이트\n$ git fetch origin main\n```\n\n- `pull` 과 `fetch` 의 차이점은 `merge` 작업을 하느냐 안하느냐로 나뉘어지며.\n- `pull` 은 `fetch` + `merge` 작업이라고 생각하시면 됩니다.\n\n## :clock11: 소스 복원\n\n- 여러분이 git을 쓰는 이유중에 중요한 부분을 차지하는 영역입니다.\n- 정상적으로 커밋된 히스토리는, 리비전으로 git에 관리됩니다.\n- 실수로 잘못 작업하였거나, 예전 버전으로 롤백하여 적용할 경우 여러분은 예전 버전으로 리셋하실 수 있습니다.\n- 리셋은 `git reset` 명령을 사용합니다.\n\n```bash\n$ git reset HEAD^ --soft\n```\n\n- `git reset` 다음 인수로는 되돌리는 버전의 위치를 가리킵니다.\n- 현재위치(HEAD)를 기준하여 상대적인 위치를 설정하거나, 특정 버전 리비전 고유의 해시값을 지정합니다.\n- HEAD를 확인하시고 싶으면 `git reflog` 명령을 이용합니다.\n\n- `git reset`의 옵션 중 리셋 특성을 정하는 `--soft, --hard, --mixed` 옵션이 있습니다.\n- 위 옵션은 아래에서 자세히 설명합니다.\n\n- `--soft`는 약한특성의 리셋입니다, 되돌릴 때 기존의 인덱스와 워킹트리를 보존합니다.\n- `--hard`는 강한특성의 리셋입니다, 되돌릴 때 기존의 인덱스와 워킹트리를 버립니다.\n- `--mixed`는 중간특성의 리셋입니다, 되돌릴 때 기존의 인덱스는 버리고 워킹트리를 보존합니다.\n\n- 되돌리는 위치의 경우 아래와 같은 타입이 있습니다.\n\n```bash\n# 바로 이전 단계로 인덱스와 워킹트리를 버리고 리셋.\n$ git reset HEAD^ --hard\n\n# 바로 두번째 전 단계로 인덱스와 워킹트리를 버리고 리셋.\n$ git reset HEAD~2 --hard\n\n# 특정 리비전의 기록으로 인덱스는 버리고 워킹트리를 보존하여 리셋.\n$ git reset 991ee8c --mixed\n```\n\n## :seedling: 브랜치\n\n- 브랜치는 한국말로 가지(branch)입니다.\n- git에서는 마치 가지를 펼치듯 하나의 근본에서 여러 갈래로 쪼개어 관리할 수 있습니다.\n\n\u003cimg width=\"540\" alt=\"Git branch\" src=\"https://www.pigno.se/static/assets/images/git_tutorial_branch.png\" /\u003e\n\n이미지 출처 [StackOverflow](http://stackoverflow.com/questions/23142731/push-a-feature-branch-to-develop-branch-using-git)\n\n- branch의 특징은 아래와 같습니다.\n\n- 기본은 main 브랜치라고 불리며, 필수로 제공되는 브랜치이다.\n- 서로다른 브랜치들은 같은 조상을 가지고 있다.\n\n- 브랜치를 새로 만드신다면 `git branch [브랜치명]`으로 생성합니다.\n- 아래 명령라인에서는 new라는 브랜치를 생성하고 있습니다.\n\n```bash\n$ git branch new\n```\n\n- main 기준으로 new를 브랜치(가지치기)하면 main와 똑같은 소스코드가 new에도 적용됩니다.\n  _(\\* 예전에는 main 대신 master 브랜치를 기본으로 썼습니다, 예전 git 프로그램을 사용하시는 분은 master가 기본 브랜치로 보이게 됩니다.)_\n- 하지만 이 이후로 new에서 코드를 수정하면, main과 new는 서로 다른 코드가 되기 때문에 갈라집니다.\n\n- 생성된 new 브랜치로 접속하기 위해서는 `git checkout [브랜치명]`을 이용합니다.\n\n```bash\n$ git checkout new\n```\n\n- 생성과정과 브랜치 이동과정을 동시에 하고자 하면 `git checkout`에 `-b` 옵션을 이용합니다.\n\n```bash\n# 브랜치 new를 생성과 동시에 체크아웃.\n$ git checkout -b new\n```\n\n- 생성한 브랜치는 현재 로컬에 저장되어 있습니다.\n- 협업 작업에서는 생성한 브랜치를 원격 저장소에 등록해주어야 합니다.\n- 이때는 `git push [브랜치명]`을 이용합니다.\n\n```bash\n$ git push origin new\n```\n\n- 브랜치 생성 및 등록의 과정은 아래 화면과 같습니다.\n\n\u003cimg width=\"760\" alt=\"Git new branch\" src=\"./docs/images/df9d1bfd-9a09-4158-91e2-3809424877b2.png\" /\u003e\n\n- 브랜치의 삭제는 `git branch` 명령에서 `-d` 옵션을 사용합니다.\n\n\u003cimg width=\"760\" alt=\"Git delete branch\" src=\"./docs/images/070848b0-b343-4300-89e7-78fc374eb672.png\" /\u003e\n\n- 삭제된 브랜치 또한 원격 저장소에 반영을 해야합니다.\n- 이때 브랜치 명 앞에 콜론(:)을 붙여주어야 하니 이 점 주의해주세요.\n\n## :fearful: 소스 병합\n\n- 브랜치를 사용하는 과정에서 가장 중요한 머지와 리베이스 등의 병합 기법입니다.\n- 서로 다른 브랜치에서 서로 다른 코드가 개발되었고, 실제 배포에서 이를 합쳐야 할 때 사용합니다.\n- 병합 방식에서는 크게 `git merge`와 `git rebase`가 존재합니다.\n- 머지 방식과 리베이스 방식의 차이는 아래 이미지를 확인해주세요.\n\n\u003cimg width=\"600\" alt=\"Difference between merge and rebase\" src=\"https://www.pigno.se/static/assets/images/git_tutorial_merge_rebase.png\" /\u003e\n\n이미지 출처 [http://git.mikeward.org/](http://git.mikeward.org/)\n\n- 아래는 머지해야 하는 상황을 구현해봤습니다.\n- `main`에서 `sub` branch가 생성되었으며, main 브랜치에서 sub 브랜치를 머지하고자 합니다.\n- 파일 구성은 아래와 같습니다.\n\n```plaintext\n* main -\u003e some_file.txt의 내용\n* 1번째 단계 HEAD\nI'm a file.\n```\n\n```plaintext\n* sub -\u003e some_file.txt의 내용\n* 2번째 단계 HEAD (최신)\nI'm a file.\n\nInserted new line from the sub branch.\n```\n\n```bash\n$ git checkout -f main\n$ git merge sub\n# 현재 브랜치 main, 대상 브랜치 sub.\n# main에서 sub를 머지합니다.\n# HEAD -\u003e main\n# sub  -\u003e sub\n```\n\n- 머지 이후 main에서 파일을 보면, 아래와 같은 내용을 얻습니다.\n\n```plaintext\n* merge 이후 main -\u003e some_file.txt\nI'm a file.\n\nInserted new line from the sub branch.\n```\n\n## :sob: 충돌과 해결\n\n- git으로 merge, rebase 수행시 충돌(conflict)가 발생 할 수 있습니다.\n- 이는 같은 조상을 기준으로, 서로 다른 두개의 브랜치가 같은 소스코드를 변경했을 때 발생합니다.\n\n```plaintext\n* main -\u003e some_file.txt의 내용\nApple\n```\n\n- 위는 `main` 브랜치의 some_file.txt의 내용이다.\n- 아래는 해당 브랜치를 복제한 `sub` 브랜치이며, 복제 이후 한번 내용을 수정하였습니다.\n\n```plaintext\n* sub -\u003e some_file.txt의 내용\n* 2번째 단계 HEAD\nBanana\n```\n\n- 이후 main에서도 내용을 변경하여 버전을 업데이트 합니다.\n\n```plaintext\n* main -\u003e some_file.txt의 내용\n* 2번째 단계 HEAD(sub랑 단계가 겹침)\nStrawberry\n```\n\n- 둘 모두 버전이 같으나 같은 라인에서 변경사항이 발생했습니다.\n- 이 경우 충돌이 발생합니다.\n- 충돌이 발생한 some_file.txt를 열어보면 아래와 같은 내용을 보실 수 있습니다.\n\n```plaintext\n* 머지 이후 main -\u003e some_file.txt (충돌)\n\u003c\u003c\u003c\u003c\u003c\u003c\u003c HEAD\nStrawberry\n=======\nBanana\n\u003e\u003e\u003e\u003e\u003e\u003e\u003e sub\n```\n\n- 여기서 `HEAD`는 현재 브랜치(main)를 의미합니다.\n- HEAD와 sub의 각각 내용을 보여주고 있는데 꺽쇠(\u003c, \u003e), 이퀄(=)기호가 없도록 문장 하나를 선택해서 반영해주어야\n- 충돌이 해결 될 수 있습니다.\n- 여기서는 `main` 브랜치의 Strawberry를 선택하여 충돌을 해결하겠습니다.\n\n```plaintext\n* 머지 이후 main -\u003e some_file.txt (수정)\nStrawberry\n```\n\n- 수정이 되었다면 머지 해결을 위해 `git add`와 `git commit`으로 충돌(conflict)을 해결하세요.\n\n```bash\n$ git add *\n$ git commit -m \"Solved the conflict issue.\"\n```\n\n## :mag: 라이센스\n\n![cc license](./docs/images/c1887b04-8634-4965-a853-e76ab10887f6.png)\n\n이 가이드는 Creative Commons Attribution 4.0 (CCL 4.0)을 따릅니다.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkennethanceyer%2Ftutorial-git","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkennethanceyer%2Ftutorial-git","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkennethanceyer%2Ftutorial-git/lists"}