Step 87. GitHub 원격 저장소와 포트폴리오 — 백업이자 전시장
Level 1 — 프로그래밍과 컴퓨터 내부 | 난이도 ★★☆☆☆ | 예상 소요 시간 3시간
전제: Step 86의 Git 기초(init/add/commit/log/checkout)를 안다.
- 준비물: Git이 설치된 컴퓨터. GitHub 계정이 있으면 좋지만, 오늘의 push/pull 실습은 계정 없이도 로컬 시뮬레이션으로 전부 따라 할 수 있습니다.
- 주의: 가장 중요한 규칙 하나 — 공개 저장소에 비밀번호·API 키·토큰을 절대 올리지 않습니다. 오늘 그 이유를 직접 실험으로 증명합니다.
어제 만든 타임머신은 내 컴퓨터 안에만 있습니다. 그런데 컴퓨터는 고장 나고, 노트북은 잃어버립니다. 타임머신 자체의 백업이 필요합니다. 그리고 또 하나 — 보안 업계에서 "실력을 증명해 보세요"라는 요구는 이력서 한 장보다 GitHub 프로필 한 줄로 끝나는 경우가 많습니다. 오늘은 로컬 저장소를 원격 저장소와 연결하는 기술을 손에 익히고, 첫 포트폴리오 저장소의 설계도를 그립니다.
1. 학습 목표
이 챕터를 끝내면 다음을 할 수 있습니다:
- 로컬 저장소와 원격 저장소의 관계, push와 pull의 방향을 설명한다
git remote add,git push -u,git pull,git clone을 실제로 사용한다- 비밀번호 대신 토큰(PAT)을 쓰는 이유를 권한·만료·폐기의 관점에서 설명한다
.gitignore로 추적 대상을 제외한다- "지운 파일이 과거 커밋에 남는다"를
git show로 증명하고, 비밀 유출 시의 올바른 대응을 말한다
2. 배경 지식 — 오늘의 도구와 개념
오늘의 도구 한눈에 보기
| 구분 | 내용 |
|---|---|
| 언어·환경 | Git Bash(Windows) + GitHub 웹사이트(화면 예시) |
| 오늘의 명령 | git init --bare, git remote add/-v, git push -u, git pull, git clone, git show 해시:파일 |
| 필요한 개념 | 로컬/원격 저장소, push와 pull, PAT(개인 접근 토큰), .gitignore, README |
| 오늘의 산출물 | 원격과 동기화되는 저장소 remote-lab, 포트폴리오 설계안 |
2-1. 로컬과 원격 — 두 개의 저장소
Step 86에서 만든 것이 로컬(local) 저장소입니다. GitHub에 만드는 것이 원격(remote) 저장소입니다. 둘은 같은 역사를 공유하는 복제 쌍이고, 동기화는 여러분이 명령으로 합니다.
- push — 로컬의 새 커밋을 원격으로 밀어 올리기
- pull — 원격의 새 커밋을 로컬로 당겨 오기
집 컴퓨터와 노트북 두 대로 작업해도, 원격을 가운데 두고 push/pull하면 양쪽이 항상 같은 상태를 유지합니다. 혼자 쓸 때도 백업이 되고, 협업할 때는 이 통로가 팀의 동맥이 됩니다.
2-2. README — 저장소의 대문
GitHub에서 저장소를 열면 가장 먼저 보이는 것이 README.md입니다. "이 저장소가 무엇인지, 어떻게 실행하는지"를 적는 소개 문서입니다(마크다운 — Step 47에서 배운 형식입니다).
보안 업계에서 README의 무게는 남다릅니다. 도구를 만든 사람이 설명도 못 쓰면, 그 도구를 믿고 쓸 사람이 없습니다. 코드가 실력이라면 README는 그 실력의 번역입니다.
2-3. 공개(public)와 비밀 — 로봇은 몇 초면 온다
GitHub 저장소는 공개(public)와 비공개(private)를 고릅니다. 공개는 누구나 볼 수 있습니다 — 봇(bot)도 포함해서. 전 세계에는 공개 저장소에 새로 올라오는 코드를 실시간으로 훑는 자동화된 봇들이 있고, 목표는 실수로 올라온 비밀값(시크릿, secret) — 비밀번호, API 키, 토큰입니다.
키가 올라간 지 수 초~수 분 안에 훔쳐 가고, 클라우드 키라면 곧바로 가상화폐 채굴 서버가 세워지는 사고가 실제로 반복되고 있습니다. 게다가 파일을 지우고 다시 커밋해도 과거 커밋에 비밀이 그대로 남아 있습니다. 3-6에서 직접 증명합니다.
오늘의 철칙: 커밋 전에 "이 파일에 비밀이 없는가"를 묻는다. 비밀이 필요한 설정은 코드가 아니라 별도 파일에 두고, 그 파일은 .gitignore로 Git 밖에 둔다.
2-4. .gitignore — Git에게 무시하라고 알려 주는 명단
.gitignore는 "이름이 여기 적힌 파일·폴더는 추적하지 마세요"라는 명단입니다. 대표적으로 이런 것들이 들어갑니다.
venv/ # 파이썬 가상환경 — 수천 개의 설치 파일, 올릴 필요 없음
__pycache__/ # 파이썬이 자동 생성하는 캐시
*.log # 로그 파일 — 실수로 비밀이 찍힐 수 있음
.env # 비밀번호·키를 모아 두는 설정 파일
3. 따라 하기
오늘 실습은 두 갈래로 진행합니다. GitHub 계정이 있는 분은 실제 GitHub에 올리면 되고, 없는 분(또는 외부에 올리고 싶지 않은 분)은 로컬 bare 저장소를 원격인 척 세워서 push/pull을 똑같이 연습할 수 있습니다. 이 챕터의 실측은 모두 이 로컬 시뮬레이션 방식으로 검증했습니다 — 명령과 출력은 GitHub를 써도 동일합니다.
3-1. GitHub 가입과 첫 저장소 생성 (화면 예시)
입력:
- github.com에 접속해 가입(Sign up)하고 이메일 인증까지 완료합니다
- 오른쪽 위
+→ New repository를 누릅니다 - Repository name에
security-study를 입력, Public 선택, "Add a README file"은 체크하지 않고 Create repository를 누릅니다
출력 예시 (GitHub 화면 — 실측이 아닌 안내): 빈 저장소 화면이 열리며 "…or push an existing repository from the command line"이라는 안내와 명령어 세 줄이 보입니다.
읽는 법: GitHub가 이미 다음에 칠 명령을 알려 주고 있습니다. 우리는 이미 로컬 저장소가 있는 쪽(=existing repository)입니다. 저장소 이름이 곧 포트폴리오의 제목이니, security-study처럼 "무엇을 담는 곳인지"가 드러나는 이름을 고르세요.
3-2. 연습용 원격 만들기 — git init –bare
GitHub 없이 연습하는 갈래입니다. bare 저장소는 작업 폴더 없이 역사 창고(.git의 내용물)만 있는, 순수 원격용 저장소입니다.
입력:
git init --bare security-study.git
mkdir remote-lab && cd remote-lab && git init
echo "# security-study" > README.md
git add README.md && git commit -m "첫 커밋: README"
출력 (2026-09-09 실측, 경로는 가공):
Initialized empty Git repository in C:/Users/여러분이름/.../security-study.git/
[main (root-commit) c64a247] 첫 커밋: README
1 file changed, 1 insertion(+)
읽는 법: security-study.git이 GitHub 저장소의 역할을, remote-lab이 내 로컬 저장소의 역할을 합니다. GitHub를 쓰는 분은 3-1에서 만든 저장소가 bare 저장소의 자리입니다.
3-3. 연결과 첫 push — git remote add
입력 (로컬 시뮬레이션):
git remote add origin ../security-study.git
git push -u origin main
git remote -v
GitHub를 쓰는 분은 첫 줄의 주소만 다릅니다 — https://github.com/여러분아이디/security-study.git.
출력 (2026-09-09 실측):
branch 'main' set up to track 'origin/main'.
To ../security-study.git
* [new branch] main -> main
origin ../security-study.git (fetch)
origin ../security-study.git (push)
읽는 법: origin은 "내 기본 원격 저장소"에 붙이는 관용적 별명입니다. [new branch] main -> main은 "로컬의 main이 원격으로 올라갔다"는 뜻이고, -u 옵션 덕분에 이제 git push만 쳐도 어디로 올릴지 Git이 압니다. remote -v로 등록된 주소를 언제든 확인할 수 있습니다.
3-4. 토큰의 벽 — GitHub 인증 (화면 예시)
GitHub에 처음 push하면 아이디/비밀번호를 묻습니다. 여기서 중요한 벽이 있습니다 — GitHub은 비밀번호 인증을 폐지했습니다.
출력 예시 (GitHub 인증 실패 시 — 로컬 시뮬레이션에서는 나오지 않는 메시지):
remote: Password authentication is not supported for Git operations.
읽는 법: 비밀번호 대신 PAT(개인 접근 토큰, Personal Access Token)이라는 "조건부 열쇠"를 발급받아 비밀번호 자리에 넣어야 합니다.
발급 절차 (GitHub 화면): 우상단 프로필 → Settings → 맨 아래 Developer settings → Personal access tokens → Tokens (classic) → Generate new token. 이름은 my-laptop 등, 권한은 repo 체크, 기간은 90일 정도로 설정하고 생성합니다. 화면에 한 번만 보이는 토큰 문자열을 비밀번호 관리자 등 안전한 곳에 보관하세요. push 시 비밀번호를 물으면 이 토큰을 붙여 넣습니다(붙여 넣어도 화면에 글자가 안 보이는 것이 정상입니다).
왜 토큰이 더 안전한가: 토큰은 비밀번호보다 좁은 권한(repo만 등)과 만료 기한을 가지고, 유출이 의심되면 즉시 폐기(Revoke)할 수 있습니다. 버릴 수 있는 열쇠라서 안전한 것입니다. 그리고 토큰 자체도 비밀입니다 — 절대 코드에 적거나 공개 저장소에 올리지 마세요.
3-5. pull — 두 번째 컴퓨터 시뮬레이션
원격의 진짜 힘은 "다른 곳에서 이어서 작업"할 때 나옵니다. 두 번째 컴퓨터를 폴더 하나로 흉내 내 봅니다.
입력:
cd ..
git clone security-study.git second-pc
cd second-pc
echo "print('net map')" > netmap.py
git add netmap.py && git commit -m "두 번째 PC: netmap 추가"
git push
cd ../remote-lab
git pull
ls
출력 (2026-09-09 실측, clone의 경로 출력은 가공):
Cloning into 'second-pc'...
done.
From ../security-study
4c54a57..e5b9825 main -> origin/main
Updating 4c54a57..e5b9825
Fast-forward
netmap.py | 1 +
ls 결과에는 netmap.py가 새로 와 있습니다.
읽는 법: clone은 원격 저장소를 통째로 복사해 새 로컬 저장소를 만드는 명령입니다. 두 번째 PC가 push한 커밋을 첫 번째 폴더에서 pull로 당겨 오니 파일이 나타났습니다. Fast-forward는 "역사가 겹치지 않아 그대로 앞으로 밀기만 했다"는 뜻입니다.
3-6. 예측해 보기 — 지운 키는 살아 있는가
config.py에 가짜 API 키를 적고 커밋했다가, 그 줄을 지우고 다시 커밋했습니다. 공격자가 이 키를 회수할 수 있을까요?
- (a) 지웠으니 불가능하다
- (b) 과거 커밋을 열어 보면 그대로 있다
- (c) push하지 않았으니 안전하다
직접 확인:
echo 'API_KEY = "FAKE_KEY_FOR_TEST"' > config.py
git add config.py && git commit -m "설정 추가"
sed -i 's/FAKE_KEY_FOR_TEST//' config.py # Windows는 메모장으로 그 줄만 지워도 됩니다
git add config.py && git commit -m "키 제거"
git log --oneline
git show HEAD~1:config.py
출력 (2026-09-09 실측):
262eaa8 키 제거
344e969 설정 추가
c64a247 첫 커밋: README
API_KEY = "FAKE_KEY_FOR_TEST"
정답은 (b) 입니다. git show HEAD~1:config.py("한 단계 전 커밋 속의 이 파일을 보여 줘")가 지운 줄을 그대로 보여 줍니다. 파일을 지워도 역사는 남습니다. 그래서 비밀을 커밋하고 push해 버린 경우의 정답은 "지우기"가 아니라 "그 키를 즉시 폐기하고 새로 발급"입니다.
왜 중요한가: 이 실험이 2-3의 철칙이 왜 생겼는지에 대한 완전한 증명입니다. 여러분은 이 경고를 "들은" 사람이 아니라 "확인한" 사람이 되었습니다.
3-7. .gitignore — 무시되는지 눈으로 확인
입력:
printf "venv/\n__pycache__/\n*.log\n.env\n" > .gitignore
mkdir venv && echo "x" > venv/junk.py
echo "SECRET=abc" > .env
git status
출력 (2026-09-09 실측):
On branch main
Your branch is ahead of 'origin/main' by 2 commits.
(use "git push" to publish your local commits)
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
nothing added to commit but untracked files present (use "git add" to track)
읽는 법: venv/와 .env를 만들었는데도 status 목록에 나타나지 않습니다 — .gitignore가 즉시 효력을 발휘한 것입니다. ("Your branch is ahead … by 2 commits"는 "아직 push 안 한 로컬 커밋이 2개"라는 안내입니다.) 이어서 git add .gitignore && git commit -m "gitignore 추가" && git push로 명단 자체도 기록해 두세요.
3-8. 예측해 보기 — 양쪽에서 각각 커밋하면 push가 되나
두 번째 PC에서 push를 해 둔 상태에서, 첫 번째 폴더가 그걸 모르고(pull 없이) 커밋 후 push하면?
- (a) 그대로 올라간다
- (b) 원격 내용이 덮인다
- (c) Git이 거절한다
직접 확인 (2026-09-09 실측):
To ../security-study.git
! [rejected] main -> main (fetch first)
error: failed to push some refs to '../security-study.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. ...
hint: 'git pull' before pushing again.
정답은 (c) 입니다. 원격에 내가 모르는 커밋이 있으면 Git은 덮어쓰기를 거절합니다. 그런데 최신 Git은 여기서 git pull을 쳐도 곧장 합쳐주지 않고 방식을 묻습니다 (2026-09-09 실측):
fatal: Need to specify how to reconcile divergent branches.
해결: 합치기(merge) 방식으로 당겨 온 뒤 다시 push합니다.
git pull --no-rebase
git push
두 폴더가 같은 파일의 같은 부분을 고쳤다면 이 순간 충돌(conflict)이 발생합니다 — 실측에서도 실제로 CONFLICT (content): Merge conflict in README.md가 떴습니다. 충돌의 정체와 해결법은 바로 다음 챕터에서 정면으로 다룹니다.
3-9. README와 포트폴리오 정리
입력: 저장소 뿌리의 README.md를 이런 뼈대로 씁니다.
# security-study
정보보안 입문 공부 기록 저장소입니다.
## 폴더 안내
- `python-basic/` — 파이썬 문법 연습 코드
- `network-tools/` — 직접 만든 포트 스캐너, 네트워크 관찰 도구
## 진행 상황
현재 Level 1 진행 중 — 프로그래밍과 컴퓨터 내부.
읽는 법: 방문자가 5초 안에 "이 사람이 무엇을 공부하고, 지금 어디까지 왔는가"를 알 수 있어야 합니다. 포트폴리오는 "많이 했다"가 아니라 "정리되어 있다"로 평가받습니다 — Step 41~46의 연습 파일은 python-basic/으로, 포트 스캐너·네트워크 실습은 network-tools/으로 옮기는 식으로, 남이 봐도 읽히는 구조를 만드세요.
4. 미션과 연습문제
미션 — 동기화되는 저장소와 포트폴리오 설계
- 3-2~3-3의 흐름으로 로컬 저장소와 원격(GitHub 또는 로컬 bare)을 연결하고 push합니다
- 3-5처럼 clone한 "두 번째 컴퓨터"에서 커밋·push하고, 원래 저장소에서 pull해 파일이 도착하는 것을 확인합니다
.gitignore에venv/,__pycache__/,.env를 넣고, 해당 파일들이git status에 안 뜨는 것을 확인합니다- 포트폴리오용 폴더 구조(폴더 2개 이상)와 README 초안을 노트에 설계합니다
- (GitHub 계정이 있는 경우) 실제 저장소를 만들어 push하고, 시크릿 창(로그아웃 상태)에서 주소를 열어 "남에게 보이는 모습"을 확인합니다
연습문제
문제 1. push와 pull의 방향을 "로컬/원격"이라는 단어로 설명하고, 두 대의 컴퓨터가 같은 저장소를 공유하는 절차를 순서대로 말해 보세요.
문제 2. GitHub이 비밀번호 인증을 폐지하고 PAT를 요구하는 이유를, 토큰의 세 가지 특성(권한·만료·폐기)으로 설명해 보세요.
문제 3. 비밀번호가 적힌 파일을 커밋→삭제→재커밋한 뒤 push했습니다. 왜 위험한 상태이며, 올바른 대응은 무엇인가요?
문제 4. git push가 ! [rejected] main -> main (fetch first)로 거절되는 상황과 해결 절차를 설명해 보세요.
5. 모범 답안과 완료 기준
미션 모범 답안
전체 흐름은 3번 섹션의 실측 순서 그대로입니다. 핵심 검증 명령만 모으면:
git remote -v # origin 주소가 등록되어 있는가
git push # rejected 없이 올라가는가
git log --oneline # 로컬과 원격의 커밋이 일치하는가
git status # venv/, .env가 목록에 없는가
pull 검증은 3-5처럼 clone한 폴더에서 커밋·push한 뒤 원래 폴더에서 git pull — 새 파일이 ls에 나타나면 성공입니다. README 초안에는 ① 저장소 소개 한 줄 ② 폴더 안내 ③ 현재 진행 상황이 들어가면 합격입니다.
검증하는 법: ① remote -v에 origin이 보이는가. ② 두 폴더(또는 두 컴퓨터)가 같은 log --oneline을 보여 주는가. ③ .env를 만들어도 status에 안 뜨는가. 전부 ‘예’이면 완성입니다.
연습문제 해답
문제 1 해답. push는 로컬의 새 커밋을 원격으로 밀어 올리는 것, pull은 원격의 새 커밋을 로컬로 당겨 오는 것입니다. 두 대 공유 절차: 한쪽에서 원격을 만들어 연결(remote add)하고 push → 다른 쪽에서 clone → 이후 각자 작업 후 push, 시작 전에 pull로 동기화.
문제 2 해답. 비밀번호는 계정의 모든 권한을 여는 만능 열쇠이지만, 토큰은 ① repo 등 필요한 권한만 담은 좁은 열쇠이고, ② 만료 기한이 있어 영원히 유효하지 않으며, ③ 유출 시 그 토큰만 폐기(Revoke)하면 됩니다. 버릴 수 있는 열쇠라서 안전합니다.
문제 3 해답. 삭제 후 재커밋해도 과거 커밋에 비밀이 그대로 남고(3-6 실측), push된 이상 누구든 git show로 꺼낼 수 있기 때문입니다. 공개 저장소라면 봇이 이미 수집했을 수 있습니다. 올바른 대응은 파일 정리가 아니라 그 비밀번호·키를 즉시 폐기하고 새로 발급하는 것입니다.
문제 4 해답. 원격에 로컬에 없는 커밋이 있는 상황(다른 컴퓨터나 웹에서 먼저 push한 경우)입니다. 해결: git pull --no-rebase로 원격 변경을 먼저 합친 뒤(충돌이 나면 다음 챕터의 방법으로 해결) git push합니다. 최신 Git은 방식을 묻는 fatal: Need to specify how to reconcile divergent branches.가 뜰 수 있으니 --no-rebase를 명시합니다 (3-8 실측).
완료 기준 체크리스트
- [ ] 로컬 저장소를 원격 저장소에 연결(remote add)하고 push할 수 있다
- [ ] clone과 pull로 "두 번째 컴퓨터"의 변경을 받아올 수 있다
- [ ] PAT가 비밀번호보다 안전한 이유를 설명할 수 있다
- [ ]
.gitignore로 파일을 추적 대상에서 제외할 수 있다 - [ ] "지운 파일이 과거 커밋에 남는다"를
git show로 증명할 수 있다 - [ ] 비밀 유출 시 대응이 "키 폐기 후 재발급"임을 설명할 수 있다
- [ ] 미션: 동기화 검증과 포트폴리오 설계를 완료했다
6. 흔한 실수와 해결
벽 1. push에서 비밀번호가 거절된다
증상 (출력 예시 — GitHub 접속 시):
remote: Password authentication is not supported for Git operations.
원인: GitHub은 비밀번호 인증을 폐지했습니다. PAT만 받습니다.
해결: 3-4의 절차로 토큰을 발급받아 비밀번호 자리에 사용하세요. Windows라면 자격 증명 관리자에 옛날 비밀번호가 저장되어 계속 실패할 수 있습니다 — 제어판 → 자격 증명 관리자 → Windows 자격 증명에서 git:https://github.com 항목을 지우고 다시 시도하세요.
벽 2. "remote origin already exists" 오류가 난다
증상 (2026-09-09 실측):
error: remote origin already exists.
원인: origin이 이미 등록되어 있습니다(과거에 한 번 연결했던 것).
해결: git remote -v로 현재 주소를 확인하고, 바꾸려면 git remote set-url origin 새주소를 씁니다.
벽 3. push가 "rejected (fetch first)"로 막힌다
증상 (2026-09-09 실측):
! [rejected] main -> main (fetch first)
error: failed to push some refs to '../security-study.git'
원인: 원격에 로컬에 없는 커밋이 있습니다(다른 컴퓨터에서 먼저 push한 경우 등).
해결: git pull --no-rebase로 원격 변경을 먼저 가져온 뒤 다시 push. 최신 Git은 pull에서 fatal: Need to specify how to reconcile divergent branches.를 띄우며 방식을 물으니 --no-rebase(합치기)를 명시하세요. 합치다가 충돌이 나면 다음 챕터에서 해결법을 배웁니다.
벽 4. venv 폴더 수천 개 파일이 올라가 버렸다
증상: push가 한참 걸리고, 저장소가 라이브러리 파일로 가득합니다.
원인: .gitignore를 만들기 전에 add해 버렸습니다. ignore는 "아직 추적 안 된 파일"에만 적용됩니다.
해결: git rm -r --cached venv로 추적만 해제하고(파일 자체는 내 컴퓨터에 남습니다), .gitignore를 확인한 뒤 커밋·push하세요.
벽 5. 토큰을 코드에 적어 올렸다
증상: 설정 파일에 토큰을 하드코딩하고 push한 것을 뒤늦게 발견합니다.
원인: 3-6의 "역사는 남는다"를 잊은 것입니다. 지워도 과거 커밋에 남습니다.
해결: 파일을 정리하는 것으로는 부족합니다. GitHub 토큰 페이지에서 해당 토큰을 즉시 폐기(Revoke)하고 새로 발급받으세요. 다음부터는 토큰을 .env 같은 별도 파일에 두고 그 파일을 .gitignore에 등록합니다.
7. 정리
오늘의 개념
| 개념 | 한 줄 설명 |
|---|---|
| 로컬/원격 저장소 | 내 컴퓨터의 저장소와 그 온라인 복제본 — 같은 역사를 공유하는 쌍 |
| push / pull | 로컬→원격으로 밀기 / 원격→로컬로 당기기 |
| clone | 원격 저장소를 통째로 복사해 새 로컬 저장소 만들기 |
| bare 저장소 | 작업 폴더 없이 역사만 있는 순수 원격용 저장소 — 오늘의 연습 상대 |
| PAT | 좁은 권한·만료 기한·폐기 가능성을 가진 조건부 열쇠 |
| .gitignore | "이 파일은 추적하지 마세요"라는 명단 — 아직 추적 안 된 파일에만 적용 |
| README | 저장소의 대문. 5초 안에 읽혀야 한다 |
오늘의 명령어
| 명령 | 하는 일 |
|---|---|
git init --bare 이름.git |
연습용 원격(bare) 저장소 만들기 |
git remote add origin 주소 |
원격 저장소 주소록 등록 |
git remote -v |
등록된 원격 주소 확인 |
git push -u origin main |
첫 push + 기본 목적지 설정 |
git pull --no-rebase |
원격 변경을 합치기 방식으로 당겨 오기 |
git clone 주소 폴더 |
원격을 복사해 새 로컬 저장소 만들기 |
git show 해시:파일 |
과거 커밋 속 파일 내용 꺼내 보기 |
git rm -r --cached 폴더 |
추적만 해제(파일은 남김) |
명령어보다 중요한 감각
공개 저장소에 올라가는 순간, 그 코드는 전 세계의 사람 그리고 봇이 보는 것입니다. "지운 줄도 역사에 남는다"는 3-6의 실험을 기억하세요. 커밋 전 "이 파일에 비밀이 없는가"를 묻는 한 번의 호흡이, 포트폴리오와 사고 보고서를 가릅니다. 그리고 push가 거절되거나 pull이 방식을 묻는 것은 고장이 아니라 "원격에 모르는 변경이 있다"는 안내입니다 — 당황하지 말고 당겨 온 뒤 다시 올리면 됩니다.
전부 체크되면 Step 87 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.