[GitHub]⭐GitHub에 로컬 저장소(PC)의 프로젝트 업로드
Git의 기본 개념
- 분산 버전 관리 시스템 (DVCS)
- 분산형 구조 : Git은 중앙 서버에 의존 ❌, 사용자의 로컬 저장소(PC)의 작업 공간, 스테이징 영역, 로컬 리포지토리, 원격 리포지토리로 여러 영역으로 구분되어 전체 내용 관리 ➡️ 오프라인에서도 버전 관리 가능, 협업 시 분산 환경에서 높은 유연성 제공
- 이력 관리 : 각 커밋(commit)은 변경 사항과 함께 메타데이터(작성자, 시간, 메시지 등) 저장 ➡️ 파일의 변경 과정을 상세히 기록
- 주요 영역 : 작업 디렉토리, 인덱스(스테이징 영역), 저장소
- 작업 디렉토리 (Working Directory) : 현재 작업하고 있는 프로젝트 파일들이 있는 디렉토리. 파일을 수정하면 이곳에 변경 사항 발생
- 스테이징 영역 (Index or Staging Area) : 커밋할 변경 사항들을 일시적으로 보관하는 공간, 커밋에 포함될 파일들을 선택적으로 추가 가능, git add 명령어로 추가한 파일들이 모여있는 공간
- 로컬 저장소 (Local Repository) : 실제 커밋 기록이 저장되는 곳, git commit 명령어로 스냅샷(커밋)을 생성
로컬 저장소(PC)에 Git 설치 및 초기 설정
[Git] Git 설치 (윈도우)
[Git] Git 설치 (리눅스 - Ubuntu)
💡 전체 단계 흐름
- init(Git 초기화) → add(파일 추가) → commit(커밋) → remote(원격 저장소 연결) → push(푸시)
- 로컬에서 먼저 작업을 시작한 경우 (GitHub 저장소에 아무 내용이 없을 때)
cd /path/to/your/project
git init
#git status
git add .
git commit -m "Initial commit"
#git log
git branch -M main
#git branch
git remote add origin [url]
#git remote -v
#git pull origin main --allow-unrelated-histories
git push -u origin main
- 커밋은 로컬 Git 저장소 내부에서의 작업 (원격 저장소와 무관)
- 그다음 원격 저장소 연결 후 커밋된 내용 푸시
- GitHub에 ReadME.md / .gitignore 등 먼저 생성한 경우 or GitHub 저장소에 커밋이 이미 1개 이상 있는 경우
- 로컬은 별개의 커밋이 있으므로, push 시 충돌 발생
- ➡️ 이럴 경우, push 전에 pull 명령어(git pull origin main --allow-unrelated-histories)실행
✨ 두 번째 업로드 (수정 후 재업로드) 순서
- add(파일 추가) → commit(커밋) → push(푸시)
git add .
git commit -m "수정 내용 설명"
git push
- 'git init', 'git remote add origin','git branch -M main'은 한 번만 하면 됨 (이미 연결된 상태, 다시 할 필요 ❌)
- git push만 하면 자동으로 이전에 연결해 둔 원격 저장소에 업로드
- 'git status'로 변경된 파일 확인, 'git log'로 커밋 이력 확인
✨ 특정 브랜치에서 git commit 기록을 시작하고 싶을 때
cd /path/to/your/project
git init
git branch -M main
git add .gitignore .gitattributes
git commit -m "Initial Commit" # main 브랜치 설정 후 최초 커밋 해야 함
git remote add origin [url]
git push -u origin main
git switch -c <new 브런치> # dev 브랜치를 생성하고 여기에 기록하고 싶을 때
git add .
git commit -m "~~~ Commit"
git push --set-upstream origin <new 브런치> # GitHub에는 dev 브랜치가 없기 때문에 해당 명령어 실행
1. GitHub에 New Repository 생성
- 깃허브 로그인 후 New repository 생성
- README, .gitignore 추가하지 말고 Create repository 클릭
- 저장소 비워둬야 로컬이랑 충돌 ❌
이미 README, .gitignore, 파일 등이 올라가 있으면 로컬 프로젝트랑 커밋 기록이 달라서 error 발생
이럴 땐 "git pull origin main --allow-unrelated-histories"로 병합, 로컬이나 원격 중 하나를 초기화
2. 로컬 저장소(PC)의 프로젝트 폴더 Git 초기화
2-1. 터미널에서 프로젝트 폴더로 이동
cd /path/to/your/project
2-2. Git 초기화 (처음 한 번만 하면 됨)
- git init : 폴더를 Git 저장소로 만듦
- git status : Git 상태 확인, 현재 작업 디렉토리의 변경 사항 및 스테이징 영역의 상태 확인
git init
#git status
3. Git에 파일 추가 및 커밋
3-1. 모든 파일 Git에 추가 (스테이징 영역에 추가)
- git add . : 상위 폴더의 모든 하위 폴더 및 파일 추가
- git add "A Project" "B Project" : 상위 폴더 안 특정 하위 폴더(A Project, B Project) 및 파일 추가
- 폴더에 공백이 포함된 경우에는 따옴표로 묶어서 사용
git add .
#git add "A Project" "B Project"
3-2. 커밋 생성
- git commit -m : 커밋 생성 및 커밋 메시지 작성
- git log : 저장소의 커밋 히스토리 확인 명령어
git commit -m "Initial commit"
# git log
4. 기본 브랜치 설정
4-1. 기본 브랜치 설정 (처음 한 번만 하면 됨)
- git branch -M main : main 브랜치에 업데이트
- '-M' : 브랜치명 변경
- git branch <브랜치명> : 브랜치 생성
- git branch : 로컬 브랜치 목록 조회 (옵션 -r, -a)
git branch -M main
#git branch
4-2. 브랜치 생성 및 전환, 병합
- git switch/merge 추가 설명은 아래 7-3 참고
- 만약, develop 브랜치에서 개발 작업을 한 후 main에 병합하지 않고,
- develop 브랜치 그대로 git push를 사용해 업로드 시
- "fatal: The current branch develop has no upstream branch." 라는 에러 메시지가 뜨는데
- 이는 develop 브랜치가 원격 저장소에는 업데이트 되지 않은 상태이기 때문에 발생하는 문제
- 해결 : git push --set-upstream origin develop 명령어 사용하면 됨.
#git switch -c develop
# develop 브랜치에서 개발 작업 후 -> git add -> git commit -m
#git switch main
#git merge develop
5. 원격 저장소 연결 및 푸시
5-1. 원격 저장소 연결 (처음 한 번만 하면 됨)
- git remote add <원격 저장소명> <원격 저장소 URL> : 로컬 저장소에 원격 저장소(GitHub Repository) 연결
- PC와 GitHub 사이에 연결이 설정됨
- 이후 git push/git pull 명령어 사용 가능
- origin : 원격 저장소 이름 지정 (다른 이름 사용 가능)
- git remote -v : 원격 저장소 상태 확인
git remote add origin https://github.com/username/repository.git
#git remote -v
5-2. 원격 저장소 pull & push
- git pull origin <브랜치명> : 원격 저장소의 변경 사항을 로컬에 병합 (동기화)
- 원격 저장소(GitHub)의 변경 사항을 가져와 로컬(PC)에 병합
- --allow-unrelated-histories : 서로 다른 커밋 히스토리 강제 병합
- 주로 이런 상황에서 사용
- 1️⃣ GitHub에서 README.md /. gitignore를 먼저 생성한 후
- 2️⃣ 로컬에서 git init 후 커밋하고 푸시하려고 할 때
→ 히스토리가 달라서 충돌남
→ 그래서 '--allow-unrelated-histories'로 강제 병합 허용
- git push origin <브랜치명> : 로컬에서 만든 커밋을 원격 저장소에 업로드
- 로컬 저장소의 main 브랜치를 GitHub에 업로드
- '-u' : upstream 트래킹 정보 설정. (다음부터 원격 저장소와 브랜치 생략 가능)
- git push만 입력해도 origin의 main 브랜치로 푸시됨
#git pull origin main --allow-unrelated-histories
git push -u origin main
6. GitHub 확인
- GitHub Repository에 파일 업로드 확인 가능
6. 추가 : GitHub에 로컬 저장소(PC)의 프로젝트 폴더 구조 그대로 업로드
6-1. 폴더 구조 업로드 (요구 조건)
로컬 저장소(PC)의 "E:\Source Code" 폴더 안에
'A Project', 'B Project', 'C Project'의 하위 폴더가 있고,
각 폴더에는 프로젝트별 코드 파일 및 기타 파일이 존재함.
이 Source Code 폴더의 구조 그대로 원격 저장소(GitHub)에 업데이트하고 싶음.
6-2. 2번(로컬 저장소(PC)의 프로젝트 폴더 Git 초기화)까지는 동일
6-3. Git에 파일 추가 및 커밋 - git add, git commit
- 모든 폴더 및 파일 추가
git add .
git commit -m "Add All Folders"
- 상위 폴더 내 특정 하위 폴더 및 파일만을 추가
git add "A Project" "B Project"
git commit -m "Add folders a and b"
6-4. 원격 저장소(GitHub Repository) 연결 및 푸시 - git pull, git push
git branch -M main
git remote add origin https://github.com/YourUsername/YourRepositoryName.git
# GitHub에서 리포지토리를 먼저 생성하였으므로 git push 전 git pull 먼저 실행
git pull origin main --allow-unrelated-histories
# 로컬 저장소(Source Code 폴더)의 main 브랜치를 GitHub에 업로드
git push -u origin main
6-5. Source Code 폴더 구조 및 파일들이 그대로 GitHub Repository에 잘 업로드되었는지 확인
7. 기타 유용한 Git 명령어 및 기능
7-1. git log / 커밋 로그 확인
- git log : 이전 커밋 내역 확인
git log
# 한 줄로 요약해서 확인하려면
#git log --oneline
7-2. git remote remove origin / 원격 저장소 제거
- git remote remove origin : 원격 저장소(GitHub) 제거
git remote remove origin
7-3. git branch / 브랜치 목록 조회
- git branch : 로컬 브랜치 목록 조회
- git branch -r : 원격 브랜치 목록 조회
- git branch -a : 모든 브랜치 목록 조회
#git fetch --all
git branch
git branch -r
git branch -a
7-4. git switch, git merge / 브랜치 전환 및 병합
- git switch <브랜치명> : 작업할 브랜치 전환
- git switch <브랜치명> : 작업할 브랜치 전환
- git switch -c <브랜치명> : 브랜치 생성과 전환을 동시에 ('git branch <브랜치명>' + 'git switch <브랜치명>')
- -c : create
-
더보기
- git checkout <브랜치명> : 작업할 브랜치 전환
- git checkout -b <브랜치명> : 브랜치 생성과 전환을 동시에
- 기존의 git checkout 대신 git switch 사용 이유는 이 블로그 참고 : git switch 명령어란? — 제이크서 위키 블로그
git switch develop
git switch -c <브랜치명>
#git checkout <브랜치명>
#git checkout -b <브랜치명>
- git merge <브랜치명> : 작업 완료 후 개발한 기능을 메인 브랜치로 병합
- 1️⃣ develop 브랜치에서 개발 후 병합을 위해 main 브랜치로 우선 전환
- 2️⃣ develop 브랜치를 main 브랜치에 병합 (main 브랜치에 전환 후 git merge 명령어를 실행해야 함)
- 병합 전, 작업 내용이 커밋되어 있는지 꼭 확인. 커밋하지 않으면 병합 ❌
git switch main
git merge develop
# develop(작업 브랜치) 생성/전환 후 main 브랜치에 병합 과정
# git switch -c develop (== git branch develop + git switch develop)
# develop 브랜치에서 개발 작업 후 -> git add -> git commit -m
# git switch main
# git merge develop
- 충돌(Conflict) 해결 : 병합 과정에서 충돌(Conflict) 발생할 수 있음. 충돌 파일 열어 수동으로 수정하고 다시 커밋
git add <충돌해결된 파일>
git commit -m "충돌 해결 커밋 메시지"
7-4. git diff / 변경 사항 확인
- git diff : 수정한 내용의 세부적인 차이를 확인해 볼 수 있는 명령어
git diff
7-5. git stash / 임시 변경사항 저장
- git stash : 현재 작업 중인 변경사항을 임시 보관, 다른 작업을 하거나 브랜치 전환 시 유용
- git stash pop 명령어로 복원 가능
git stash
7-6. git tag / 태그(Tag) 사용
- git tag : 특정 시점을 명시적으로 기록할 때 태그 추가 가능
git tag -a v1.0 -m "첫 번째 릴리즈"
7-7. git fetch / 원격 저장소의 최신 상태 확인
- git fetch : 원격 저장소의 최신 정보 및 변경 내용 확인
- 브랜치 목록 / 커밋 히스토리 / 태그 등 원격 저장소의 최신 상태만 로컬에 복사
- 원격 저장소의 최신 정보를 가져오되, 로컬에는 절대 영향 ❌ (로컬 브랜치 or 파일 변경 ❌)
- git pull vs git fetch
- git pull origin main : 원격 저장소의 변경사항 실제로 가져오고 로컬의 main 브랜치에 병합
- 비유하자면, "스크랩해오고 그 내용으로 현재 신문을 업데이트하는 것"
- 로컬 브랜치가 실제로 바뀜
- 최신 내용 바로 반영하고 싶을 때 사용
- 병합 충돌 가능성 ⭕
- git fetch --all : 원격 저장소의 변경사항 가져오기만 함
- 비유하자면, "뉴스 기사 스크랩만 해오는 것"
- 원격 추적 브랜치(orgin/브랜치)만 업데이트
- 변경 내용 확인 / 수동 병합
- 안전 (변경 사항 ❌)
- git pull origin main : 원격 저장소의 변경사항 실제로 가져오고 로컬의 main 브랜치에 병합
git fetch --all
# 원격저장소의 브랜치 내용도 같이 로컬 git에 가져올 때,
git branch -a
git switch -c develop origin/develop
git switch -c docs origin/docs
git switch main
git branch -a
- fetch 이후 작업 (보통 아래 둘 중 하나)
- git merge origin/<branch> : 현재 브랜치에 가져온 내용 병합 (git merge origin/develop)
- git switch -c <local-branch> origin/<remote-branch> : 로컬에 원격 브랜치 동기화 및 추적 시작
- git switch -c develop origin/develop : origin/develop 브랜치를 기준으로 로컬 develop 브랜치가 생성
- git switch -c docs origin/docs : origin/docs 브랜치를 기준으로 로컬 docs 브랜치가 생성
- 로컬의 main에서 갈라지는 게 아닌, 로컬 브랜치 상태와 원격 브랜치 상태를 동기화

