기타 학습, 과제

[내일배움캠프] 최고의 VCS, Git을 사용해보자

park94128 2025. 8. 22. 01:29

버전 관리 시스템(VCS)이란 무엇인가

버전 관리 시스템은 파일 변화를 기록했다가 이후에 특정 시점으로 되돌릴 수 있는 시스템이다. 이것을 사용하면 각 파일 또는 프로젝트를 통째로 이전 상태로 되돌릴 수 있다. 또한 시간에 따라 수정 내용을 비교해 볼 수 있고 문제가 발생하면 누가 원인인지 확인할 수도 있다. 게다가 파일을 실수로 삭제하거나 망쳐놨을 때도 쉽게 복구할 수 있다.

VCS가 없을때 발생하는 문제점 예시

 

VCS는 여러 종류가 있는데 그 중 제일 많이 쓰이는 것이 Git이고 그 외에 SVN, Plastic SCM, CVS 등이 있다. 언리얼 엔진에서는 고용량 등의 이유로 Perforce를 권장하고 있지만 제일 많이 쓰는 Git을 배워둔다고 나쁠 것은 없다. 프로그래머가 언리얼 엔진으로만 개발하라는 법은 없다.

 

Git이란?

리눅스 창시자인 리누스 토르발스가 개발한 VCS. 원래는 리눅스 개발에 어떠한 VCS를 쓰지 않았지만 한계를 느끼자 BitKeeper라는 VCS를 사용하기 시작했다. 그 후 얼마 지나지 않아 이 프로그램 쪽과 마찰이 생겼고 이것을 기점으로 자신만의 VCS를 만들자고 한 것이 Git의 시작이다. Git이 공개되자 그 전까지 존재했던 수 많은 VCS의 점유율을 뺏어갔고 현재는 압도적인 점유율을 보여주고 있다. 아마 다음과 같은 이유일 것이다.

- Git 자체가 오픈소스라서 환경만 갖춘다면 누구든지 무료로 쓸 수 있다.

- 중앙 서버에서 버전 내역을 가져와 로컬에서도 처리할 수 있다. 이 덕분에 오프라인 환경에서도 제약이 덜하다.

- 로컬에 작업할 수 있다는 점에서 병합 문제가 덜 발생한다. 로컬에서 병합 문제가 발생하면 그것을 해결한 다음에 중앙 서버에 올린다는 점 때문이다.

- 오픈소스의 특성 때문인지 Git을 지원하는 프로그램이 늘고 있는 추세이며 Git 자체를 쉽게 쓰기 위한 프로그램도 많다

 

그럼 GitHub는 뭔데?

GitHub 홈페이지에 접속하면 반겨주는 화면

 

버전 관리를 위해 Git을 사용할 것이라면, 앞서 설명한 중앙 서버가 필요하다. 자체적으로 중앙 서버를 갖추기도 하지만 소규모 프로젝트나 인디게임 수준을 만드는 사람에겐 어려운 일이다. GitHub가 없다면 말이다.

GitHub Git 저장소 호스팅 서비스, 공동 협업 플랫폼 등을 제공해주는 기업이다. 개발자 친화적인 정책으로 인해 대규모가 아닌 이상 누구든지 무료로 Git의 중앙 서버 역할을 해주는 호스팅 서비스를 이용할 수 있다. 그래서 다양한 종류의 프로젝트가 관리되고 있음을 볼 수 있다. 원래는 무료로 이용시 무조건 프로젝트를 공개해야 하지만 최근에는 무료로 이용해도 프로젝트를 공개하지 않아도 되니 소규모 회사 및 단체에서도 쓰기가 용이하다.

참고로 이러한 무료 호스팅을 제공해주는 곳은 GitHub외에도 GitLab, Bitbucket, Azure DevOps 등이 있다.

 

Git 클라이언트

Git만 설치해서 이용할 경우, 각종 기능을 직접 명령어를 입력함으로 이뤄진다. 마치 코딩을 하는 것 처럼 말이다. 아무것도 없는 화면에 글자만 나열되는 것은 인간에게는 매우 비직관적이니 진입 장벽이 높다. 다행히도 이러한 명령어를 직접 입력할 필요가 없이 직관적인 인터페이스를 이용할 수 있는 클라이언트가 존재한다.

GitHub에서 직접 제공하는 GitHub Desktop, 리눅스에서 자주 쓰는 SmartGit, SVN 사용자가 쉽게 쓰기 위해 만들어진 TortoiseGit 등이 있는데 여기서는 Sourcetree라는 것을 사용할 것이다.

