Git 설치 및 설정부터 기초 사용법까지

Git 설치부터 SSH Key 등록, Repository 생성, 기본적인 명령어들까지

Git 설치 및 설정부터 기초 사용법까지

이전 글

Git 개념 잡기
Git이란 무엇이며 왜 쓰는 걸까?

들어가며

저번 포스트에 이어, 이번에는 직접 Git을 활용하여 기본적인 Repository를 만들어 보면서 전반적인 과정과 원리를 알아보도록 하겠습니다.

앞으로 다룰 내용은 다음 사항을 전제로 합니다.

  • GitHub를 사용하며, 회원가입은 이미 진행한 것으로 가정합니다.
  • GitHub Desktop 등 GUI를 제공하는 프로그램 관련 내용은 일체 다루지 않으며, Git CLI(Command Line Interface) 및 GitHub 웹 서비스만 사용합니다.

기본 용어

앞으로 저주 등장할 단어들입니다. 상세한 내용은 각각을 직접 활용해 보면서 후술하겠습니다. 지금은 대략적인 의미를 알고 넘어가도록 합시다.

  • Repository 레포지토리, 레포
    프로젝트가 진행되고 파일 변경 사항이 추적되는 작업 공간입니다. 원격 레포와 로컬 레포로 나눌 수 있으며 일반적으로 원격 레포를 로컬 레포로 복제하여 작업한 뒤 작업 내역을 원격 레포에 올리는 방식으로 작업합니다.
  • Commit 커밋
    여러 파일들에 일어난 변경 사항들을 묶어 놓은 작업 단위입니다. 일반적으로 특정 기능을 추가하거나 특정 오류를 해결하는 등 한 가지 목적에 맞는 수정 내역을 하나의 커밋으로 묶습니다.
  • Branch 브랜치
    한 프로젝트에서 여러 작업을 동시에 해야 하는 경우가 있습니다. 특히, 협업에서 여러 기능을 나누어 작업한다고 했을 때 한쪽의 작업이 끝나기를 기다릴 수는 없으므로 브랜치를 활용합니다. 마치 나뭇가지(Branch)가 여러 갈래로 뻗어나가듯, 커밋이 쌓이는 위치를 다르게 설정함으로써 특정 버전을 기점으로 각각의 변경 사항을 쌓아나갈 수 있게 됩니다. 이렇게 쌓은 서로의 브랜치의 커밋을 나중에 언제든 합칠 수도 있으므로 프로젝트 중에는 서로 다른 브랜치에서 작업한 뒤 이를 합치는 것을 반복하게 됩니다.

설치 및 실행

우선 사용 환경에 Git 바이너리를 설치합시다.

Git - Downloads

자신이 사용하는 환경과 필요에 맞는 바이너리를 선택합니다. 환경마다 다른 설치 방법이 제시되는데, 그대로 따라가면 됩니다. 선택지는 모두 기본값으로 해도 무방합니다.

Windows 사용자라면 Git을 열고자 하는 폴더에서 우클릭 > Open Git Bash here를 선택하여 실행하세요

Windows 사용자는 Git Bash(권장) 혹은 명령 프롬프트, MacOS 및 UNIX류 OS 사용자는 터미널에서 Git 관련 작업을 수행할 수 있습니다. 지금부터 언급하는 명령어는 특별한 언급이 없다면 말씀드린 환경에서 실행하면 됩니다.

사전 설정

계정 정보 설정

GitHub 가입 시 입력한 사용자명과 메일 주소를 등록합니다. 다음 두 명령어를 자신의 계정 정보에 맞춰 수정한 뒤 각각 실행해 주세요.

git config --global user.name 사용자명
git config --global user.email my@email.address

GitHub SSH Key 등록

