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 후에 변경 사항을 확인한 뒤, 만약 충돌 가능성이 있는 파일이나 커밋이 보인다면, 미리 병합하지 않고 수정하거나 브랜치를 조정할 수 있다.
- git log origin/main --oneline: 원격 브랜치의 커밋 내역을 확인.
- git diff origin/main: 로컬 브랜치와 원격 브랜치의 차이점(파일 변경)을 확인. (아직 커밋 되지 않은 로컬 코드도 비교 가능함)
- git status: 로컬 브랜치가 원격 브랜치와 어떻게 다른지 상태 확인.
- 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
- git remote add
- 로컬 저장소에 새로운 원격 저장소를 추가하는 명령어.
- add 다음에 이름(별칭)과 URL을 지정해야 한다.
- origin
- 원격 저장소의 별칭(alias).
- 깃은 기본적으로 원격 저장소를 origin이라는 이름으로 설정하는데, 이 이름은 원하는 별칭으로 바꿀 수 있다.
- 예: git remote add myrepo https://github.com/유저아이디/원격저장소이름.git
- 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)에서 새로운 커밋을 로컬 저장소로 가져와 병합하는 명령어.
- 즉, 원격 저장소의 최신 상태를 로컬 저장소의 현재 브랜치에 반영한다.