Git을 사용하여 로컬 프로젝트를 초기화하고, GitHub에 파일을 업로드
- git init - 로컬 프로젝트에서 Git 초기화
- git add . - 모든 파일을 스테이지에 추가
- git commit -m "메시지" - 커밋
- git remote add origin <URL> - 원격 저장소 연결
- git push -u origin main - GitHub에 푸시
1. Git 저장소 초기화 (git init)
로컬 프로젝트에서 Git을 사용하려면 먼저 Git 저장소를 초기화해야 합니다. 프로젝트 폴더 내에서 다음 명령어를 실행합니다:
git init
이 명령어는 .git 디렉토리를 생성하여, 해당 폴더를 Git 저장소로 변환합니다.
2. 파일 스테이징 (git add)
Git에 변경된 파일을 추가하려면 git add 명령어를 사용하여 파일을 스테이지 상태로 만들어야 합니다. 모든 파일을 추가하려면:
git add .
특정 파일만 추가하려면 파일 이름을 지정합니다:
git add 파일이름
3. 첫 번째 커밋 (git commit)
스테이지에 올린 파일을 커밋하려면 git commit 명령어를 사용합니다. -m 옵션으로 커밋 메시지를 작성할 수 있습니다.
git commit -m "첫 번째 커밋 메시지"
4. GitHub 원격 저장소 연결
GitHub에 리포지토리를 만들고 원격 저장소를 추가해야 합니다.
- GitHub에서 새 리포지토리를 생성합니다.
- 생성된 리포지토리에서 "Quick setup" 부분에 있는 URL을 복사합니다.
원격 저장소를 추가하려면 다음 명령어를 실행합니다:
git remote add origin https://github.com/사용자이름/리포지토리이름.git
예시:
git remote add origin https://github.com/johndoe/my-repository.git
5. 파일을 GitHub에 푸시 (git push)
원격 저장소를 추가한 후, 로컬 변경 사항을 GitHub에 푸시합니다. -u 옵션은 첫 번째 푸시에서만 원격 저장소의 브랜치를 추적하도록 설정합니다.
git push -u origin master
만약 기본 브랜치가 main인 경우, 아래와 같이 푸시합니다:
git push -u origin main
이 명령어는 로컬의 master(또는 main) 브랜치를 GitHub의 원격 저장소에 푸시합니다.
6. 푸시할 때마다 git push 사용
이후 변경 사항을 푸시할 때는 git push만 입력하면 됩니다:
git push
7. GitHub에 업로드된 파일 확인
GitHub 웹사이트에 로그인하여 리포지토리 페이지로 이동하면, 업로드된 파일을 확인할 수 있습니다.
1. 새로운 브랜치 만들기
git branch 브랜치이름
예를 들어, feature-xyz라는 이름의 브랜치를 만들고 싶다면:
git branch feature-xyz
이 명령어는 새로운 브랜치를 만들지만, 해당 브랜치로 전환하지는 않습니다. 단지 브랜치만 생성됩니다.
2. 새 브랜치로 전환하기
새 브랜치를 만든 후, 해당 브랜치로 전환하려면 git checkout을 사용합니다:
git checkout 브랜치이름
예를 들어, feature-xyz 브랜치로 전환하려면:
git checkout feature-xyz
3. 브랜치 만들고 바로 전환하기
브랜치를 만들고 바로 전환하려면 -b 옵션을 사용할 수 있습니다:
git checkout -b 브랜치이름
예를 들어, feature-xyz라는 브랜치를 만들고 바로 전환하려면:
git checkout -b feature-xyz
4. git switch 명령어 사용하기 (Git 2.23 이상)
Git 2.23 이상에서는 git switch 명령어를 사용하여 브랜치를 만들고 전환할 수 있습니다. 이 명령어는 checkout을 좀 더 직관적으로 사용할 수 있게 도와줍니다.
- 브랜치 만들고 전환하기:
git switch -c 브랜치이름
예를 들어, feature-xyz라는 브랜치를 만들고 바로 전환하려면:
git switch -c feature-xyz
이렇게 하면 새 브랜치를 만들고, 동시에 그 브랜치로 전환됩니다.
1) 큰 지도(멘탈 모델)
- 원격(Remote): 보통 origin이라는 이름으로 GitHub 같은 서버 연결.
- 원격 트래킹 브랜치: origin/main 처럼 “원격 상태를 로컬에 캐시한 포인터” (읽기 전용).
- 로컬 브랜치: main, feature/foo 같은 네 작업 브랜치.
- 업스트림(upstream): 로컬 브랜치가 기본적으로 비교/동기화할 원격 브랜치. 보통 main ↔ origin/main.
2) Remotes (원격 관련)
가장 자주 쓰는 것
git remote -v # 원격 목록/URL 보기
git remote add origin <URL> # 원격 추가
git remote remove origin # 원격 제거
git remote rename origin upstream # 원격 이름 변경
git remote set-url origin <NEW_URL> # 원격 URL 변경(https ↔ ssh 등)
언제 쓰나?
- 새 저장소에 GitHub 연결할 때: remote add.
- HTTPS → SSH 전환, 레포 이동: remote set-url.
- 포크/원본 둘 다 쓰고 싶을 때: origin, upstream 두 개 두고 관리.
3) fetch · pull · push 차이
fetch
git fetch origin # 원격의 최신 커밋들만 가져와서 origin/* 갱신, 내 작업트리/로컬브랜치는 그대로
git fetch --all # 모든 원격 갱신
- 언제? 원격 최신 상태를 로컬에 반영만 하고 싶을 때(병합/리베이스는 나중에 내가 결정).
pull = fetch + (merge 또는 rebase)
git pull origin main # fetch 후 자동 merge
git pull --rebase origin main # fetch 후 내 커밋을 origin/main 위로 rebase (히스토리 깔끔)
git config pull.rebase true # 앞으로 pull은 기본 rebase로
- 언제? “원격 변화와 내 작업을 합치고 싶다.”
- 팀에서 선호에 따라 merge 또는 rebase 선택.
push
git push -u origin main # 원격으로 올리기(+ upstream 설정)
git push # upstream 설정돼 있으면 간단히 push
git push --force-with-lease # (주의) 강제 푸시. 언제나 with-lease 사용
- 언제? 내 로컬 커밋을 원격 브랜치에 반영.
- “non-fast-forward” 에러 나면, 먼저 fetch/pull로 통합하는 게 정석.
4) branch · switch · checkout (브랜치 작업)
브랜치 명령들
git branch # 로컬 브랜치 목록
git branch -vv # 업스트림 정보까지
git branch -m old new # 브랜치 이름 변경
git branch --set-upstream-to=origin/main main # 업스트림 수동 설정
브랜치 이동/생성
git switch main # 브랜치로 전환
git switch -c feature/login # 새 브랜치 만들고 전환
# (구문 참고) git checkout main / git checkout -b feature/login 도 같지만,
# 요즘은 switch를 권장
언제 쓰나?
- 새 작업 시작: git switch -c feature/…
- 메인으로 돌아오기: git switch main
- 업스트림 설정 필요할 때: git branch --set-upstream-to=…
5) merge vs rebase (통합 전략)
merge
git switch main
git merge feature/login # 머지 커밋 생성(비선형), 충돌나면 해결 후 커밋
- 장점: 안전, 공개 이력 보존.
- 단점: 머지 커밋이 많아지면 그래프가 복잡.
rebase
git switch feature/login
git rebase main # feature의 커밋들을 main 위에 “재적용”
# 충돌 해결 후:
git add <files>
git rebase --continue
- 장점: 이력이 일자형으로 깔끔. 리뷰/탐색 용이.
- 주의: 공유된 브랜치(이미 푸시/공유) rebase 금지. 로컬에서만, 아니면 강제 푸시 필요.
언제 뭘 쓰나?
- 팀 합의 없이 안전하게: merge.
- 개인 작업 깔끔히 정리해서 올리기 전: rebase 후 push.
- git pull --rebase를 습관화하면 불필요한 merge 커밋 줄어듦.
6) 자주 겪는 시나리오와 정확한 해법
A) “non-fast-forward”로 push가 거절될 때(로컬이 뒤처짐)
git fetch origin
git rebase origin/main # 또는 git merge origin/main
# 충돌 해결 → add → rebase --continue (or merge commit)
git push
B) 새 로컬 repo 초기화 → GitHub에 첫 푸시
git init
git add .
git commit -m "Initial commit"
git branch -M main
git remote add origin <URL>
git push -u origin main
C) 원격에 이미 초기 커밋(README 등)이 있어서 “unrelated histories”
git fetch origin
git switch -c main 2>/dev/null || git switch main
git pull origin main --allow-unrelated-histories
# 충돌 해결 후 커밋
git push
D) 실수로 잘못 커밋(메시지 수정/내용 추가)
git commit --amend # 직전 커밋 수정(메시지/스테이지 포함)
# 이미 푸시했다면 —force-with-lease 필요(주의)
E) 로컬에서만 되돌리고 싶다(reset) vs 공개 이력 유지(revert)
- reset(히스토리 재작성, 로컬에서 과감히 되돌림)
git reset --soft HEAD~1 # 커밋만 되돌리고 변경은 스테이징 상태 유지
git reset --mixed HEAD~1 # (기본) 스테이징 해제
git reset --hard HEAD~1 # 변경까지 완전 삭제(주의)
- revert(안전하게 “되돌리는 커밋”을 새로 만들어서 공개 이력 유지)
git revert <commit_sha>
F) 임시로 변경사항 치워두기(stash)
git stash push -m "wip: hero gsap"
git switch main
git stash list
git stash apply stash@{0}
G) 특정 커밋만 따오고 싶다(cherry-pick)
git cherry-pick <commit_sha>
H) 복구가 필요할 때(reflog)
git reflog # HEAD 이동 기록
git reset --hard HEAD@{3} # 3단계 전 상태로 되돌림(위험, 조심)
7) 업스트림/푸시 기본 설정 팁
업스트림 한 번에 잡기:
git push -u origin main
이후에는 그냥:
git push
git pull --rebase
기본 동작을 깔끔히:
git config --global pull.rebase true # pull 시 rebase 기본
git config --global push.default simple # 현재 브랜치를 동일 이름으로 푸시
8) 실전 습관(추천 워크플로우)
- 작업 시작 전 항상 원격 갱신
git fetch origin
git switch main
git pull --rebase
- 작업 브랜치 생성
git switch -c feature/bubbles-perf
- 커밋/푸시
git add -A
git commit -m "Improve bubbles perf with instancing"
git push -u origin feature/bubbles-perf
- PR 만들기 → 리뷰 → 머지(팀 규칙에 따라 merge/rebase/squash)
- 로컬 메인 갱신
git switch main
git pull --rebase
git branch -d feature/bubbles-perf
'Deployment > GitHub' 카테고리의 다른 글
| Github Actions (1) | 2026.05.05 |
|---|---|
| Learn Git Branching (2) remote (0) | 2026.05.01 |
| GitHub Skills (0) | 2026.04.30 |
| Learn Git Branching (1) main (0) | 2026.04.30 |
| 버전 관리와 깃(Git) (0) | 2025.12.01 |