Sourcetree는 윈도우, 맥에 관계없이 사용할 수 있으며 기업에서도 무료로 쓸 수 있다는 점 때문에 생각보다 자주 채택되는 프로그램이다. 그래서 아래에 설명할 내용은 Sourcetree를 사용하여 GitHub에 자신의 프로젝트를 관리하는 방법을 적을 것이다.

 

GitHub에 저장소(repository)만들기

당연하지만 GitHub의 서비스를 이용하려면 먼저 GitHub에 계정을 만들어야 한다.

GitHub에 사용할 이메일, 비밀번호와 이름을 입력한다. 국가는 자동으로 대한민국(Korea, South)으로 지정되었을 것이다. 계정 정보를 입력하는 것이 귀찮다면 그냥 구글 계정으로 바로 시작해도 된다. 스마트폰 시대인 요즘엔 웬만하면 구글 계정을 가지고 있을 테니 이쪽이 더 편할 것이다.

로그인 후 반겨주는 화면에서 왼쪽에 저장소 목록이 있다. 물론 처음 만들었다면 비었을 것이다. 여기서 New를 눌러서 새 저장소를 만들 수 있다.

여기서 저장소의 정보를 입력하여 새 저장소를 만들 수 있다.

- Owner : 막 만든 새 계정이면 당연히 자신 하나만 있을 것이다.

- Repository name : 저장소 이름. 관리할 프로젝트에 맞게 자유롭게 입력하자. 이 이름은 저장소를 찾아올 수 있는 주소에도 사용된다.

- Description : 말 그래도 설명을 적는 곳이다. 필수는 아니다.

- Choose visibility : 이 저장소의 공개 여부를 결정할 수 있다. 공개를 하면 누구든지 이 저장소에 접근할 수 있다.

- Add README : 흔히 설명서 목적으로 집어 넣는 Read me 파일을 저장소에 생성할 수 있다. 있다면 저장소 페이지를 열 때 그 파일의 내용이 같이 출력된다.

- Add .gitIgnore : 임시파일이나 개인정보처럼 저장소에 올리기에 부적절한 파일이나 폴더를 무시하도록 설정하는 파일을 생성한다. 프로젝트의 종류를 선택하면 그에 맞게 자동으로 생성해준다.

- Add license : 이 저장소를 대중에게 공개할 생각이라면 이 저장소에 대한 라이선스(이용 허락)가 명시된 쪽이 좋다. Apache, GNU, MIT 등을 선택하면 자동으로 해당 내용이 담긴 라이선스 파일을 생성한다.

다 입력하고 생성을 하면 Git 저장소가 완성된 것을 볼 수 있다. 이제 GitHub가 중앙 서버의 역할을 할 것이며 이곳에 프로젝트가 저장될 것이다.

 

Sourcetree 설치하기

https://www.sourcetreeapp.com/

Sourcetree 홈페이지에서 Download for Windows를 누르자. 맥OS라면 바로 밑에 있는 Also available for Mac OS X를 누르면 된다. 여기서는 윈도우에서 설치할 것을 가정한다.

설치 파일을 실행하면 Bitbucket 로그인을 요구하는 곳이 있는데 그냥 밑에 있는 건너뛰기를 누르자

 

설치 화면을 보여준다고 재설치 하는 과정이라 이미 설치된 Git과 Mercurial을 감지했다.

Git을 쓸려면 당연히 Git을 설치해야 한다. 지금은 Mercurial이 불필요하니 설치하지 않아도 된다.

이메일 주소와 이름을 입력하자. 참고로 여기서 입력하는 것은 GitHub에 로그인 하는 것이 아니라 Sourcetree내에 기록할 사용자 정보다.

막 계정 만들고 저장소를 만든 시점엔 아무것도 없으니 아니오를 눌러 설치를 마친다.

 

GitHub 저장소와 Sourcetree 연동하기

Sourcetree 화면 위쪽에 원격을 눌러보자. 거기서 계정 추가를 눌러야 한다.

위쪽 영역에서 호스팅 서비스는 ‘GitHub’를 고른다. 그리고 선호 프로토콜은 ‘HTTPS’를 고른다.

아래쪽 영역에서 인증이 ‘OAuth’인 것을 확인하고 'OAuth 토큰 새로고침'을 눌러보자.

그러면 GitHub 페이지가 열리면서 각종 정보를 Sourcetree와 연동할거냐고 물어보는데 허용하면 된다. 참고로 자세히 보면 ‘Atlassian’이라는 유저가 접근한다고 적혀있는데 Sourcetree를 만든 회사 이름이다.

 

이제 새로고침을 눌러주면 GitHub의 저장소가 나오는데 이 저장소를 로컬에 복사할 수 있다. 복사할 저장소에 있는 ‘Clone’을 누르자

 

그러면 저장소 주소와 로컬 저장 위치, 이름이 자동으로 지정된다. 로컬 저장 주소는 원하는 곳에 지정할 수 있지만 이미 파일이 있는 곳은 지정할 수 없음에 주의하자

또한 비공개 저장소로 만들었다면 사용자를 확인하는 과정을 거치게 된다. 귀찮다면 그냥 공개 저장소로 만들자.

이 화면이 나온다면 연동 작업이 완료됐다는 의미다.

..git ignore 파일을 생성했다.

저장소 생성시 파일을 생성했다면 익스플로러에서 열기를 눌러보자. 그러면 그 파일이 있는 것을 볼 수 있다.

 

파일을 올려볼까? ...어라?

로컬 저장소에 프로젝트를 만들고 Sourcetree화면을 보면 물음표 아이콘과 함께 프로젝트 파일이 표시되는 것을 볼 수 있다. Sourcetree에서 이 물음표는 관리되지 않는 파일이라는 의미로, 쉽게 말해 새로 만들어진 파일이라는 의미다.

 

중앙 서버로 보내고 싶은 파일을 골라 선택 내용 스테이지에 올리기를 누르면 그 파일을 올릴 준비를 한다.

 

그리고 화면 하단에 이것에 대한 설명을 적어주고 커밋을 누르면 커밋을 진행한다. 만약 ‘origin/main에 바뀐 내용 즉시 푸시를 누르면 커밋 완료후 바로 푸쉬를 진행한다.

 

- 커밋(commit) : 변경 내역을 저장소에 기록하는 것을 말한다. 커밋만 했다면 로컬 저장소에는 변경점이 기록되나 아직 원격 저장소(여기서는 GitHub에 생성한 저장소)에 기록되지 않았다는 것을 의미한다.

- 푸쉬(push) : 로컬 저장소의 변경점을 원격 저장소에 올린다. 지금 추가한 파일은 이 푸쉬라는 기능으로 업로드 된다.

 

어라, 안되잖아?

그런데 이쯤이면 뭔가 사용자 정보와 비밀번호를 입력하라는 문구가 뜰 것이고, 그리고 뭔가를 입력했다면 아마 오류가 뜨면서 푸쉬가 안될 것이다. 사실 GitHub는 푸쉬를 할 때 비밀번호를 통한 인증을 중단했기 때문이다. (다른 저장소라면 정보 입력을 한 것이 의미 있겠지만 적어도 GitHub에서는 무의미하다) 그 대신 GitHub는 토큰을 통한 인증을 지원한다.

 

GitHub에서 토큰 발급받기

프로필 사진이 없어서 기본 사진이다.

GitHub 페이지에서 오른쪽 위에 있는 프로필 사진을 누르면 메뉴가 나오는데 여기서 Settings에 들어간다.

진짜 저 아래쪽에 있다.

그리고 왼쪽 메뉴의 제일 아래쪽에 있는 Developer settings에 들어간다.

다시 왼쪽을 보면 Personal access tokens가 있는데 여기서 Tokens (classic)을 눌러주자

 

이제 여기서 Generate new token (classic)을 누르면 토큰이 생성 화면으로 넘어간다.

 

- Note는 아무거나 적으면 된다.

- Expiration은 언제 만료되는지 지정하는 옵션이다. 만료일을 지정하지 않아도 되지만 바로 아래 적혀있듯 권장사항은 아니다.

- 마지막으로 Select scopes에는 반드시 repo를 선택하자.

 

다했으면 화면을 쭉 내려서 ‘Generate token’버튼을 눌러 토큰을 생성하자.

 

이 토큰을 복사하자. 이 토큰은 절대로 공유하면 안된다. 토큰을 통해 계정에 접근할 수 있기 때문이다. 그리고 이 화면을 벗어나면 확인이 불가능하니 만료기간을 정하지 않았다면 반드시 따로 저장해야 한다.

 

Sourcetree 화면의 오른쪽 위의 설정을 눌러보자

 

그러면 현재 저장소의 주소가 보이는데 여기서 편집을 누른다.

 

