Git & Github 가이드
이번시간에는 과제 수행에 앞서 Git과 Github에 대해서 알아보고 그 사용법을 간단히! 알아보겠습니다.
VCS
Version Control System(버전 관리 시스템)이라고 합니다. 버전 관리 시스템은 일반적으로 소스코드의 변경사항을 관리하고 추척하는 역할을 합니다. 최근 VCS는 곧 Git이라고 할 만큼 Git은 매우 많은 곳에서 사용되고 있습니다. 하지만 이전에는 Git 이외에도 많은 VCS 들이 있었습니다.
•
Subversion (SVN) : Java 진영에서 Git 이전에 주로 쓰던 시스템 (아직 사용하는 곳 있음)
•
CVS : SVN의 전신
•
TFS, SourceSafe : MS 진영의 VCS
모두 중앙 서버가 없으면 코드를 관리할 수 없는 중앙 집중식 시스템입니다. 이와 반대로 Git은 중앙 서버가 없어도 동작합니다. 이를 구분하기 위해 Git은 DVCS(Distributed VCS, 분산 VCS)라고 합니다.
DVCS vs VCS
VCS는 모든 작업자가 서버 하나를 바라봅니다. 따라서 서버가 없다면 아무것도 할 수 없습니다.
VCS에서 commit은 서버와 통신을 의미합니다. PC가 VCS와 동일 네트워크에 연결 되어 있지 않다면 아무런 작업을 할 수 없습니다. 이 말은 작성한 코드를 이력으로 저장할 수 없다는 의미이고, 날려먹을 수 있다는 의미입니다. 그리고 실제로도 많이 발생했던 일입니다.
반면 DVCS는 내 PC안에 로컬 저장소를 가집니다. 그리고 commit 등의 모든 작업이 내 로컬 PC에서 발생합니다. 그리고 push, pull(fetch)를 통해 원격 저장소와 동기화를 합니다. 여기서 동기화 작업 때문에 항상 git이 어려운 이유입니다.
Git 기초
Git은 모든 작업이 Local 저장소에서 이루어집니다. 이 개념은 매우 중요합니다.
만약 우리가 word를 작성하는데 인터넷에 연결되야지만 작성할 수 있다면 얼마나 불편할까요?
git 내 로컬 PC 환경에서 소스를 관리하고 github(remote - 원격 저장소) 에서 통합 관리한다고 생각해주시기 바랍니다.
Git 설치
macOS용
가이드
Windows용
가이드
Git Local 사용법 (feat. intellij)
우선 새로운 Project를 만들고 git을 초기화 시켜보겠습니다.
프로젝트 생성
Name : git_practice
Location : 원하는 위치. (window의 경우 드라이브 아래에 권장!)
Build system : Intellij
JDK : 설치했던 JDK 선택
후 Create!
Git 초기화
1.
Git 설치 경로 확인
톱니바퀴 > Settings > Version > Git
에 Path to Git executable에 정상적으로 git version이 출력되었다면 OK!
만약 빨간 줄이라면 경로를 지정해 주어야 합니다.
기본 경로
window : C:₩Program Files₩Git₩cmd₩git.exe
mac : /opt/homebrew/bin/git
2.
Git 초기화
•
VCS > Enable Version Control Integration… 선택
•
Git 선택 후 OK
•
Git 메뉴 변경 확인
Git 초기화
Git을 초기화하면 내부에선 git 명령어인
git init이 수행되어 생성한 프로젝트를 git repository(저장소)와 연결합니다.
Git 계정 설정
Git 저장소에서 사용할 계정 정보를 추가해 줍니다.
# git에서 사용될 사용자 이름
git config --global user.name "Your Name"
# ex)
git config --global user.name "th_tutor"
# git에서 사용될 사용자 메일 (github 주소와 같은 주소를 사용하길 권장!)
git config --global user.email "your@email.com"
# ex)
git config --global user.name "sparta7tutor@gmail.com"
# git 설정 확인
git config --list
# git 설정 확인 후 나오기
:q
Bash
복사
본격적으로 Git을 사용해보겠습니다.
Git을 초기화 하면 위와 같이 Git tree를 확인할 수 있습니다.
기본 Branch인 Master가 만들어지며 새로운 기능 구현 혹은 수정을 위한 분리를 위해서 별도의 Branch를 생성하여 구분할 수 있습니다!
이번 설명에는 master branch만을 다루어 보겠습니다.
Commit Tree에는 내가 commit한 이력들이 쌓이게 됩니다.
commit — 변경 사항 저장
•
commit은 작업한 내용을 저장하는 명령어입니다.
•
단순히 파일을 수정했다고 해서 Git에 반영되는 게 아니고,
반드시 commit을 해야 Git이 "버전"으로 기록합니다.
•
Repository에 저장하기 전엔 꼭 Stageing Area에 해당 코드를 add 해주어야만 commit 할 수 있습니다.
명령어
# 1. Staging Area에 main.java 파일 추가
git add main.java
# 2. Staging Area에 저장된 main.java를 Repository에 저장 이때 Staging Area에 올라와 있는 모든 파일을 한꺼번에 저장!!
git commit -m "feat: main 클래스 추가"
Bash
복사
실습은 intellij를 통한 실습으로 진행해 보겠습니다!
intellij를 통한 Commit 수행 시 add & commit이 동시에 수행됩니다.
실습
1.
클래스 생성
2.
코드 작성
3.
Commit 실행
•
commit 할 파일을 선택합니다.
•
commit message 작성합니다.
•
commit 실행합니다.
•
commit 실행 시 아래와 같은 명령어가 실행됩니다.
4.
Commit 확인
reset & revert — 변경 사항 취소
•
reset은 작업한 내용을 취소할 때 하용하는 명령어입니다.
•
단, 이 명령어는 지정한 커밋까지만 되돌릴 수 있으며 해당 커밋 "이후의 커밋"들을 전부 reset 해야합니다.
•
중간 커밋만 골라서 지우는 건 reset으로는 불가능합니다.
명령어
git reset <커밋 해시>
Bash
복사
•
revert 은 작업한 이전 commit으로 되돌리기 위한 명령어 입니다.
•
선택한 커밋의 내용을 되돌리는 새 커밋을 생성합니다
•
기존 히스토리는 그대로 보존됩니다.
•
실무/협업에서 안전하게 중간 커밋만 무효화할 때 사용됩니다.
명령어
git revert <커밋 해시>
Bash
복사
실습
•
tree에 특정 commit을 우클릭 하면 아래와 같은 메뉴가 나타납니다.
기능 이름 | 주요 목적 | Git 명령어 |
Undo Commit | 최근 커밋 취소 (파일은 유지) | git reset --soft HEAD~1 |
Revert Commit | 특정 커밋의 효과 되돌리기 | git revert <커밋> |
Drop Commit | 커밋 제거 (히스토리 수정) | git rebase -i → drop |
Revert Commit
Undo Commit, Drop Commit
branch — 브랜치 생성/삭제
•
master 브랜치 외 독립적인 작업 공간 생성/삭제할 수 있는 명령어입니다.
•
Git은 기본적으로 main 혹은 master 브랜치에서 시작되며, 기능 단위로 브랜치를 나누는 게 일반적입니다.
명령어
# 현재 브랜치 목록 보기
git branch
# 새 브랜치 만들기
git branch feature/test
# 브랜치 삭제
git branch -d feature/test
Bash
복사
실무 팁
•
브랜치 명명 규칙 예: feature/기능, fix/버그, hotfix/긴급
•
충돌 방지를 위해 팀원 간 브랜치 관리 정책을 정하는 게 중요합니다.
실습
switch, checkout — 브랜치/커밋 이동
switch 는 브랜치 간 이동을 하기 위한 명령어 입니다. (2019년도 부터 적용)
checkout 도 이동을 위한 명령어이지만 브랜치 이동 뿐만 아니라 특정 commit으로 이동하기 위한 명령어 이기도 합니다.과거 시점 보기 포함)
명령어
# master으로 이동
git switch master
# feature/chat으로 이동
git checkout feature/test
# 특정 커밋 시점으로 이동 (Detached HEAD)
git checkout <커밋 해시>
Bash
복사
실습
•
git log에 노란색 마크가 표시 되어 있는 것이 현재 branch를 뜻합니다.
브랜치간 switch
버전간 checkout
git merge — 브랜치 병합
현재 브랜치에 다른 브랜치의 변경사항을 합치는 명령어입니다.
주로 새로운 기능, 수정이 필요할 때 새로운 branch를 만들거나 각 개발자가 구현하는 파트를 branch로 만들고 이를 합칠 때 사용하게 됩니다.
명령어
# master으로 이동
git switch master
# master에 feature/test commit 내역을 병합
git merge feature/test
Bash
복사
실습
1.
개발 중이던 feature/test branch에 2개의 commit이 있습니다.
2.
아직 master엔 merge 되어 있지 않은 상태입니다.
3.
우선 병합을할 master branch로 switch 합니다.
4.
tool bar 상단에 git > Merge를 선택합니다.
5.
master에 병합할 feature/test branch를 선택 후 merge 합니다.
6.
master branch에 병합을 확인할 수 있습니다!
Github
Git이 Local에서 소스를 관리할 수 있는 저장소였다면 github은 여러 개발자들의 git을 모아 저장하는 원격 저장소 역할을 수행하는 서비스입니다.
Git과 마찬가지로 여러 다른 서비스를 제공하는데 그중 GitLab도 많이 사용되는 서비스 입니다.
여러 Git 서비스
Github 사용법 (feat. intellij)
앞서 local에서 git을 사용하는법에 대해서 알아봤어요.
이번엔 github와 intellij를 연동하여 사용하는 법을 알아볼게요.
우선 github의 계정을 생성해주세요.
계정 생성엔 유효한 Email이 필요해요.
계정을 생성했다면 아래와 같이 github과 연동해볼게요.
•
Settings > Version Control > Github으로 이동
•
Log in via GitHub… 클릭
•
브라우저에 실행된 사이트에서 Authorize in GitHub 클릭
•
Authorize JetBrains 클릭
•
비밀번호 입력 후 Confirm 클릭
•
Login success 후 intellij로 돌아오면 github 계정과 intellij가 연결된 것을 확인할 수 있습니다.
이렇게 하면 intellij에 github 계정이 추가되면서 해당 계정에 repository에 프로젝트를 등록할 수 있어요!
이제 프로젝트를 Github(원격 저장소)에 올려볼게요.
Github에 기초 프로젝트를 구성 후 프로젝트를 올리는 방법도 있으며, 이번엔 intellij로 프로젝트를 올리는 방법을 알아볼게요.
•
Git > GitHub > Share Project On Github 선택합니다.
•
Repository name : 프로젝트 이름 추가
private : 프로젝트 비공개여부로
Remote : origin 사용 권장
Description : 프로젝트 설명
Share by : 어떤 github 계정 사용할 것인지 선택
•
share 하면 아래와 같이 프로젝트가 github에 추가됩니다.
•
현재는 commit된 git 정보를 share했기 때문에 commit한 목록도 같이 올라가졌어요!
Git & GitHub remote 사용법 (feat. intellij)
이제 git에 저장된 목록 혹은 branch를 github(remote 저장소)에 commit 하는 방법을 알아볼게요.
push — 로컬 커밋을 원격 저장소로 보내기
push는 local Repository에 commit된 작업한 내용을 remote Repository에 저장하는 명령어입니다.
명령어
# remote origin에 feature/test를 push하여 추가
git push origin feature/test
Bash
복사
실습
•
Git > push 선택
•
추가 및 수정한 소스를 확인 후 Push Anyway를 클릭
•
push한 feature/test 브랜치와 commit 내역이 github에 추가되었습니다
Pull Request — 원격 저장소 branch 간 merge
앞서 git local 환경에서 branch 간 merge 하는 방법을 알아보았습니다.
그럼 github 내에선 어떻게 병합할까요?
바로 Pull Request 는 통해 수행됩니다. 이는 명령어가 아닌 GitHub의 기능입니다. branch 간에 버전을 병합할 때 사용합니다.
PR은 소스를 병합하는 목적으로 수행되기도 하지만 Github을 통한 코드리뷰와 같은 방식으로 활용됩니다.
실습
•
새로운 branch에 commit이 올라오게되면 GitHub에 아래와 같은 Pull Request 알림이 노출됩니다.
아래 알림은 PR을 생성하기 위한 알림입니다.
•
PR 제목과 내용을 작성 후 Create Pull Requset하면 PR이 생성됩니다.
•
아래와 같이 PR이 생성 된 후 충돌이나 소스에 문제가 없다면 Merge pull request를 통해 master 브랜치에 feature/test 브랜치 소스를 병합합니다.
•
병합에 성공하면 github master 브랜치에 소스가 합쳐집니다.
git pull — 원격 변경 가져오기 + 병합
앞선 PR로 GitHub에 master branch에 feature/test branch 소스가 병합되었습니다.
하지만 Git local branch에는 아직 병합된 코드가 없죠?
이때 GitHuh master branch에 소스를 Git master branch로 commit 목록을 가져와 병합시켜 보겟습니다.
이때 pull 명령어를 사용합니다.
이때 git fetch를 통해 꼭 local 저장소와 remote 저장소에 형상을 일치시켜주시기 바랍니다.
현재는 혼자서 개발하는 환경이기 때문에 큰 문제가 없지만 다른 개발자와 협업하는 중이고 local과 remote에 올라와 있는 소스가 같아 충돌이 나타나거나 예상치 못한 commit 내역을 pull 받을 수 있습니다!
명령어
# remote origin에서 master로 pull하여 추가
git pull origin master
Bash
복사
실습
1.
현재 fetch를 하지 않은 상태이기 때문에 remote/origin > feature/test만 생성된 상태이고 아직 commit 목록을 가져오지 못했습니다.
2.
Fetch 실행 후 commit 목록을 동기화 합니다.
3.
commit 목록을 확인 후 Pull실행하여 local branch와 병합합니다. origin(remote) → master(local)
4.
local branch에서 병합을 확인합니다.
git clone — 원격 저장소 복제
만약 remote 저장소에 있는 새로운 repository를 local에 내려받고 싶으면 어떻게 할까요?
이때, clone 명령어를 사용하여 local에 복사합니다.
명령어
git clone <저장소 URL>
# 예 : git clone https://github.com/user/project.git
Bash
복사
실습
•
File > Project from Version Control… 선택
•
GitHub에 Code > Clone에 주소 복사 합니다.
•
URL에 복사한 주소를 붙여넣기 후 원하는 directory를 지정합니다.
window의 되도록 바탕화면이 아니라 드라이브에 넣는 것을 권장합니다.









































































