티스토리 뷰
1. Git 설치
1.1. Windows 환경에서 Git 설치
1.2. Linux 환경에서 Git 설치
2. GitHub 회원 가입 및 repository 생성
3. GitHub에 코드 push & pull
4. GitHub Collaboration
5. Git Branch
6. Git 되돌리기 reset & revert
7. Git Graph
8. Git 명령어 정리
1. Git 설치
깃(git)은 컴퓨터 파일의 변경사항을 추적하고 여러 명의 사용자들 간에 해당 파일들의 작업을 조율하기 위한 분산 버전 관리 시스템(DVCS)이다.
소프트웨어 개발에서 소스 코드 관리에 주로 사용되지만 어떠한 집합의 파일의 변경사항을 지속적으로 추적하기 위해 사용될 수 있다.
빠른 수행 속도에 중점을 두고 있는 것이 특징이며, 데이터 무결성, 분산, 비선형 워크플로를 지원한다.
깃은 2005년에 리눅스 커널 개발을 위해 초기 개발에 기여한 다른 커널 개발자들과 함께 리누스 토르발스가 처음 개발한 것이다.
이제 깃을 본격적으로 설치해보겠다.
1.1. Windows 환경에서 Git 설치
아래의 주소로 접속한다.
청록색 배경으로 되어 있는 Download for Windows를 클릭하여 install을 진행한다.
1.2. Linux 환경에서 Git 설치
Ubuntu를 기준으로 아래의 명령어를 순서대로 따라 입력하면 된다.
$ sudo apt-get install git
// 설치할 패키지 리스트를 업데이트한다.
$ sudo apt install git
// 깃을 설치한다.
$ git --version
// 깃이 제대로 설치되었는지 확인하기 위해 버전 정보를 불러온다.
$ git config --global user.email [이메일 주소]
// 깃에 push 했을 때 올라갈 이메일 주소를 입력한다.
$ git config --global user.name [유저 이름]
// 깃에 push 했을 때 올라갈 유저 이름을 입력한다.
2. GitHub 회원 가입 및 repository 생성
깃허브(github)는 분산 버전 관리 툴인 깃저장소 호스팅을 지원하는 웹 서비스이다.
깃허브를 이용하면 하나의 코드를 여러 개발자가 공유하여 사용할 수 있어서 효과적인 협업이 가능하고, 다른 사용자가 깃허브에 업로드해놓은 코드들을 git clone 명령어로 다운로드 받아서 쓸 수 있기 때문에 원활한 소통이 가능하다.
깃이 CLI 기반의 방식인데 반해, 깃허브는 GUI를 제공한다.
이제 GitHub를 어떻게 사용하는지 알아보겠다.
먼저, 아래의 깃허브 공식 홈페이지에 접속한다.
깃허브 공식 홈페이지에 들어가서 Sign up for GitHub 버튼을 눌러서 회원가입을 진행한다.
이때 입력해야 하는 정보 중에서 이메일 인증 과정을 거치기 때문에 아무 이메일이나 막 적으면 안되고, 본인의 이메일을 정확하게 입력해야 한다.
회원가입 완료 후 로그인을 하면 아래와 같은 화면이 뜰 것이다.
https://github.com/[본인계정] ← 이 주소로 본인의 깃허브 주소가 생성되었을 것이다.
참고로 필자의 깃허브 주소도 공유하겠다. 팔로우 해달라는 것은 아니다.. *^^*
이제 깃허브에 본인이 작성한 코드를 어떻게 올릴 수 있는지 알아보겠다.
코드를 업로드하기 위해 먼저 Repositories에 들어간다.
우측상단에 New라는 초록색 버튼을 클릭하고 새 repository를 생성한다.
만들고자 하는 repository 이름을 적고 Create repository 버튼을 눌러 생성을 완료한다.
이제 코드를 올리고 받아올 수 있는 환경이 갖추어졌다.
3. GitHub에 코드 push & pull
위 그림에서 Remote Repository는 GitHub의 repository를 가리키고, 우리가 보통 코드를 작업하는 공간은 내 컴퓨터(Local)의 workspace(초록색 부분)이다.
workspace에 있는 코드를 바로 remote repository에 올릴 수 있는 것이 아니고, 중간 과정이 필요하다.
먼저, workspace에 있는 코드 중에 GitHub로 올리고자 하는 디렉토리에 들어간다. 그 다음 아래의 명령어를 차례로 입력한다.
$ git init
// GitHub에 올리고자 하는 폴더에 .git이라는 하위 디렉토리를 생성한다.
$ git add [파일명]
// 선택한 파일을 workspace에서 staging area로 옮긴다.
$ git status
// 현재 git의 상태를 확인하는 명령어다. (add나 commit이 잘 되었는지 등)
$ git commit -m "메시지 입력"
// staging area에 있는 모든 파일을 local repository로 옮긴다.
$ git remote add [별명] [깃허브 주소]
// 깃허브 주소에 대해 별명을 생성한다. (아직 깃허브에 파일이 올라간 것이 아님)
$ git push [별명] master
// 별명에 해당하는 깃허브 주소로 local repository의 하위 항목들이 업로드된다. master는 최상위 브랜치 이름이다.
위 명령어가 모두 에러 없이 제대로 실행되었다면, 깃허브 주소에 들어가서 확인해보면 된다.
이제 깃허브에 있는 파일을 다운받는 명령어들을 소개하겠다.
$ git clone [깃허브 주소]
// 해당 깃허브 주소에서 최초로 다운받을 때 쓰는 명령어이다. (정확히는 push를 한 번도 하지 않은 상태)
$ git pull [별명] master
// push 했을 때 지정한 [별명]에 해당하는 remote repository에서 파일들을 불러온다.
$ git add [파일]
// 새 파일, 수정된 파일은 다시 git add로 staging area에 넘긴다.
$ git commit -m "메시지 입력"
// staging area에 있는 모든 파일들을 local repository에 보낸다.
$ git push [별명] master
// [별명]에 해당하는 깃허브 주소에 파일을 업로드한다.
이러한 방식으로 내 컴퓨터와 깃허브에 파일들을 push, pull 할 수 있다.
4. GitHub Collaboration
깃허브는 여러 사람들의 협업이 가능한 공간이다. 다른 사람이 나의 깃허브 repository에 글을 push하려면 권한이 부여된 상태여야 한다.
협업하고자 하는 Repository의 Settings에 들어가면 Collaborators 카테고리가 있다.
Add people 버튼을 클릭하면 협업할 사람들의 깃허브 계정 또는 이메일 등으로 추가할 수 있다.
5. Git Branch
Git은 동시에 여러 작업을 수행하고 합칠 수 있도록 branch라는 기능을 제공한다.
만약 게시판의 CRUD 기능을 한 명씩 맡아서 구현할 때, 내가 R 기능을 구현하고 있는데 다른 사람이 이미 U 기능 구현을 마치고 git push를 해놓았다고 가정한다. 그러면 내가 git pull로 깃허브의 작업물을 불러올 때 현재 작업 중인 것과 충돌이 나게 된다.
이러한 상황을 막기 위해 각자 작업을 할 때 branch를 생성해서 거기서 작업을 하고 다 완료되면 master branch와 합치는 것을 반복하게 된다. (master branch는 최상위 branch를 의미한다.) git pull로 받아온 작업물이 수정된 것은 master가 아니라 내가 따로 생성한 branch에 저장되기 때문에 master branch로 돌아가서 git pull로 업데이트된 작업물을 불러와도 충돌이 발생하지 않는다.
branch 생성, 이동, 삭제에 대한 명령어는 다음과 같다.
$ git branch
// branch 리스트 보기
$ git branch [브랜치명]
// 새 브랜치 생성
$ git branch -m [브랜치명] [새 브랜치명]
// 브랜치 이름 변경
$ git checkout [브랜치명]
// [브랜치명]으로 브랜치 이동
$ git branch -D [브랜치명]
// 해당 브랜치 삭제
branch를 사용하는 순서는 아래와 같다.
- 본인의 branch에서 작업 후 commit
- master branch로 돌아오기 (git branch master)
- master에 작업물 불러오기 (git pull [불러올 작업물] master)
- master에 본인의 branch를 붙이기 (git merge [본인의 브랜치])
- 수정된 master branch를 remote repository에 업로드하기 (git push [깃허브 주소] master)
6. Git 되돌리기 reset & revert
add, commit, push, pull 등 git 명령어를 사용하다 보면 실수로 원치않는 작업을 진행하는 경우가 발생할 수 있다.
node_modules와 같은 라이브러리는 업로드 용량이 비효율적으로 많아지는 것을 방지하기 위해 .gitignore 안에 작성하여 git이 tracking하지 못하게 막아놓는다. 이를 깜빡하고 node_modules도 함께 업로드되었다면 되돌릴 수 있는 방법이 있다.
이때 사용하는 명령어가 reset과 revert이다. 두 단어 모두 되돌아간다는 비슷한 의미를 나타내지만, 쓰임새에는 차이가 있다.
reset 명령어는 마치 타임머신을 타고 과거로 되돌아가는 것과 같다. reset 명령어를 사용하면 돌아가려는 commit으로 repository가 재설정되고, 해당 commit 이후의 이력이 사라진다.
reset 명령어의 옵션은 다음과 같다.
- git reset --soft : 원복된 이력 이후의 내용을 모두 유지
- git reset --hard : 원복된 이력 이후의 내용을 모두 삭제 후 초기화
- git reset -merge : 바로 이전 병합 취소
- git reset --mixed : 원복된 이력 이후의 내용을 모두 유지하지만 인덱스는 초기화되므로 변경 내용을 다시 추가해야 함
revert 명령어는 commit 이력을 삭제하지 않고 남겨둔 채로 되돌아오는 것을 말한다. 엄밀히 말하면 commit을 없던 일로 해줄테니 다시 commit하라는 것과 같다. 실질적으로 '이전으로 돌아가기 + commit하기'를 말한다.
revert는 reset보다 더 안전해보이고, 실제로도 reset보다는 revert를 더 자주 쓴다. 하지만, revert도 단점이 존재한다.
revert는 충돌(conflict)이 동반할 수 있다. 이전의 상태로 되돌아왔지만 돌아온 시점 ~ 돌아오기 전 사이에 무시되는 commit이 존재하기 때문이다. 충돌이 일어나지 않게 revert를 사용하려면, 돌아온 시점 ~ 돌아오기 전 사이에 commit이 없으면 된다. 다시 말해서, 바로 직전 커밋으로 순차적으로 revert 명령어를 쓰면 된다.
revert 명령어는 아래와 같이 사용할 수 있다.
- git revert [commit ID] : 해당 commit으로 되돌아가기
- git revert [commit ID]..[commit ID] : 충돌을 피하면서 여러 개의 commit을 revert 하는 명령어
- git revert no-commit [commit ID] : revert를 할 때 자동으로 commit이 되지 않도록 하는 명령어 (commit은 되지 않지만 Staging Area에는 변경사항이 올라가는 상태로 되돌아감)
Q. 언제 어떤 명령어를 써야할까?
스스로 모든 것을 책임질 수 있다면 reset을 써도 괜찮다. 그렇지 않으면 revert를 사용하는 것이 낫다. 혼자서 진행하는 개인 프로젝트나, 중요하지 않은 commit만 쌓여있어서 실수로 날려먹어도 다시 복구가 가능한 수준이라면 reset을 쓸 수 있다. 하지만 remote repository를 이용하거나 협업을 진행할 경우에는 위험할 수 있다. 작업 중인 branch를 혼동하여 master branch를 reset 시킨다든가 하는 아찔한 상황을 초래할 수도 있다.
7. Git Graph
VS Code에서 branch를 써서 작업할 때 각각의 branch가 어떻게 뻗어나가는지 시각적으로 보여주는 확장 모듈이 있는데, 바로 Git Graph이다. 위 그림에 보이는 것을 설치하여 사용할 수 있다.
위 그림은 실제로 직접 사용해 본 Git Graph이다. 4명이 팀을 구성해서 각자 branch를 생성해 게시판과 로그인의 프론트엔드, 백엔드 역할로 나누어 간단한 기능을 구현하였다.
파란색 줄기가 최상위 branch인 master이다. Description에는 commit -m ""의 큰따옴표 안에 들어간 내용이 나타난다. commit한 시점과 주체도 모두 알 수 있기 때문에 혹여 실수했을 때 내가 안했다고 발뺌할 수 없다. ^^
8. Git 명령어 정리
분류 | 명령어 | 내용 설명 |
새로운 저장소 생성 | $ git init | .git 하위 디렉토리 생성 (폴더 생성 후, 그 안에서 명령 실행) |
저장소 복제/다운로드 | $ git clone <https:.. URL> | 기존 소스 코드 복제/다운로드 |
$ git clone /로컬/저장소/경로 | 로컬 저장소 복제 | |
$ git clone 사용자명@호스트:/원격/저장소/경로 | 원격 서버 저장소 복제 | |
add 및 commit | $ git add <파일명> $ git add * |
commit에 단일 파일의 변경 사항을 포함 (인덱스에 추가된 상태) |
$ git add -A | commit에 파일의 변경 사항을 한 번에 모두 포함 | |
$ git commit -m "커밋 메시지" | commit 생성 (실제 변경사항 확정) | |
branch 작업 | $ git branch | 브랜치 목록 보기 |
$ git branch <브랜치 이름> | 새 브랜치 생성 (local로 생성) | |
$ git checkout -b <브랜치 이름> | 브랜치 생성 및 이동 | |
$ git checkout master | master 브랜치로 돌아옴 | |
$ git branch -d <브랜치 이름> | 브랜치 삭제 | |
$ git push origin <브랜치 이름> | 만든 브랜치를 원격 서버에 전송 | |
$ git push -u <remote> <브랜치 이름> | 새 브랜치를 원격 저장소로 push | |
$ git pull <remote> <브랜치 이름> | 원격에 저장된 git 프로젝트의 현재 상태를 다운로드 + 현재 위치한 브랜치로 병합 | |
변경 사항 발행 (push) | $ git push origin master | 원격 서버에 변경사항 업로드 |
$ git push <remote> <브랜치 이름> | 원격 서버에 commit 업로드 | |
$ git push -u <remote> <브랜치 이름> | 원격 서버에 commit 업로드 | |
$ git remote add origin <등록된 원격 서버 주소> | 클라우드 주소 등록 및 발행 (git에게 새로운 원격 주소 알림) | |
$ git remote remove <등록된 클라우드 주소> | 클라우드 주소 삭제 | |
갱신 및 병합 (merge) | $ git pull | 원격 저장소의 변경 내용을 현재 디렉토리에 가져오고(fetch) 병합(merge)됨 |
$ git merge <다른 브랜치 이름> | 현재 브랜치에 다른 브랜치의 수정사항 병합 | |
$ git add <파일명> | 각 파일을 병합할 수 있음 | |
$ git diff <브랜치 이름> <다른 브랜치 이름> | 변경 내용 merge 전에 바뀐 내용을 비교할 수 있음 | |
태그(tag) 작업 | $ git log | 현재 위치한 브랜치 commit 내용 확인 및 식별자 부여됨 |
로컬 변경사항 return | $ git checkout -- <파일명> | 로컬의 변경사항을 변경 전으로 되돌림 |
$ git fetch origin | 원격에 저장된 git 프로젝트의 현 상태를 다운로드 |
Git 관련 명령어들을 표로 정리해보았다. 앞으로 익숙하게 다룰 수 있도록 자주 써봐야겠다.
'Git, GitHub' 카테고리의 다른 글
GitHub 프로필 꾸미기 (작성 중) (0) | 2022.03.03 |
---|
- Total
- Today
- Yesterday
- Document Object Model
- 리액트 #React #props #state #javascript
- short
- History 객체
- int
- stdio.h
- window 객체
- Char
- 변수
- Screen 객체
- 자료형
- long
- c언어
- location 객체
- 키워드
- keyword
- gcc
- bom
- 컴파일
- DOM
- Browser Object Model
- Navigator 객체
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |