clone, push, pull, fetch의 차이
8강. clone, push, pull, fetch의 차이
1. 이번 강의에서 해결할 문제
pull과 push를 동기화 버튼처럼 무조건 실행하면 예상치 못한 병합이나 거절을 만납니다. 각 명령이 어느 방향으로 무엇을 바꾸는지 구분합니다.
2. 학습 목표
3. 핵심 개념
clone은 저장소와 remote 설정을 새로 만듭니다. fetch는 원격 이력만 받아 origin/main을 갱신하고 작업 파일은 바꾸지 않습니다. pull은 fetch 후 현재 브랜치에 통합합니다. push는 로컬 커밋을 원격에 보냅니다.
| 명령 | 데이터 방향 | 작업 파일 변경 | 사용 시점 |
|---|---|---|---|
clone | 원격 → 새 로컬 저장소 | 새 폴더 생성 | 처음 내려받을 때 |
fetch | 원격 → 원격 추적 브랜치 | 변경하지 않음 | 먼저 원격 차이를 관찰할 때 |
pull --ff-only | 원격 → 현재 브랜치 | 성공하면 변경 | 분기되지 않은 원격 커밋을 반영할 때 |
push | 로컬 커밋 → 원격 | 로컬 파일은 그대로 | 검토한 로컬 커밋을 공유할 때 |
origin/main은 원격 서버를 실시간으로 읽는 이름이 아니라 마지막 fetch에서 확인한 원격 main의 로컬 기록입니다. 따라서 비교 전 fetch가 필요합니다.
4. 단계별 명령어와 예시
명령 목적: 자신이 접근할 수 있는 학습 저장소를 별도 폴더로 복제하고, 원격 변경을 먼저 관찰한 뒤 fast-forward 방식으로 반영합니다.
실행 전 상태: YOUR-NAME을 실제 GitHub 사용자명으로 바꾸고 저장소 URL이 브라우저에서 존재하는지 확인합니다. C:\dev\git-learning-copy가 이미 존재하면 덮어쓰거나 그 안에 다시 clone하지 않습니다. 원본 저장소 내부가 아닌 C:\dev에서 시작합니다.
복제 경로: C:\dev\git-learning-copy
Set-Location C:\dev
git clone https://github.com/YOUR-NAME/git-learning-site.git git-learning-copy
Set-Location .\git-learning-copy
git remote -v
git status --short
git fetch origin
git log --oneline HEAD..origin/main
git diff HEAD..origin/main
git pull --ff-only
git push
예상 결과: clone 뒤 remote -v에 같은 origin의 fetch·push URL이 표시됩니다. 원격에만 새 커밋이 없다면 HEAD..origin/main 로그와 diff는 비어 있을 수 있습니다. 원격이 앞서 있고 이력이 갈라지지 않았다면 pull --ff-only 후 작업 파일과 HEAD가 원격 커밋으로 이동합니다. push할 로컬 커밋이 없으면 Everything up-to-date가 정상입니다.
5. 명령어가 동작하는 이유
원격 추적 브랜치는 마지막 fetch 시점의 원격 상태를 로컬에 표현합니다. HEAD..origin/main은 원격에만 있는 커밋을 조회합니다. pull --ff-only는 분기된 이력이 있으면 자동 병합하지 않고 멈추므로 초보자가 상태를 먼저 판단할 수 있습니다.
반대 비교인 origin/main..HEAD는 로컬에만 있어 push 후보가 되는 커밋을 보여 줍니다. push 전에는 git status, 두 방향의 log, staged/unstaged 변경을 확인해야 추적되지 않은 파일이나 커밋하지 않은 작업을 백업했다고 착각하지 않습니다.
6. 자주 하는 실수와 안전한 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
10. 다음 강의 연결
원격과 로컬의 차이를 방향별로 읽었습니다. 다음 강의에서는 기능 작업을 별도 브랜치에 격리하고 원격과 안전하게 공유합니다.
clone, push, pull, fetch의 차이 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.