Git과 GitHub의 이해

2024. 11. 19. 11:44기반기술/Git, Github

1. Git과 GitHub

 

1-1. Git: 분산 버전 관리 시스템

  • 소프트웨어 개발 프로젝트에서 소스 코드의 변경 사항을 추적하고 여러 사람이 협업할 때 사용된다. 
  • 원하는 시점마다 깃발을 꽂고 깃발이 꽂힌 시점으로 자유롭게 이동 가능한 소스코드 버전 관리 시스템.
  • 기능: 버전 관리, 브랜치, 협업 
  • 버전 관리 시스템:  파일 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전을 다시 꺼내올 수 있는 시스템이다. 
  • 분산 시스템: "원격저장소"와 "지역저장소"
    • Git은 분산시스템으로 저장소가 두 곳에 존재한다.
    • (1) 서버 등 네트워크에 있는 원격 저장소 (Remote Repository)
    • (2) 자신의 컴퓨터에 있는 지역 저장소 (Local Repository)
    • 기본적으로 원격저장소에 있는 파일을 로컬저장소로 가져와 작업을 수행하고, 그 결과를 원격저장소에 저장(반영)하는 것이다.

 

1-2. GitHub: Git을 기반으로 하는 웹 기반 호스팅 서비스

  • GitHub는 Git의 호스팅 사이트 중 하나이다. (GitLab, BitButcket 등 존재)
  • 소스 코드를 저장하는 "원격 저장소" 역할을 한다
  • 기능: Pull Request(기능 요청), Issue Tracking(버그 추적), 문서화 및 위키
  • Git은 버전 관리 시스템이고 GitHub는 서비스이다. 
 

 

2. Git 용어 정리

 

2-1. 용어

  • Git Bash : CLI 방식으로 Git을 사용할 수 있는 환경
    • CLI(Command Line Interface) - 명령어를 입력하는 방식
    • GUI(Graphic User Interface) - 마우스로 클릭하는 방식 (Github desktop, Sourcetree 등)
    • GUI 방식으로 제공되는 툴(소스트리 등)도 다양
  • Project Source Code
    • 소스코드가 있는 프로그램 작성 파일
    • 예: README.txt, first.md 등등 
  • Staging Area (=Index Area)
    • 커밋 할 것들을 담아놓는 임시 공간
    • 커밋 하나에 포함할 변경 사항을 선택할 수 있기 위함
    • ’버그 수정’과 ‘신기능 추가’를 구분해서 커밋할 수 있다.
  • Local Repository (=지역 저장소, .git directory) 
    • 프로그래머가 프로젝트 소스코드를 개발중인 컴퓨터에 마련하는 지역 저장소
    • git init 명령어를 통해 .git 폴더가 생성되어 있는 디렉토리를 말한다. 
    • 예: Desktop/gitLocalTest/test 폴더
  • Remote Repository (=github)
    • 작업중인 컴퓨터가 아닌 원격지에 마련하는 원격 저장소 혹은 공유 저장소
    • github나 gitlab이 이에 해당됨

 

2-2. git 명령어 

  • add
    • 변경/추가된 파일을 Staging Area에 올려놓는 작업
    • 커밋할 파일의 범위 설정 (커밋 준비단계) 
  • commit
    • Staging Area에 올라온 변경 사항을 Local Repository에 저장하는 작업
    • 이렇게 저장된 어느 시점의 프로젝트의 상태를 리비전(revision) 혹은 커밋이라고 한다.
    • 각 커밋은 고유한 해시 값(커밋 ID)으로 식별된다. 
  • push : Local Repository에만 있던 것을 Remote Repository로 올리는 작업
  • fetch
    • Remote Repository로부터 필요한 파일을 Local Repository로 받음 (변경 내역)
    • git fetch로 가져온 변경사항은 로컬 저장소의 .git 폴더 내부에만 저장되고, 프로젝트 파일은 영향을 받지 않는다. 
    • fetch로 가져온 원격 브랜치의 최신 커밋의 해시 값을 저장하는 곳: .git/refs/remotes/origin/main 파일
  • merge 
    • Local Repository에 있는 변경 사항을 Project에 직접 합치면서 반영하는 작업
    • git fetch로 가져온 변경 내역은 merge를 실행해야만 반영된다 
    • Remote Repository에서 받은 것과 내 Project 간에 conflict(충돌)이 발생할 수 있음
  • pull
    • fetch와 merge를 한번에 처리할 때 사용
    • merge와 마찬가지로 conflict가 발생할 수 있기 때문에 fetch와 merge를 따로 진행하는 것이 추천되기도 한다.
  • merge 충돌 방지 방법 

    pull로 바로 가져오기 보다 fetch 후에 변경 사항을 확인한 뒤, 만약 충돌 가능성이 있는 파일이나 커밋이 보인다면, 미리 병합하지 않고 수정하거나 브랜치를 조정할 수 있다. 

    1. git log origin/main --oneline: 원격 브랜치의 커밋 내역을 확인.
    2. git diff origin/main: 로컬 브랜치와 원격 브랜치의 차이점(파일 변경)을 확인. (아직 커밋 되지 않은 로컬 코드도 비교 가능함)
    3. git status: 로컬 브랜치가 원격 브랜치와 어떻게 다른지 상태 확인.
    4. git log --oneline: 로컬 브랜치의 커밋 내역을 확인.

     

3. Git 명령어 실습 - 로컬 저장소 

3-1. 로컬 저장소 만들기

1. 로컬 저장소로 사용할 디렉토리 만들기 (Desktop/gitLocalTest/test)

2. 변경 이력을 추적할 프로젝트 파일 만들기 (README.txt)