GitHub 클라이언트를 설치하여 활용하는 데 있어 ID, 비밀번호 기반 인증을 활용해도 문제는 없지만, 편의성 및 보안 측면에서 SSH를 사용하는 것이 권장됩니다. 실제로 비밀번호 기반 인증은 이제 지원하지 않고 Access Token을 활용하는 방식으로 변하고 있으므로, 앞으로의 편리한 이용을 위해 SSH 키를 생성하여 등록하도록 합시다. 현재 환경에 기존에 발급받은 SSH Key가 있다면 발급 과정은 넘어가시면 됩니다.

RSA Key 발급

Git에서 사용자 인증을 위해 등록하는 SSH 키는 특정 암호화 방식으로 생성합니다. 옵션을 주어 원하는 방식으로 암호화할 수 있으나 본 과정에서는 패스하겠습니다. 다음 명령어를 입력하여 ssh 키를 생성해 주세요. 실행 이후 입력하라는 값들은 모두 공란으로 두고 엔터로 넘어가면 됩니다.

ssh-keygen -C "my@email.address"

발급받은 Key는 다음 명령어로 확인할 수 있습니다. 절대 타인에게 공유하지 마세요!

cat ~/.ssh/id_rsa.pub

등록

GitHub 웹에 접속하여 로그인합니다. 우상단의 프로필 사진을 클릭하여 사이드 메뉴를 열고 설정(Settings)에 들어갑니다.

좌측 사이드 메뉴에서 SSH and GPG keys를 선택합니다.

페이지 우상단의 New SSH Key를 클릭하여 등록 페이지에 접근합니다.

적절한 이름을 작성해 주세요. Key에는 다음 명령어를 실행하여 출력된 내용을 붙여넣으면 됩니다.

cat ~/.ssh/id_rsa.pub

이후 Add SSH Key를 클릭하여 등록하면 앞으로 SSH 인증을 사용할 수 있습니다. 차후 SSH를 통해 자신의 Repository에 접근하여 작업하는 것이 가능합니다. 새로운 환경에서 작업할 때는 해당 환경에서 본 과정을 그대로 수행하시면 됩니다.

Repository 생성

분산형 버전 관리 서비스의 레포지토리는 원격과 로컬 두 가지로 관리합니다.

원격 레포지토리의 경우 작업물을 보존하고 인터넷을 통해 해당 프로젝트에 어디에서든 접근할 수 있도록 해 줍니다. 실질적인 작업이 이루어지는 공간은 원격 레포지토리를 그대로 복제해 온 로컬 레포지토리입니다. 로컬 레포지토리에서 작업한 내역을

Local Repository 생성

Git에 올려 관리하고자 하는 프로젝트 폴더로 이동합니다. Windows라면 해당 폴더에서 Git Bash를 실행하시면 되고, MacOS나 UNIX에서는 터미널에서 cd 명령어를 통해 이동해 주세요.

다음 명령어를 통해 Git Local Repository를 생성할 수 있습니다.

git init

명령어를 실행하면 해당 디렉토리에 .git 디렉토리가 생성됩니다. 온점으로 시작하는 파일 및 디렉토리는 기본적으로 보이지 않으므로 숨김 파일 보기 설정 혹은 ls -a 명령어를 통해 볼 수 있습니다. 해당 디렉토리에 버전 관리 정보가 저장되므로 지우거나 임의로 수정하지 않도록 주의해 주세요.

이제 Git Client가 해당 디렉토리에서 발생하는 파일 생성, 수정, 삭제 등을 추적하며 버전 관리 관련 기능을 활용할 수 있습니다.

Remote Repository 생성

로컬에서만 작업할 수도 있지만, 다른 환경에서도 작업할 필요가 있거나 다른 사람과 함께 작업한다면 원격으로 해당 레포에 접근할 수 있어야 합니다. 이를 위해 GitHub에 원격 레포를 생성하는 방법을 알아봅시다.

GitHub 메인 페이지나 레포 목록 페이지에서 새 레포 생성 버튼을 통해 다음 페이지에 접근할 수 있습니다.