여기서 URL/경로 부분에 있는 GitHub 저장소 주소에다가 토큰을 입력하자.

기존 저장소의 형식이 ‘https://github.com/(사용자)/(저장소)’의 형식이라면 이것을 ‘https://(토큰)@github.com/(사용자)/(저장소)형식으로 변경해야 한다.

 

깔-끔

그리고 화면 위쪽의 Push를 누르면 성공한 모습을 볼 수 있다.

 

History에 들어가보면 로컬인 main, 원격인 origin/main이 같은 줄에 있는데 로컬의 변경점이 정상적으로 원격에 반경됐다는 의미이며 저장소 페이지로 가보면 올라간 파일이 반영됨을 볼 수 있다.

 

손쉽게 .git ignore 등록하기

현재 Visual Studio에서 C++ 콘솔 프로젝트를 만들고 컴파일하면 기본적으로 x64 폴더가 생성되는데 빌드의 부산물이라고 생각하면 된다. 그런데 이 폴더의 내용은 저장소에 올릴 필요가 없으며 오히려 다른 컴퓨터에 옮기면 문제의 원인이 될 수 있다. 그래서 이 폴더는 무시할 필요가 있다.

 

파일 아무거나 하나를 집어 오른쪽 클릭을 하면 나오는 메뉴에서 무시를 누르면 어떻게 무시할 것인지 선택하는 화면이 나온다. 선택한 파일을 무시할 것인지, 그 파일의 확장자를 무시할 것인지, 혹은 그 파일이 속한 경로를 지정하여 무시할 수 있다. x64 폴더 자체를 무시할 것이니 이하 모든 걸 무시를 선택하고 x64 폴더를 지정하면 된다.

 

그러면 이제 .gitignore 파일이 변경됐다는 것만 보일 것이다. 저렇게 연필 표시가 있는 것은 그 파일이 수정됐다는 의미인데 앞서 파일을 올린 것 처럼 저 수정 내역도 동일하게 커밋하고 푸쉬해주자.

 

다른 사람이 파일을 추가/변경해서 가져오려면?

화면 위쪽에 Pull과 패치가 있다.

 

- 패치(fetch) : 원격 저장소에서 변경점을 확인한다. 다만 변경점이 있는지만 확인할 뿐이고 실제로 로컬에 반영되지는 않는다. 자신의 브랜치가 아니지만 로컬 저장소에 기록할 필요가 있다면 사용하면 된다. 브랜치는 후술한다.

- 풀(pull) : 원격 저장소에서 변경점 확인과 함께 그 내용을 반영한다. 다른 사람의 변경점을 실제 자신의 로컬 저장소에 적용할 때 사용하는 기능이다.

 

나만의 작업 공간 : 브랜치(Branch)

혼자서 관리할 때는 상관없지만 둘 이상의 사람이 동시에 관리하면 문제가 발생할 수 있다. 지금까지 main을 가지고 프로젝트를 다뤘는데 만약 누군가가 main을 수정한 상태에서 다른 사람이 main을 수정한다면 충돌할 수 있다. 하지만 main이 아니라 각자 자신만의 공간을 가진다면 그 문제를 방지할 수 있다.

 

Sourcetree 화면 위에 브랜치를 누르면 새 브랜치를 생성할 수 있다. 원하는 이름으로 새 브랜치를 만들어보자

 

그러면 자동으로 생성된 브랜치에서 작업을 하게 되는데 이러면 main을 건드리지 않고 새로 생성한 브랜치에 수정 내역이 반영된다. 그리고 이 브랜치는 다른 누군가가 직접 끌고 오지 않는 이상 존재를 알 수 없기 때문에 나만의 작업 공간이 될 수 있다.

 

만약 다시 main에서 작업하고 싶다면 main에서 체크아웃을 하면 된다.

 

 

다만 다른 브랜치의 변경점이 main에 반영되지 않았기 때문에 그냥 main으로 체크아웃만 하면 다른 브랜치의 작업 내용이 사라지기 때문에 그 작업을 병합해줘야 한다. 이 병합 과정도 다른 사람과 같이 하면 충돌이 생길 수 있으니 사전에 작업할 파일을 따로 정해주는 것이 좋다.

 

그런데 자신의 브랜치와 main 사이를 계속 왔다갔다 하는 것은 별로 안좋다. main만 따로 관리할 로컬 저장소를 만드는 방법이 있고, 그게 힘들다면 GitHub 저장소 페이지에서 병합을 관리할 수도 있다.