시작하기전에
현대 모든 개발자들이 꼭 알아야 하는 필수 도구인 Git, GitHub가 무엇인지 살펴보고 핵심 개념과 Git을 배우기 위해 필요한 사전 지식을 배운다.
Git과 GitHub
버전관리의 중요성
Git은 프로젝트의 변경 사항을 추적하고 여러 사람이 프로젝트에 협업할 수 있도록 도와주는 기술이자 도구이다. 현재 거의 모든 프로젝트들은 Git을 통해 버전 관리를 하고 있다고 봐도 무방하다.

적게는 3~4명에서 많게는 수백명의 개발자가 하나의 프로젝트에 참여하고 있고 설계에 따라 각자 맡은 역할의 코드를 작성하고 이를 통합하고 테스트하고 배포하는 일련의 과정은 소프트웨어 개발에 있어 매우 중요한 파이프라인 이라고 할 수 있다.
만일 개발팀이 같은 건물이나 사무실을 사용하는 것이 아니라 물리적으로 떨어진 곳에 위치하거나 세계 여러 곳의 개발팀이 협력한다고 할 때 개발은 더이상 코드 레벨의 문제가 아니게 된다.
소프트웨어 개발이 어느정도 수준을 넘어서면 단순히 실력있는 개발자만 있다고 되는 것이 아니라 프로그램 소스의 버전관리와 테스트, 그리고 실제 운영 서비스로 배포하는 일련의 과정이 얼마나 효과적이고 체계적으로 되어있는지가 더 중요한 문제가 될 수 있다.
이와 같이 소프트웨어 개발에서 배포까지의 일련의 과정을 지속적으로 관리할 수 있는 체계가 오랜기간 연구되고 현재 DevOps라는 개념이 정착하게 되었다.
DevOps 는 Development + Operation 의 합성어로 개발과 운영을 일련의 파이프라인으로 지속적으로 유지보수를 포함해 운영해 나가는 개념을 말한다. 여기에는 여러 소프트웨어적인 도구들이 사용되고 있으며 Git도 그중의 하나이다.

