Git(깃)은 주로 소프트웨어 개발에서 사용되는 분산 버전 관리 시스템입니다. Git은 프로젝트 파일의 변경 사항을 추적하고 프로젝트의 변경 사항을 모두 기록함으로써 코드의 버전 히스토리를 관리하기 때문에 필요할 때 이전 버전으로 되돌아갈 수 있다는 장점이 있습니다. 뿐만 아니라 여러 개발자가 각각의 서로 다른 작업이나 기능 개발을 독립적으로 진행할 수 있는 브랜치(branch) 기능을 제공하여 별도의 기능을 개발할 수 있으며, 병합(Merge)를 통해 각각의 변경 사항을 통합할 수 있습니다. 이러한 기능 덕에 대부분의 개발자들은 git을 활용하며 이를 다루는 능력은 개발자에게 있어서 가히 필수적인 능력이라고 할 수 있습니다.
그럼 이 git을 어떻게 사용하는지 git의 구조와 함께 살펴보도록 합시다.
Git의 구조
Git은 파일을 관리하고 버전 관리를 하기 위해 여러 가지 영역(stages)을 사용합니다.
● Working Directory: 현재 작업 중인 프로젝트 파일들이 위치하는 영역입니다. 저희가 이 Working directory에 있는 파일을 편집하거나 새로운 파일을 생성하는 것이죠. Git이 관리하고 있지만, 아직 추적( track )은 하고 있지 않은 상태입니다.
● Staging Area: stage 또는 staging area라고 하며, 준비 공간을 말합니다. 즉 Git이 추적( track )하고 있지만 아직 변경된 내용이 실제로 저장소에 기록되지는 않습니다. 어떤 파일이나 변경 사항을 저장소에 기록할지 사용자가 선택적으로 관리할 수 있습니다.
● Local Repository: 사용자의 PC에 존재하는 저장소를 의미합니다. 이는 생성되는 .git 폴더 내에 존재하며 모든 버전 히스토리와 프로젝트 상태를 기록하고 있습니다.
● Remote Repository: GitHub, GitLab 등과 같은 서버에 저장된 저장소로, 다른 팀원들과 협업할 수 있는 공간입니다. 명령어를 통해서 Local Repository의 변경 사항을 Remote Repository로 전송할 수도 있고 Remote Repository의 최신 상태를 Local Repository로 가져올 수도 있습니다.
Git의 구조
이제 관리하거나 협엽하고자하는 코드를 Remote Repository로 올리는 과정에 대해서 살펴보면서 git의 기본적인 사용법에 대해서 익혀보도록 합시다. 차근차근 따라오시면 누구든지 쉽게 Github에 코드를 올리며 관리할 수 있습니다!
1. 준비
우선 기본적으로 git이 설치된 로컬환경과 Github 계정이 필요합니다. 아래 링크를 통해서 자신이 사용하는 os에 맞게 git을 설치할 수 있으며,
https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-Git-%EC%84%A4%EC%B9%98
Github 계정은 아래 github 사이트로 들어가 직접 만들어주셔야 합니다.
2. Remote Repository 만들기
Github에 회원가입을 했다면 먼저 본인이 관리할 프로젝트나 파일들을 업로드할 Remote Repository를 만들어줘야 합니다.
Repositories의 New 버튼을 누르고 몇 가지 설정만 선택해주면 손쉽게 Remote Repository를 생성할 수 있습니다.
Repository name : 본인이 원하는 저장소의 이름
Description : Repository에 대한 설명
Public, Private : 자신이 관리하는 Repository를 모든 사람에게 공개되도 된다면 Public, 원하는 사람에게만 공개되길 원한다면 Private으로 설정. Public으로 공개된 내용은 Private으로 다시 바꿀 수 있고, 반대로 Private이었던 저장소를 다시 Public으로 바꾸는 것도 가능
Add .gitignore : Github로 올리지 않을 파일 선택
Add a license : 다른 사림들이 자신의 코드를 사용할 때 어디까지 허용할 것인지에 대한 라이센스 설정
몇 가지 체크 리스트들이 있지만 빨간색으로 강조한 Repository name과 Public, Private만 설정해주고 Create repository 버튼을 누르면 repository 생성이 가능합니다.
3. git init
$ git init
다음으로 자신이 관리하길 원하는 코드가 있는 폴더로 들어가 git init 명령어를 입력하여 폴더를 git이 추적할 수 있도록 .git 폴더를 생성합니다. 즉, Local Repository를 생성하는 명령어입니다. .git 폴더는 git init 명령어를 입력한 폴더 내에서 숨겨진 파일로써 생성되게 되며 앞으로 git의 버전 관리에 필요한 모든 정보가 이 .git 폴더에 저장됩니다.
4. git add
$ git add <버전 관리할 파일명>
git add 명령어는 작업 디렉토리(Working Directory - git init을 입력한 폴더)에서 변경된 파일을 스테이징 영역(Staging Area)에 추가하는 명령어입니다.
git add 명령어와 같이 특정 파일만을 Staging 영역에 추가할 수 있으며, 아래와 같이 git add . 명령어를 통해 Working Directory 내의 변경된 모든 폴더와 파일을 한번에 추가할 수도 있습니다.
$ git add .
이쯤되면 자신이 변경한 파일들이 Staging Area에 잘 올라갔는지 확인하고 싶으실 수 있습니다. 이때 git status 명령어를 사용하면 이를 쉽게 확인할 수 있습니다.
$ git staus
위 명령어를 입력했을 때 변경된 파일이 Staging Area에 아직 올라가지 않은 상태라면 빨간색으로 표시되고 이미 Staging Area에 추가되었다면 초록색으로 표시됩니다.
만약 git init만을 실행시키고 git status을 입력했을 경우에는 아직 어떤 파일도 Staging Area에 올라가지 않은 상태이기 때문에 모든 폴더들이 빨간색으로 표시될 것을 예상할 수 있습니다. 반면에 git add . 까지 실행시킨 후 git status을 입력한다면 모든 폴더와 파일들이 초록색으로 표시되겠죠.
5. git commit
Git의 commit은 특정 순간의 버전을 스냅샷으로 확정하여 새롭게 변경된 부분만 추출해서 저장합니다. 즉 시간에 따라서 변화하는 내용만 관리하고 코드가 변화된 시간 순서에 따라서 영구적으로 해당 Local Repository의 commit 기록에 저장해 줍니다.
$ git commit -m "commit 메세지"
위 명령어를 통해서 commit을 진행할 수 있는데 이 때 식별을 위해 큰 따움표 안에 commit message를 작성해줘야 합니다. 이전 버전의 코드들과 비교해 어떤 변경 사항이 있는지를 설명해주는 message를 적어주는 것이 좋습니다.
※ Commit을 처음 실행시켰다면 다음과 같이 사용자의 이름과 이메일을 입력하라고 나오게 됩니다.
Local git에 사용자의 Github 계정 email과 name을 등록해줘야하기 때문에 나와있는 명령어를 그대로 사용해서 본인의 Gihub 계정 정보를 입력해주면 됩니다.
$ git config --global user.name "Username"
$ git config --global user.email "Email address"
6. Remote Repository와 Local Repository 연결
이제 저희가 처음에 만들어줬던 Remote Repository와 Local Repository를 연결해주어야합니다.
그래야만 저희가 원하는 Remote Repository에 Local에서 변경한 코드를 업로드할 수도 있고 다른 팀원들에 의해 업데이트된 코드도 local로 받아올 수 있겠죠.
$ git remote add {별칭} {remote repository 주소}
위 명령어를 통해서 Remote Repository와 Local Repository를 연결해줄 수 있습니다. {별칭}은 원격 저장소의 URL을 간단히 표현하기 위해 사용하는 원격 저장소의 이름을 뜻하며 일반적으로 origin이라는 별칭을 사용하지만 다른 이름으로 변경해도 무방합니다.
{Remote repository 주소}는 처음 저희가 만들었던 Remote Repository의 github 주소를 입력하면 되는데, 아래 사진처럼 HTTPS를 누른 후 뜨는 주소를 복사하여 사용해주면 됩니다.
저의 경우 다음과 같은 명령어로 두 Repository를 연결해줄 수 있겠죠.
$ git remote add origin https://github.com/goodhsm2000/ROBOTIS.git
7. Git branch 변경
기본적으로 Git repository를 초기화하면($ git init) Local Repository에는 "master"라는 이름의 기본 branch가 생성됩니다. 동일하게 "master"라는 이름을 기본 branch로 사용하던 예전과 달리 현재 Github와 Gitlab(Remote Repository)에서는 "master"가 인종차별적인 언어와 연결된다는 이유로 "main"이라는 이름을 기본 branch로 사용하고 있습니다.
따라서 편의성을 위해서 둘의 branch 이름을 맞춰주는 것이 좋습니다.
$ git branch -M main
위 명령어를 사용하면 Local Repository의 기본 branch 이름을 "master"에서 "main"으로 변경하고(-M 옵션에 의해서 "main" branch가 없더라도 강제로 "main" 브랜치 생성) 현재 작업 중인 branch도 "main"으로 변경시켜줍니다.
p.s <error: src refspec main does not match any>
진행 도중 다음 에러가 떴다면 branch와 관련된 오류이기 때문에 위 명령어를 입력해주면 해결됩니다.
8. git push
자 이제 마지막 명령어를 통해서 commit한 폴더와 코드들을 Remote Repository에 올려주기만 하면 됩니다.
$ git push <원격 저장소 이름> <로컬 브랜치 이름>:<원격 브랜치 이름>
{원격 저장소 이름}에는 일반적으로 Remote Repository의 별칭으로 사용된다고 했던 origin이나 본인이 정한 별칭을 입력해주면 되고 {로컬 브랜치}는 말 그대로 Local Repository에서 업로드할 branch의 이름을 뜻하며 이전 단계에서 저희가 main으로 설정해준 것을 기억하실 겁니다.
{원격 브랜치}는 Remote Repository에 업로드할 branch 이름을 뜻하는데, 생략하면 {로컬 브랜치}와 같은 이름의 원격 브랜치가 사용됩니다. 저희는 이전단계에서 Remote Repository의 기본 branch와 Local Repository의 branch 이름을 "main"으로 동일하게 맞춰주었기 때문에 main만 적어주면 됩니다.
정리하면 저의 경우 아래 명령어를 사용하면 되는 것이죠.
$ git push origin main
$ git push origin main -> Local Repository의 "main" 브랜치를 "origin"이라는 이름의 Remote Repository의 "main" 브랜치로 push해 로컬에서 작업한 변경 내용을 원격 저장소로 업데이트할 수 있습니다.
branch를 추적하도록 해서, 이후에 git push 명령어만 입력해도 해당 Remote Repository의 branch 로 push 할 수 있게 만들려면 다음과 같이 -u 옵션을 함께 사용해주면 됩니다.
$ git push -u origin main
자 이제 본인의 Github username과 password를 입력하면!! 아래 메세지와 함께 오류가 날 것입니다??
※ remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: Authentication failed for ~
이는 2021년 8월 이후로 Id/Password 방법이 아닌 token을 이용하여 push할 수 있도록 바뀌었기 때문입니다. 따라서 아래 링크를 따라서 본인의 token을 발급받아 password에 이를 입력해주면 됩니다.
git push를 실행시킬 때마다 username과 발급받은 토큰을 적어야 하기 때문에 이 과정이 귀찮다면 아래 명령어를 이용해 미리 전역 설정 파일에 등록해놓으면 됩니다.
$ git config --global user.name "본인의 아이디"
$ git config --global user.password "발급받은 토큰"
이제 Remote Repository에 잘 업로드되었는지 확인하면 Local Repository의 코드들을 github에 업로드하는 과정이 끝나게 됩니다. 지금까지의 과정을 요약하면 다음과 같습니다.
Remote Repository 생성
$ git init
$ git add .
$ git commit -m "commit 메세지"
$ git remote add origin {your remote repository url}
$ git branch -M main
$ git push origin main
아래 git 명령어에 대해서 이해하기 쉽게 그림으로 나타낸 사진이 있어 가져와봤습니다.
기회가 된다면 다음 포스팅에서는 git branch, 이전 상태로 되돌아가는 git reset에 대해서 살펴보도록 하겠습니다.