이름은 자신의 타 레포와 중복될 수 없으며, 설명은 프로젝트에 맞게 적절히 작성하면 됩니다. 기타 신경써야 할만한 요소들을 살펴봅시다.

  • Add a README file
    프로젝트를 소개할 Readme 파일을 미리 생성할 수 있습니다. 레포지토리 메인 페이지에서 Readme파일이 있다면 해당 내용을 미리보기로 보여줍니다. 굳이 지금 생성하기 않아도 나중에 만들면 적용되니 필요한 경우에만 체크합시다.
  • Add .gitignore
    Git에서 관리하지 않을 파일을 명시해 놓는 파일을 미리 생성할 수 있습니다. 본 파일도 나중에 만들어 사용할 수 있으니 필요한 경우에만 체크합시다.
  • Choose a license
    레포지토리에 명시할 라이센스 파일 생성 옵션입니다. 프로젝트의 저작권 관련 명시가 들어가며 템플릿 선택 시 해당 라이센스에 맞는 내용으로 LICENSE 파일을 생성합니다. 차후 자신의 프로젝트에 따라 생성할 수도 있으니, None으로 두셔도 무방합니다.

설정을 모두 마치면 아래의 Create Repository 버튼을 눌러 생성합니다.

위와 같이 나온다면 성공입니다.

Remote Repository 연결

이제 원격 레포와 로컬 레포를 연결할 차례입니다. 로컬 레포에서 다음과 같은 명령어로 원격 레포를 등록할 수 있습니다.

git remote add 원격레포등록명 원격레포주소
git remote add origin git@github.com:Godbell/sample.git

등록명은 무엇으로 하든 상관없습니다. 드물지만 여러 원격 레포를 연결하는 경우도 있는데, 주로 사용할 원격 레포의 등록명만큼은 origin으로 하는 것이 일반적입니다. 레포 주소는 레포 홈에서 복사할 수 있으며, SSH를 등록했다면 SSH 주소를 사용하여 별도의 추가 인증 과정 없이 편리하게 레포지토리를 사용할 수 있습니다.

Clone

원격/로컬 레포를 각각 생성하여 연결하는 경우도 있지만 이미 존재하는 원격 레포를 가져와야 하는 경우도 있습니다. 이를 Clone이라고 합니다. 다음 명령어를 통해 간단하게 원격 레포를 로컬에 복제할 수 있습니다.

git clone 원격레포주소 폴더명
git clone git@github.com:Godbell/sample.git sample_project

이 경우 별도의 git init 없이도 바로 로컬 레포로서 작동합니다. 그래서 새 프로젝트를 시작할 때 GitHub에서 원격 레포를 먼저 만든 후에 Clone을 통해 로컬 레포를 만드는 방법도 자주 사용합니다.

버전 관리 실전

Git이 변경 사항을 저장하는 방법

Git은 파일의 변경 사항을 저장합니다. 정확히는 변경된 파일의 스냅샷을 각 커밋에 저장하는데요, 자세한 내용은 이전 포스트 혹은 본 문서를 참고해 주세요.

Git이 변경 사항을 보여주는 방식

파일의 세 가지 상태

Git은 변경 사항 추적 및 적용을 위해 각 파일을 다음과 같은 상태로 파악합니다.

  • Commited, 커밋됨
    커밋에 포함된 후 더 이상 수정사항이 없는 상태입니다.
  • Modified, 수정됨
    수정된 후 아직 해당 수정 내용이 커밋으로 만들어지지 않은 상태입니다.
  • Staged, 스테이징됨
    수정된 후 해당 파일을 커밋에 포함하려고 하는 상태입니다.

변경 사항을 추적하지 않는 파일은 위 세 가지 상태 중 하나를 부여하는 대신 Untracked라고 명시합니다.

Staging