Git의 탄생
Git은 리눅스(Linux)를 개발한 리누스 토발즈(Linus Torvalds)가 2005년 처음 개발했다.
Linux
- 유닉스(Unix) 운영체제의 오픈 소스 버전
- 1991년 토발즈가 헬싱키 공대 시절 개발해 오픈소스로 공개
- PC에서도 강력한 유닉스 운영체제를 사용할 수 있는 계기가 됨
- 이후 PC급 서버 시장도 활성화
- 대표적인 모바일 OS인 안드로이드도 리눅스 기반임
토발즈가 Git을 개발하게 된 배경과 관련해서는 다음과 같은 재미있는 일화가 있다.
Git 개발 배경
당시 코드 버전 관리에 대표적으로 사용되던 것은 SVN(Subversion)과 CVS(Concurrent Versions System)이었다. SVN은 CVS보다는 나중에 나와 널리 사용되고 있었으나 토발즈는 이들 시스템이 마음에 들지 않았고 리눅스의 버전관리를 소위 메일링리스트(일종의 메일 게시판) 등을 통해 관리했었다.
당연히 이러한 방식은 한계가 있었기 때문에 BitKeeper라는 상용 소프트웨어를 선택해 사용했는데 대표적인 오픈소스 프로젝트인 리눅스에 상용 소프트웨어로 버전관리를 한다는 것이 좋게 받아들여지지 않았고 BitKeeper에서 리눅스 개발자들을 제한하는 상황이 되어 토발즈는 다른 대안을 찾다가 직접 리눅스 개발 중단을 선언하고 2주 동안의 개발을 거쳐 만들어낸것이 Git 이라고 한다.
Git 자체도 오픈소스 프로젝트 이므로 전세계 개발자들의 협력으로 오늘에 이를 수 있었다. Git, GitHub는 모든 개발자들이 알아야 하는 필수 도구로 프로젝트의 변경 사항을 추적하고 협업을 지원하는 강력한 기술이자 도구이다.
기본적으로 Git으로 버전 관리되는 프로젝트는 파일이 들어 있는 폴더로 구성되며, Git은 프로젝트 파일에 가해진 변경 사항을 추적한다. 이를 통해 작업의 다양한 버전을 저장할 수 있으며, 이러한 이유로 Git을 버전 관리 시스템이라고 부른다.
Git을 배워야 하는 이유
- 버전 관리: 코드 변경 이력을 체계적으로 관리할 수 있다.
- 협업 지원: 팀원들과 효율적으로 협업하며 충돌을 최소화할 수 있다.
- 백업 및 복구: 작업 중인 코드의 이전 상태로 쉽게 복구할 수 있다.
- 분산 저장소: 로컬 저장소와 원격 저장소를 활용하여 작업 환경의 유연성을 제공한다.
- 오픈소스 기여: 오픈소스 프로젝트에 참여하거나 자신의 프로젝트를 공유할 수 있다.
- 효율적인 워크플로우: 브랜치와 병합을 통해 다양한 기능 개발 및 테스트를 독립적으로 진행할 수 있다.
핵심 기초
Git은 개발자의 필수 역량이라고 앞에서도 이야기 했는데 그러면 언제쯤 Git을 배워야 할까?
정답은 없지만 최소 컴퓨터개론이나 하나 이상의 프로그래밍 언어를 배운 이후가 적당하지 않을까 생각한다. 사실 Git 자체는 프로그램 언어 처럼 복잡한 문법을 가진것도 아니고 개념만 확실하게 이해 한다면 그리 어렵지 않게 시작할 수 있을것이다.
그러나, VSCode와 같은 개발도구 사용, 터미널과 커맨트라인 명령어 사용을 위해 기본적인 운영 체제 와 파일 시스템에 대한 이해가 어느정도 필요하다. 여기서는 일반인들은 잘 몰라도 되는 내용이지만 개발자로서 Git 사용을 위해 필수적으로 알고 있어야 하는 내용을 간단히 살펴보도록 한다.
파일시스템
컴퓨터에서 모든 것은 파일이라고 볼 수 있다. 운영체제를 구동시키는 것도 파일이고 프로그램의 소스 코드와 실행 파일도 파일이다. 심지어 컴퓨터에 연결된 장치들도 디바이스 드라이버 파일을 통해 연결된다.
Git에서 관리하는 대상도 기본적으로 파일이며 보통 프로그램의 소스 코드를 관리하지만 실제로는 꼭 소스 코드일 필요는 없고 일반 파일도 동일하게 관리할 수 있다.
파일(File)
파일은 컴퓨터에서 데이터를 저장하는 단위로 디스크나 SSD등의 저장장치에 저장된다.
- 파일은 디렉토리안에 존재할 수 있으며 일반적으로 확장자를 가짐.
- MS 오피스 프로그램의 경우 키보드나 마우스로 입력한 내용을 .pptx, .xlsx, docx 와 같은 확장자의 파일로 저장하고 파일로 부터 내용을 불러옴.
- 게임 프로그램의 경우 마지막 성공 스테이지 라든가 현재 게임의 진행 상황등이 파일에 저장이 되고 게임을 시작할때 해당내용을 불러옴.
- html, json, java, jpg, mp3, mp4 등 다양한 형식의 파일이 존재.
디렉토리(Directory)
디렉토리는 파일들을 관리하기 위한 구조로 일종의 트리(Tree)형태로 구성된 방(room) 개념이다.
- 유닉스 계열의 경우(Linux, MacOS, Android, iOS 등) 최상위 디렉토리는 보통 루트(root)디렉토리 라고 하며
/로 표시. - 윈도우의 경우
C:\혹은 'C:/가 루트가 됨. - 디렉토리는 폴더라고도 함.
- 자바의 경우 윈도우에서도 유닉스와 동일하게
/로 경로를 구분 하는 것이 가능.
권한관리(Permission)
대부분의 운영체제는 파일마다 권한 설정을 통해 일반 사용자와 시스템 관리를 위한 root 사용자를 구분하고 있다.
- 기본적인 권한은 소유자, 그룹, 공개로 구성.
- 각 사용자 유형에 대해 r(읽기), w(쓰기), x(실행) 권한을 부여
- 어떤 파일에
rwx r-x r-x라는 권한이 있다면 소유자는 읽기,쓰기,실행이 모두 가능하고 나머지는 읽기와 실행만 가능. - 시스템에서 관리하는 파일은 root 소유로 두어 일반 사용자의 접근을 제한.
- 프로그램에서 특정 파일을 읽을때 파일 위치도 중요하지만 권한이 없는 파일을 쓰려고 하면 에러가 발생.
터미널과 쉘
터미널(Terminal)
터미널은 원래 유닉스 기반의 대형 컴퓨터에서 사용자들이 컴퓨터에 접속하기 위해 사용했던 단말기를 의미한다. 즉 하나의 컴퓨터를 케이블로 연결해 여러명이 접속해 사용하는 방식이었다. 각각의 터미널은 대부부은 특별한 기능은 없고 모니터와 키보드를 가지고 있었으며 나중에는 확장되어 프린터나 마우스등이 연결되는 형태로 까지 발전 했다.
더미 터미널
터미널은 PC가 보급화 되기 이전에는 더미 터미널(Dumb Terminal) 즉 특별한 기능이 없는 터미널이라는 용어로도 불려왔다. 사진은 univac 컴퓨터 접속을 위한 더미 터미널이다.
출처: PC Magazine
지금은 개인용 컴퓨터를 사용하기 때문에 더이상 과거와 같은 터미널을 사용하지는 않는다. 대신 원격으로 컴퓨터에 접속하거나 혹은 명령어 입력을 통해 컴퓨터를 직접 제어 하기 위해 사용하는 소프트웨어를 터미널 혹은 콘솔(Console) 이라고한다.
모든 운영체제는 기본적인 터미널 프로그램을 내장하고 있으며 전문적으로 만들어진 별도 프로그램도 많이 개발되어 있다. 지금과 같은 GUI(Graphical User Interface)가 보편화되기 이전에는 터미널을 통해 컴퓨터를 조작하는 CLI(Command Line Interface)를 주로 사용 했으며 GUI가 사용되면서 CLI의 사용은 급속도로 감소 했다.
다만 유닉스 계열에서는 아직도 CLI를 더 많이 사용하고 PC의 경우에도 최근에는 개발에 필요한 소프트웨어를 설치하고 모듈을 관리하고 프로젝트 구조를 생성하거나 Git/GitHub 를 통해 공유하는 과정에서 CLI 사용이 급증하고 있는 추세이다.
기억해 두세요!
- 본 교재에서도 기본적으로 CLI를 기반으로 Git 을 배운다.
쉘(Shell)
쉘은 사용자와 커널사이에서 명령을 해석하여 전달하는 해석기(Interpreter)또는 번역기(Translator)의 역할을 수행한다.
즉, 사용자가 입력한 명령이나 파일에서 읽어들인 명령을 해석하고 적절한 프로그램을 실행시킨다. 사용자가 로그인하면 쉘은 자동으로 실행되어 사용자가 명령을 하기를 기다린다.
터미널 혹은 콘솔 프로그램을 실행하면 나오는 텍스트 화면이 쉘이다. 유닉스 계열은 bash, zsh, csh 등이 있고 윈도우는 cms, powershell, wsl 등 여러 쉘이 있어 취향에 맞게 선택해 사용할 수 있다. 보통 많이 사용하는 것은 bash이며 최근에는 zsh 사용이 늘어가는 추세이다.(맥 OS의 기본 쉘도 zsh)