로컬 브랜치
develop
docs
* main (* : 지금 체크아웃 중인 브랜치라는 뜻!)
원격 브랜치 (remotes/origin/*)
remotes/origin/main ➡️ 원격 저장소의 main 브랜치
remotes/origin/HEAD → origin/main (기본 브랜치가 main을 가리키고 있다는 뜻!)
7-8. git pull / 원격 저장소의 데이터 ➡️ 로컬에 업데이트
- git pull : GitHub 리포지토리를 내 PC(로컬)에 그대로 복제
- 이미 연결된 저장소에서 최신의 변경 사항 가져옴
- 현재 로컬 저장소에 변경사항만 병합 or 업데이트
- 변경 사항 동기화 시
- 로컬에 해당 git 저장소가 있어야 함
- 로컬에 해당 폴더가 이미 존재할 때
- 그 후 GitHub에서 무언가를 수정했을 때
- GitHub에 업로드 되어 있는 최신 내용을 로컬로 가져올 때
#git remote add origin [url]
#git branch -M main
git pull origin main
#git add .
#git commit -m "로컬 병합"
#git push -u origin main
7-9. git clone / 원격 저장소의 데이터 ➡️ 로컬에 복제
- git clone : GitHub 리포지토리를 내 PC(로컬)에 그대로 복제
- 원격 저장소 전체를 처음부터 복제
- 새 폴더에 .git 폴더 포함 전체 복사
- 처음 셋업 시
- 다른 데이터가 있는 폴더에 하면 안됨. (겹치면 충돌 위험)
- 자주하는 실수 : 로컬에서 디렉토리 생성 후 작업하고 git init ➡️ 이 상태에서 git clone 하면 겹치거나 에러 발생
- GitHub에 업로드 되어 있는 리포지토리를 내 PC에 처음 복사할 때
- 로컬에 해당 리포지토리 폴더가 아직 없을 때
- 처음으로 리포지토리를 로컬에 가져올 때
git clone [GitHub Repository url]
cd 리포지토리명
# 원격저장소의 브랜치 내용도 같이 로컬 git에 가져올 때,
#git fetch --all
#git branch -a
#git switch -c develop origin/develop
#git switch -c docs origin/docs
#git switch main
#git branch -a