3. Desktop/gitLocalTest/test 파일 내에서 Git Bash Here 클릭 (해당 경로 내에서 실행됨)

바로 Git Bash창을 키는 경우에는 cd Desktop/gitLocalTest/test 해줘야 함 (경로 이동) 

 

4. 전역 설정 값 입력 

#설정하기 
$ git config --global user.email "GitHub이메일"
$ git config --global user.name "GitHub이름"

#확인해보기 
$ git config --get user.email
$ git config --get user.name

 

--global : 해당 설정이 로컬 컴퓨터의 모든 레포지토리에 적용된다 (전역 설정)

 

git config의 범위 | --global

git config --global user.email "global@example.com"--global의 의미 git config 명령어에서 설정의 범위(scope)를 정해주는 옵션이 옵션을 사용하면, 해당 설정이 모든 깃 프로젝트(레포지토리)에 공통적으로 적

hnjee.tistory.com

 

5. 기본 브랜치 이름 설정 

$ git config --global init.defaultBranch main

$ git config --get init.defaultBranch
  • 새로 생성되는 로컬 저장소의 기본 브랜치 이름(default branch)을 **main**으로 설정
  • 깃의 초기 기본 브랜치 이름은 예전엔 master였지만, 최근엔 main을 사용하는 경우가 많아졌다. 
  • 이 명령어를 실행하면 앞으로 git init으로 저장소를 만들 때, 기본 브랜치 이름이 main으로 설정된다.

 

6. 로컬 저장소 생성/초기화 

$ git init

#'Initialized empty Git repository' 나오면 성공

 

git init 완료 -> Desktop/gitLocalTest/test 폴더 안에 .git이라는 숨겨진 폴더가 생성됨 

  • .git 폴더는 깃이 사용하는 중요한 데이터(히스토리, 커밋 정보 등)를 저장하는 곳
  • 깃은 이 .git 폴더를 보고 "아, 여기부터는 내가 추적해야 하는 레포지토리구나!"라고 인식한다.
  • 이후에 README.txt 파일을 수정하거나 새로 추가하면, 깃은 그 변화를 추적할 준비가 된다.

 

3-2. 로컬 저장소에 commit 

#commit에 추가할 파일 선택
$ git add README.txt

#메세지 적어 커밋하기 (-m: message)
$ git commit -m "first commit"

#작업 트리 상태 출력
$ git status

#변경 사항 확인
$ git diff

 

git add 범위 참고

# 특정 파일만 인덱스에 등록
$ git add README.txt 

# 변경한 파일을 전부 인덱스에 등록(변경한 기존 파일만 등록)
$ git add -u 

# 모든 파일을 인덱스에 등록(새로 작성한 파일까지 등록)
$ git add -A
# 또는 
$ git add .

  

 

3-3. 로컬 저장소의 다른 commit으로 돌아가기

# 변경 이력 확인
$ git log

# 변경 이력과 함께 차이점 표시(끌 때는 q)
$ git log -p

# 이전 커밋과의 차이 확인
$ git diff 커밋아이디

# 커밋 아이디 앞 7자리를 복사하여 해당 커밋으로 코드를 되돌릴 수 있다
$ git checkout 커밋아이디

# 가장 최신 커밋으로 돌아가기 
$ git checkout -
 

4. Git 명령어 실습 - 원격 저장소 

4-1. 원격 저장소 만들기 

Github에서 create repository

 

4-2. 로컬 저장소에 원격 저장소의 주소를 추가

$ git remote add origin https://github.com/유저아이디/원격저장소이름.git
  1. git remote add
    • 로컬 저장소에 새로운 원격 저장소를 추가하는 명령어.
    • add 다음에 이름(별칭)과 URL을 지정해야 한다.
  2. origin
  3. https://github.com/유저아이디/원격저장소이름.git
    • 연결할 원격 저장소의 URL.
    • HTTPS URL을 쓰는 경우가 많지만, SSH 키를 설정했다면 SSH URL을 사용할 수도 있다.
      예: git@github.com:유저아이디/원격저장소이름.git

위 명령어를 입력하면

  • 로컬 저장소에 origin이라는 이름으로 지정된 원격 저장소가 추가된다. 
  • 이 원격 저장소와 연결된 URL은 깃이 기억한다.

참고 명령어 

#원격 저장소 목록과 각 저장소의 URL 확인
git remote -v

#원격 저장소 URL 변경
git remote set-url origin 새로운-URL

#원격 저장소 삭제 
git remote remove origin

 

 

4-3. 원격 저장소에 로컬 저장소의 커밋 내보내기 (push)

# git push <원격 저장소 이름> <브랜치 이름>

$ git push origin main

로컬 저장소의 main 브랜치 내용을

원격 저장소(origin)의 main 브랜치에

업로드(push)하는 작업

 

 

4-4. 원격 저장소의 커밋을 로컬 저장소에 내려받기 (clone, pull) 

1. clone 

#git clone <원격 저장소 URL> <복제할 디렉토리 경로>
$ git clone https://github.com/유저아이디/원격저장소이름.git .

 

  • 원격 저장소 전체로컬 경로에 복제하는 명령어.
  • 즉, 원격 저장소의 모든 파일, 폴더, 브랜치, 커밋 이력을 로컬에 그대로 복사해온다. 
  • 원격 저장소 주소 뒤의 마침표: 현재 폴더를 뜻함 

2. pull (fetch + merge)

#git pull <원격 저장소 이름> <브랜치 이름>
$ git pull origin main

 

  • 원격 저장소(origin)의 지정된 브랜치(main)에서 새로운 커밋로컬 저장소로 가져와 병합하는 명령어.
  • 즉, 원격 저장소의 최신 상태를 로컬 저장소의 현재 브랜치에 반영한다.