쉘이 사용자의 명령을 기다리고 있음을 나타내는 표시가 프롬프트이다. 쉘이 사용자가 명령어을 입력하면 쉘은 이를 분석해 해당 명령이 있으면 실행시키고, 없으연 오류 메시지를 출력한다.
프롬프트는 설정을 통해 표시되는 정보를 변경할 수 있으며 여러 쉘 확장 프로그램을 통해 Git 작업에 최적화된 정보를 보여주도록 설정하는 것도 가능하다.
프롬프트 정보
- 호스트 즉, 현재 접속한 컴퓨터(로컬 혹은 원격) 정보
- 로그인한 사용자
- 현재 디렉토리 위치
- 그 외 확장 프로램 사용시 Git 정보 등.
쉘 프롬프트를 좀 더 보기 좋고 작업에 편리하게 사용하려면 다음 정보를 참고하도록 한다.

Powerlevel10k
- 대표적인 zsh 테마 프로그램.
- Oh My Zsh을 비롯한 여러 컴포넌트로 구성됨.
- 맥, 리눅스 에서 많이 사용. 윈도우는 WSL2에서만 가능.
- https://github.com/romkatv/powerlevel10k
Oh My Posh
- 여러 쉘에서 동작하는 프롬프트 커스터마이징 툴.
- 윈도우, 맥, 리눅스 모두에서 사용할 수 있음.
- https://ohmyposh.dev/docs/
CLI
CLI는 Command Line Interface의 약어로 터미널에서 제공되는 쉘에서 텍스트 기반의 명령으로 컴퓨터를 다루는 것을 말한다.
$ npm install ..
$ git remote add origin https://github.com/username/myproject.git
$ gem install ..
- 맨앞의
$표시는 보통 아무 설정도 없는 기본 쉘 프롬프트를 의미. - 윈도우의 경우
c:\>처럼 표시됨.
CLI 명령어는 운영체제에서 제공하는 명령어들과 직접 작성한 쉘스크립트, 컴퓨터에 설치한 프로그램에서 제공하는 명령어 등을 사용할 수 있다.
예를 들어 파워포인트를 아이콘을 클릭해 실행할수도 있고 쉘에서 CLI로도 실행할 수 있다고 생각 하면 된다.
CLI 사용을 위해 중요한 개념은 PATH 환경 변수 이다. CLI에서는 기본적으로 현재 디렉토리에 있는 파일들만 참조할 수 있기 때문에 운영체제의 다른 디렉토리에 있는 파일/명령어를 실행하려면 해당 디렉토리로 이동해야 하는 문제가 있다. PATH환경 변수는 운영체제에서 실행할 파일들이 있는 위치를 미리 정해 둔 것으로 쉘에서 실행하는 명령어들은 반드시 PATH 환경변수에 포함되어 있어야 한다.
만일 어떤 명령어를 실행했는데 해당 명령어를 못찾는다는 메시지가 나온다면 설치가 안되것이거나 PATH변수에 경로가 포함되지 않아서 이니 참고한다.
Posix와 WSL
모든 운영체제는 파일이나 시스템 관리를 위해 기본적인 명령어를 제공하고 있다. 예를 들어 디렉토리 이동이나 파일 생성, 삭제, 이름 변경등이 대표적인데 이들 명령어들은 운영체제 마다 이름이나 옵션이 다르다.
이러한 문제 해결을 위해 POSIX라는 것이 제안 되었다.
POSIX는 IEEE가 제정한 유닉스 운영체제의 공통 API 규격으로 이식성이 높은 유닉스 응용프로그램을 개발하기 위한 규격이다. 이 규격을 따르면 유닉스와 직접적인 연관이 없어도 유닉스 호환(Unix-like) 운영 체제라고 볼 수 있다.
리눅스의 경우 유닉스와는 별도로 개발되었지만 PC용 유닉스로 처음 개발되었기 때문에 POSIX 표준을 거의 다 준수하고 있어 리눅스는 유닉스 호환 운영 체제로 이야기 할 수 있는것이다.
macOS는 유닉스 계열인 Darwin BSD에 기반하고 있으며 10.5 버전부터 POSIX 정식 인증을 받아 유닉스와 동일한 운영환경을 보장하고 있다.
윈도우의 경우 XP에서 POSIX 지원이 사라져 cygwin 이라는 프로그램을 이용해야 했으나 Windows 10 Anniversary Update에 들어서 WSL(Windows Subsystem for Linux)이라는 리눅스 서브시스템을 다시 탑재하여 POSIX 환경을 이용할 수 있게 되었다. 현재는 WSL2라는 이름으로 윈도우에 추가적인 설치를 통해 사용할 수 있다.
WSL2와 관련해서는 마이크로소프트 WSL 가이드 를 참고한다.
기억해 두세요!
- POSIX 를 지원하는 경우 윈도우, 맥, 리눅스 등에서 모두 동일한 명령어와 사용법으로 CLI를 사용할 수 있다는 것을 의미한다.
- 여러 운영체제에서 동일한 사용성을 보장하는 것으로 매우 중요함.