Step 87. GitHub 원격 저장소와 포트폴리오 — 백업이자 전시장

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 가입과 첫 저장소 생성 (화면 예시)

입력:

  1. github.com에 접속해 가입(Sign up)하고 이메일 인증까지 완료합니다
  2. 오른쪽 위 +New repository를 누릅니다
  3. 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 settingsPersonal access tokensTokens (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. 미션과 연습문제

미션 — 동기화되는 저장소와 포트폴리오 설계

  1. 3-2~3-3의 흐름으로 로컬 저장소와 원격(GitHub 또는 로컬 bare)을 연결하고 push합니다
  2. 3-5처럼 clone한 "두 번째 컴퓨터"에서 커밋·push하고, 원래 저장소에서 pull해 파일이 도착하는 것을 확인합니다
  3. .gitignorevenv/, __pycache__/, .env를 넣고, 해당 파일들이 git status에 안 뜨는 것을 확인합니다
  4. 포트폴리오용 폴더 구조(폴더 2개 이상)와 README 초안을 노트에 설계합니다
  5. (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 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.