🐙 Git & GitHub/GIt & GitHub 기초

[GitHub]⭐GitHub에 로컬 저장소(PC)의 프로젝트 업로드

koko1177 2025. 1. 23. 22:40
반응형

 

 

Git의 기본 개념

  • 분산 버전 관리 시스템 (DVCS)
    • 분산형 구조 : Git은 중앙 서버에 의존 ❌, 사용자의 로컬 저장소(PC)의 작업 공간, 스테이징 영역, 로컬 리포지토리, 원격 리포지토리로 여러 영역으로 구분되어 전체 내용 관리 ➡️ 오프라인에서도 버전 관리 가능, 협업 시 분산 환경에서 높은 유연성 제공
    • 이력 관리 : 각 커밋(commit)은 변경 사항과 함께 메타데이터(작성자, 시간, 메시지 등) 저장 ➡️ 파일의 변경 과정을 상세히 기록

 

  • 주요 영역 : 작업 디렉토리, 인덱스(스테이징 영역), 저장소
    • 작업 디렉토리 (Working Directory) : 현재 작업하고 있는 프로젝트 파일들이 있는 디렉토리. 파일을 수정하면 이곳에 변경 사항 발생
    • 스테이징 영역 (Index or Staging Area) : 커밋할 변경 사항들을 일시적으로 보관하는 공간, 커밋에 포함될 파일들을 선택적으로 추가 가능, git add 명령어로 추가한 파일들이 모여있는 공간
    • 로컬 저장소 (Local Repository) : 실제 커밋 기록이 저장되는 곳, git commit 명령어로 스냅샷(커밋)을 생성

[Git] Git의 3가지 영역과 3가지 상태 정리

 


로컬 저장소(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 초기화)까지는 동일

New Repository 생성
git 초기화가 되어 있는 상태
.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

 

해당 Repository URL 복사
GitHub(원격 저장소)의 내용들을 PC(로컬 저장소)로 병합 후 PC의 폴더 및 파일들을 GitHub에 업데이트


    6-5. Source Code 폴더 구조 및 파일들이 그대로 GitHub Repository에 잘 업로드되었는지 확인

GitHub에 폴더와 파일들이 잘 들어간 모습

 

 


 

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 <브랜치명>')
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 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

 

반응형