이 글에서는 앞으로 다른 프로젝트를 실행하는데 꼭 알아야 할 git 사용법에 대해 가장 간단한 수준에서 알아보고자 한다.
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
git은 "분산형 버전 관리 시스템"이다. 프로젝트를 진행하다보면 다음과 같은 일들이 일어나는데 git은 이를 편리하게 해결할 수 있게 해 준다.
위와 같은 문제들은 git과 더불어, gitflow(git을 활용하기 위한 전략)를 별도로 공부해보면 잘 나온다.
오늘은 이정도까지는 아니고 아주 기초적인 git 사용법을 알아보겠다.
GitHub, Inc. is a provider of Internet hosting for software development and version control using Git. It offers the distributed version control and source code management functionality of Git, plus its own features.
git은 버전 관리 툴이니, 당연히 소스를 저장할 저장소가 필요하다. 로컬 컴퓨터나 서버에서는 그 자체가 저장소 역할을 하지만, 이와는 별도로 여러 사람들의 소스가 모이고, 서버에서 바라보고 복사해 갈 수 있는 원격 저장소가 필요하다. 원격 저장소의 대표적인 예로 github, bitbucket 등이 있다.
가장 유명한 github에 대해 알아보자.
github.com 에 가서 회원가입을 해 보자.
이메일, 비번(잘 안되면 눈모양을 켜서 혹시 한글 입력중인지 확인)을 입력한 후, username을 입력하자. username은 https://github.com/여기/ 이렇게 url에 들어가게 되니 마음에 드는 것으로... 나중에 바꿀 수는 있지만 한번 퍼지고 난 url은 작동하지 않는다고 경고가 뜬다.
뭔가 이상한 퀴즈로 사람인걸 증명하고, 이메일로 도착한 6자리 코드를 입력하면 가입 완료! 아래와 같은 화면을 만날 수 있다.
지금까지 만든게 계정이라면, 이제는 각 소스의 묶음이라고 할 수 있는 저장소, repository를 생성할 차례이다.
화면에서 바로 create repository
버튼을 눌러 저장소를 만들자. 혹은 우상단 프로필 옆에 있는 + 에도 해당 기능이 있다.
이름에는 'gittester', public/private에서는 private을 선택하자. 그리고 Create repository 버튼을 누르면 끝난다.
2021년 8월 13일부터 github에 원격으로 접속해서 뭔가 작업을 할 때 기존의 password(회원가입 때 입력한것) 방식의 인증은 더 이상 통하지 않는다. password 대신 토큰을 사용하면,
우상단 profile -> settings -> Developer settings 에서 Personal access token
을 발급받자. 이 화면에서 Generate new token
을 누르면 시작된다.
이 화면에서는 적당한 이름을 입력하고 repo 항목에 대표체크를 한 후 하단에 Generate token 버튼을 누르자.
그러면 발급받은 토큰이 화면에 표기가 된다.
중요! 여기서 반드시 이 토큰을 복사해서 별도로 가지고 있어야 한다. 이 메뉴에 다시 진입하더라도 토큰을 발급받은 이력만 확인할 수 있을 뿐 토큰 자체를 확인할 수 있는 기회는 여기가 마지막이다.
원래 각 ide에서는 프로젝트를 생성할 때 이 폴더를 git repository로 사용할 것인지 물어보고 이렇게 생성해 주는 경우가 많다. 그렇지만 우리는 공부도 할 겸 직접 작업해보자. (필자의 환경은 mac인 점을 참고)
우선 아무 테스트 디렉토리를 만들었다.
cd projects
mkdir etc
cd etc
mkdir gittester
cd gittester
touch a.txt (이 파일을 생성만 한다.)
이제 이 폴더는 이름이 gittester이고 파일이 a.txt 하나 존재하는 폴더이다. 이 폴더를 git repository로 선언하고 상태를 확인해보자.
git init
Initialized empty Git repository in /Users/davelee/Documents/projects/etc/gittester/.git/
git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
a.txt
nothing added to commit but untracked files present (use "git add" to track)
git init으로 현 폴더를 repository로 선언할 수 있다.
git status로는 현재 repository의 상태를 요약해 볼 수 있다. 위의 메시지를 해석해보면,
현재 master branch에서 작업중
아직 commit한 적 없음
추적하지 않고 있는 파일 a.txt 있다.
이정도의 메시지이다.
방금 나온 branch는 다음에 설명하기로 하고 우선 master는 가장 중심이 되는 작업본이라고 간단히 이해해두자.(요즘에 github은 main이란 용어를 밀고 있음)
commit은 변경사항을 기록하는 행위이다. 우리가 ide에서 수시로 저장할 때마다 commit할 필요는 없기 때문에, 자신이 적당히 작업한 분량이 생겼을 때 commit을 하면서 추가/수정/삭제된 파일을 repository에 반영하면 된다.
우선 관리되지 않고 있는 a.txt 파일을 git에 추가해보자.
git add a.txt
git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: a.txt
그리고 우리의 첫 commit을 해보자! -m으로 커밋 메시지를 적을 수 있다. (commit message를 잘 적는 전략 : https://chris.beams.io/posts/git-commit/)
git commit -m "my first commit"
git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
commit을 하고 나면 이제 우리의 최신 소스와 repository의 상태가 같기 때문에 status에 더 이상 잔소리가 나오지 않는다.
지금까지 commit한 모든 것들은 원격 repository와 아무런 상관이 없다. 우리 폴더의 숨은 하위폴더 .git 에 이런 저런 정보가 저장될 뿐이다. 이를 github에 만들어둔 원격 repository에 보내보자. 이를 push
라고 한다.
우선 원격 저장소를 지정해주자. 원격저장소의 주소는 github에서 code를 열어 확인할 수 있다.
https:// 하고 나서 github.com 앞에 자신의 username@ 를 넣어주자.
git remote add origin https://helloworld-dave@github.com/helloworld-dave/gittester.git
이제 push하자.
git push -u origin main
Password for 'https://helloworld-dave@github.com':
여기서 받아두었던 토큰 입력
그리고 github.com에 접속해보면 a.txt가 commit message와 함게 올라와 있는 것을 확인할 수 있다.
ubuntu를 처음 설치하면 git이 별도로 없기 때문에 설치해준다.
sudo apt install git
여기서도 테스트용이므로 적당한 곳에서 실험해보자. git에서 내려받으면 최상위 폴더가 생기므로 폴더가 생겼으면 하는 상위 폴더에서 진행한다. clone이란 어떤 저장소를 그대로 복사해 오는 것을 뜻한다.
여기서도 token이 필요하니 미리 준비해두자.
helloworld@raspberrypi4:~/Documents/projects$ mkdir etc
helloworld@raspberrypi4:~/Documents/projects$ cd etc
helloworld@raspberrypi4:~/Documents/projects/etc$ git clone https://helloworld-dave@github.com/helloworld-dave/gittester
Cloning into 'gittester'...
Password for 'https://helloworld-dave@github.com':
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 5 (delta 0), reused 5 (delta 0), pack-reused 0
Receiving objects: 100% (5/5), done.
helloworld@raspberrypi4:~/Documents/projects/etc$ ls
gittester
helloworld@raspberrypi4:~/Documents/projects/etc$ cd gittester/
helloworld@raspberrypi4:~/Documents/projects/etc/gittester$ ls
a.txt
helloworld@raspberrypi4:~/Documents/projects/etc/gittester$
위와 같이 gittester라는 폴더와, 그 안에 a.txt라는 파일을 확인해 볼 수 있다.
git의 사용은 실제로는 이것보다 좀 더 복잡하다. 간단하게는 add -a 나 pull정도는 더 공부해야 하고, branch관리, commit message 작성, merge, rebase 등 공부할 것이 좀 있다. 약간이라도 규모있는 회사라면 협업을 위해 회사에서는 입사때 필수적으로 물어볼 것이고, 오히려 이 체계가 없는 회사라면 입사를 심각하게 고려해 보는 것이 좋을 정도이다.
앞으로 로컬에서 개발/ 원격 서버에서 구동시 이정도의 지식은 숙지해 두는 것이 좋겠다.