Git은 레포지토리 내의 모든 변경사항을 추적하지만, 매번 이를 커밋으로 만들지는 않습니다. A 파일과 B 파일을 수정했으나 A 파일을 수정한 내역만 저장하고 싶을 수도 있는 일이죠.
그래서 Git은 스테이징(Staging) 영역을 제공하여 어떤 변경 사항을 커밋으로 만들지 결정할 수 있도록 합니다. 스테이징 영역이란, 커밋으로 만들 변경 사항들이 저장되는 임시 공간을 말합니다. 실습을 통해 알아봅시다.

생성한 로컬 레포에 아무 파일이나 만들어 보도록 하겠습니다. 저는 위와 같이 두 줄짜리 파일을 만들었습니다. Git이 이 변경 내용을 잘 파악했는지 확인해 볼까요? git status 명령어를 통해 알아봅시다.

$ git status
현재 브랜치 main

아직 커밋이 없습니다

추적하지 않는 파일:
  (커밋할 사항에 포함하려면 "git add <파일>..."을 사용하십시오)
	README

커밋할 사항을 추가하지 않았지만 추적하지 않는 파일이 있습니다 (추적하려면 "git
add"를 사용하십시오)

Git이 새로 추가된 README 파일을 인식한 것이 보입니다. 또한 앞서 말씀드린 대로 커밋할 내용을 등록하라고 하죠. 위 메시지에서 언급하는 git add 명령어를 통해 해당 파일의 변경 사항을 스테이징 영역에 포함할 수 있습니다. 특정 파일만 포함할 수도 있고, 디렉토리를 add할 경우 그 하위에서 발생한 모든 변경 사항을 스테이징합니다. 현재 프로젝트 폴더에서 발생한 모든 변경을 커밋하려면, 레포지토리 루트 디렉토리에서 다음과 같이 입력하면 됩니다. Git 명령을 수행하기 전에, 현재 작업 중인 디렉토리가 어디인지 꼭 확인해 주세요!

git add .

다음과 같이 특정한 패턴을 만족하는 파일들의 변경 사항만 추적할 수도 있습니다. 해당 명령어는 someDir 디렉토리 하위의 어디든 .jpg로 끝나는 이름을 가진 모든 파일들의 변경사항을 스테이징한다는 의미입니다.

git add someDir/**/*.jpg

스테이징 후에 상태를 다시 확인해 봅시다.

$ git add .
$ git status
현재 브랜치 main

아직 커밋이 없습니다

커밋할 변경 사항:
  (스테이지 해제하려면 "git rm --cached <파일>..."을 사용하십시오)
	새 파일:       README

방금 추가한 README 파일의 변경 내역을 커밋하기 위해 스테이징한 결과가 보입니다. 만약 해당 내용을 스테이징하지 않도록 변경하려면, 메시지의 안내대로 다음과 같이 입력하면 됩니다.

git rm --cached 스테이징_해제할_파일_혹은_디렉토리명
git rm --cached README

다음과 같이 재귀 옵션(-r, recursive)을 추가하여 제시한 폴더 하위의 모든 파일의 변경 사항을 스테이징 해제할 수도 있습니다.

git rm -r --cached .

Commit

이제 스테이징한 변경 사항을 커밋으로 만들어 봅시다.

$ git commit -m "커밋메시지"
[main (최상위-커밋) 76dd651] 커밋메시지
 1 file changed, 3 insertions(+)
 create mode 100644 README

-m은 커밋 메시지를 남기는 옵션입니다. 해당 커밋이 어떤 변경 사항을 담고 있는지 나중에도 알기 쉽도록 직접 메시지를 작성하는 것입니다. 커밋 메시지를 작성하는 것에도 나름의 규칙이 있는데, 이를 Commit Convention이라고 합니다. 일반적으로 많이들 사용하는 커밋 메시지 컨벤션은 다음을 참고해 주세요.

Conventional Commits
A specification for adding human and machine readable meaning to commit messages

다음과 같이 여러 줄에 걸쳐 커밋 메시지를 작성할 수도 있습니다. CLI 환경에서 단순히 닫는 따옴표를 넣지 않으면 다음 줄을 작성하게 됩니다. 이때, 첫 줄이 커밋 메시지의 제목이 되고, 그 다음 줄부터가 세부 내용이 됩니다.

$ git commit -m "이렇게
dquote> 여러 줄에 걸쳐서
dquote> 작성할 수도
dquote> 있습니다
dquote> 닫는 따옴표 없이 엔터를 치면
dquote> 이렇게 나오는데
dquote> 따옴표를 닫고 엔터를 치는 순간
dquote> 입력이 끝납니다"
현재 브랜치 main
[main (최상위-커밋) d979f27] 이렇게 여러 줄에 걸쳐서 작성할 수도 있습니다 닫는 따옴표 없이 엔터를 치면 이렇게 나오는데 따옴표를 닫고 엔터를 치는 순간 입력이 끝납니다
 1 file changed, 3 insertions(+)
 create mode 100644 README

커밋 목록을 확인해 봅시다.

$ git log
commit d979f274a203d5a5e2f8decb520c175cc071339d (HEAD -> main)
Author: Godbell <12191579@inha.edu>
Date:   Thu Dec 19 20:56:46 2024 +0900

    이렇게
    여러 줄에 걸쳐서
    작성할 수도
    있습니다
    닫는 따옴표 없이 엔터를 치면
    이렇게 나오는데
    따옴표를 닫고 엔터를 치는 순간
    입력이 끝납니다
(END)

로그 출력 모드는 방향키를 통해 스크롤하고 q를 입력해 빠져나올 수 있습니다. 로그에 여러 옵션을 주어 좀 더 보기 좋게 만드는 방법이 있는데, 많이들 사용하는 방식은 다음과 같습니다.

$ git log --graph --oneline

현재 작업중인 예시는 하나의 커밋밖에 없어 실용성이 체감이 잘 되지 않지만, 수많은 커밋이 있는 큰 프로젝트에서는 다음과 같이 보이게 되어 확실히 좋습니다. 한 줄 한 줄이 모두 하나의 커밋입니다.

좌측의 그래프에 대해서는 차후 브랜치에 대해 설명할 때 자세히 다루겠습니다. 현재는 "main 혹은 master 브랜치에서 작업한다"라는 사실만 알아 두시면 됩니다. 포스트는 main 브랜치를 기준으로 설명하겠습니다.

$ git graph --graph --oneline --all
* 32d11e2 Fix: check phone number to check auth code (#20)
|\
| * a9d168b Feat: apply user db schema change (#18)
| * a89727a Fix: set cookie path to root (#16)
| * 8a908db Refactor: Separate Kakao OAuth REST API Call Code (#14)
| * 50ebdc0 Refactor: separate utility for session management (#12)
| * 59ee7a6 Feat: kakao OAuth register, login, deletion (#10)
| * a2d4e42 Feat: enable custom exception handler and its test apis (#9)
| * 8415651 Style: rewrite throwing JSON message (#8)
| * 437d56f Refactor: provide only redis client object
| * 06e9a5e Fix: update locations and their usages (#6)
| * fde5e0e Feat: create format validation utility (#4)
|/
* df17933 inital commit

Git Ignore

환경 변수 목록, 로그, 캐시 등 레포에 포함되지 않았으면 하는 파일들도 있습니다. 이때 레포 루트 디렉터리에 .gitignore 파일에 경로명을 작성하면 해당하는 경로의 파일들을 제외할 수 있습니다.

# 이렇게 주석을 작성할 수도 있습니다.

# 특정 파일 제외
path/to/file/filename.txt

# 특정 디렉터리 제외
path/to/dir/

# 대소문자 패턴 - Library 디렉터리와 library 디렉터리를 제외
[Ll]ibrary/

# 와일드카드 패턴 - path/to/dir 디렉토리 하위에서
#               ".ext"로 끝나는 이름을 가진 파일을 모두 제외
path/to/dir/**/*.ext

# 제외하지 않도록 설정 - 해당 파일 혹은 경로만큼은 패턴에서 감지되지 않도록 함
!some/important/file.txt
!some/importalt/dir/

IDE나 기술 스택별로 Ignore 파일 템플릿이 있으니 참고하면 유용합니다. 요즘은 프로젝트 생성 시에 IDE에서 기본적으로 만들어 주는 경우가 대부분입니다.

GitHub - github/gitignore: A collection of useful .gitignore templates
A collection of useful .gitignore templates. Contribute to github/gitignore development by creating an account on GitHub.

만약 Ignore 파일을 수정했다면 다음과 같이 재적용할 수 있습니다. 레포지토리 루트 디렉토리에서 실행하면 됩니다!

$ git rm -r --cached . 
$ git add .

모든 파일을 Untracked 상태로 만든 뒤 스테이징하는 방식입니다. .gitignore 파일에서 제외하라고 명시한 파일들은 제외하고 스테이징하게 됩니다. 하지만 한 번 올라간 중요 정보는 내리기 쉽지 않으므로 처음부터 Ignore 파일을 잘 작성해서 보안상 중요한 정보는 유출되지 않도록 관리합시다.

Push

로컬 레포에 커밋을 생성했으니, 해당 내용을 원격 레포에도 반영해야겠죠? 현재 작업 중인 로컬 레포의 정보를 원격에 올릴 때는 push 명령어를 사용합니다.

git push 원격레포명 브랜치명
$ git push origin main
오브젝트 나열하는 중: 3, 완료.
오브젝트 개수 세는 중: 100% (3/3), 완료.
오브젝트 쓰는 중: 100% (3/3), 398 bytes | 398.00 KiB/s, 완료.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
To github.com:Godbell/sample.git
 * [new branch]      main -> main

새 레포에 push한 경우 원격 레포에는 브랜치 정보가 아직 없으므로 로컬 브랜치와 동명의 새 브랜치를 등록하게 됩니다. GitHub 홈페이지에서 확인해 봅시다.

변경한 사항이 잘 올라간 것을 확인할 수 있습니다.

Pull

Pull 명령은 말 그대로 "끌어오는" 것으로, 원격 브랜치의 변경 내역을 현재 브랜치로 가져옵니다.

Pull 명령어는 일반적으로 현재 작업 중인 공간에 원격 레포지토리의 변경 사항을 업데이트하는 데 사용합니다.

git pull origin master

현재 작업 중인 로컬 브랜치에 원격 master 브랜치의 변경 내역을 업데이트합니다. 상세한 내용은 Merge에 대한 설명에서 다루도록 하겠습니다. 지금은 그저 현재 상태를 최신으로 업데이트하는 것이라고 알아 두면 되겠습니다.

마치며

이번 포스트에서는 Git의 기본 구조, 파일의 상태 및 기본 명령어를 알아 보았습니다. Add -> Commit -> Push 세 단계를 통해 로컬 레포에서 발생한 변경 사항을 원격 레포에 저장하는 과정을 살펴 보았으며, 이를 바탕으로 다음 포스트에서부터는 브랜치 기능과 함께 더 심화된 내용을 알아보도록 하겠습니다.

다음 글

Git Branch와 Merge
이전 글 Git 설치 및 설정부터 기초 사용법까지Git 설치부터 SSH Key 등록, Repository 생성, 기본적인 명령어들까지GODBELL DEV LOUNGEKim Jongha 들어가며 본 포스트에서는 이전 글에서 간략하게만 설명하고 넘어간 Branch에 대한 자세한 사항과 함께 다양한 방법을 통한 Merge에 대한 설명을 다루겠습니다. Branch 레포지토리를 만들어 프로젝트를 진행하고 있고 현재까지 master 브랜치에 세 개의