소프트웨어 버전 관리 도구
소프트웨어 버전 관리 도구는 말 그대로 버전을 관리해주는 툴로, 공유 폴더 방식, 클라이언트/서버 방식, 분산 저장소 방식이 있습니다. 이중 Git은 분산 저장소 방식에 속하는데요, Git에 대해 알아보기 전에 나머지 개념도 함께 잡아 보겠습니다.
1. 공유 폴더 방식
버전 관리 자료가 로컬 컴퓨터의 공유 폴더에 저장되어 관리되는 방식으로, 대표적으로 SCSS, RCS, PVCS, QVCS 등이 있으며, 아래의 프로세스로 버전관리를 수행합니다.
- 개발자들은 개발이 완료된 파일을 약속된 공유 폴더에 매일 복사한다.
- 담당자는 공유 폴더의 파일을 자기 PC로 복사한 후 컴파일 하여 이상 유무를 확인한다.
- 이상 유무 확인 과정에서 파일의 오류가 확인되면, 해당 파일을 등록한 개발자에게 수정을 의뢰한다.
- 파일에 이상이 없다면 다음날 각 개발자들이 동작 여부를 다시 확인한다.
- 파일을 잘못 복사하거나 다른 위치로 복사하는 것을 방지하기 위하여 파일의 변경 사항을 데이터베이스에 기록하여 관리한다.
2. 클라이언트/서버방식
버전 관리 자료가 중앙 시스템(서버)에 저장되어 관리되는 방식으로, 대표적으로 CVS, SVN(Seubversion), CVSNT, Clear Case, CMVC, Perforce 등이 있으며, 아래와 같은 특징이 있습니다.
- 서버의 자료를 개발자별로 자신의 PC(클라이언트)로 복사하여 작업한 후 변경된 내용을 서버에 반영한다.
- 모든 버전 관리는 서버에서 수행된다.
- 하나의 파일을 서로 다른 개발자가 작업할 경우 경고 메시지를 출력한다.
- 서버에 문제가 생기면, 서버가 복구되기 전까지 다른 개발자와의 협업 및 버전관리 작업은 중단된다.
3. 분산 저장소 방식
버전 관리 자료가 하나의 원격 저장소와 분산된 개발자 PC의 로컬 저장소에 함께 저장되어 관리되는 방식으로, 대표적으로 Git이 분산 저장소 방식에 속하며, 그 외에도 GNU arch, DCVS, Bazaar, Mercurial, TeamWare, Bitkeeper, Plastic SCM 등이 있으며, 아래와 같은 특징을 가집니다.
- 개발자별로 원격 저장소의 자료를 자신의 로컬 저장소로 복사하여 작업한 후 변경된 내용을 로컬 저장소에서 우선 반영(버전 관리)한 다음 이를 원격 저장소에 반영한다.
- 로컬 저장소에서 버전 관리가 가능하므로 원격 저장소에 문제가 생겨도 로컬 저장소의 자료를 이용하여 작업할 수 있다.
What is Git/Github?
Git은 리누스 토발즈가 2005년 리눅스 커널 개발에 사용할 관리 도구로 개발한 이후 주니오 하마노에 의해 유지보수 되고 있는 소프트웨어 버전 관리 도구입니다.
Git은 분산 버전 관리 시스템으로 2개의 저장소, 즉 지역(로컬) 저장소와 원격 저장소가 존재합니다.
원격 저장소는 주로 웹 서버를 빌려 사용하는데, Git 사용자들이 가장 많이 사용하는 웹 호스팅 서비스는 깃 허브(Github.com)입니다.
지역 저장소는 개발자들이 실제 개발을 진행하는 장소(개발자 PC)로, 버전 관리가 수행되며, 원격 저장소는 여러 사람들이 협업을 위해 버전을 공동 관리하는 곳으로, 자신의 버전 관리 내역을 반영하거나 다른 개발자의 변경 내용을 가져올 때 사용합니다.
버전 관리가 지역 저장소에서 진행되므로 버전 관리가 신속하게 처리되고, 원격 저장소나 네트워크에 문제가 있어도 작업이 가능하다는 장점이 있습니다.
브랜치를 이용하면 기본 버전 관리 틀에 영향을 주지 않으면서 다양한 형태의 기능 테스팅이 가능합니다.
*브랜치(Branch) : Git에서는 저장소가 처음 만들어지면 마스터(Master) 브랜치가 생성되고 이 브랜치에서 기본적인 버전 관리가 진행됩니다. 새로운 기능을 추가하는 작업은 새로운 브랜치를 만들어 작업을 수행하며, 작업이 정상적으로 마루리되면 작업내역을 마스터 브랜치에 병합합니다. 이렇게 마스터 브랜치와 별도로 생성하는 브랜치를 토픽(Topic)브랜치 또는 피처(Feature) 브랜치라고 합니다. 각각의 브랜치는 다른 브랜치에 영향을 주지 않으므로 독립적인 여러 작업을 동시에 진행할 수 있습니다.
파일의 변화를 스냅샷으로 저장하는데, 스냅샷은 이전 스냅샷의 포인터를 가지므로 버전의 흐름을 파악할 수 있습니다.
Git 주요 명령어
명령어 | 의미 |
add | - 작업 내역을 지역 저장소에 저장하기 위해 스테이징 영역(Staging Area)에 추가한다. - '--all'옵션으로 작업 디렉터리의 모든 파일을 스테이징 영역*에 추가할 수 있다. |
commit | - 작업 내역을 지역 저장소에 저장한다. - '-m' 옵션으로 메시지를 부여할 수 있다. |
branch | - 새로운 브랜치를 생성한다. - 최초로 commit을 하면 마스터 브랜치가 생성된다. - commit 할 때마다 해당 브랜치는 가장 최근의 commit한 내용을 가리키게 된다. - '--d' 옵션으로 브랜치를 삭제할 수 있다. |
checkout | - 지정한 브랜치로 이동한다. - 현재 작업 중인 브랜치는 HEAD 포인터가 가리키는데, checkout 명령을 통해 HEAD 포인터를 지정한 브랜치로 이동시킨다. |
merge | - 지정한 브랜치의 변경 내역을 현재 HEAD 포인터가 가리키는 브랜치에 반영함으로써 두 브랜치를 병합한다. |
init | - 지역 저장소를 생성한다. |
remote add | - 원격 저장소에 연결한다. |
push | - 로컬 저장소의 변경 내역을 원격 저장소에 반영한다. |
fetch | - 원격 저장소의 변경 이력만을 지역 저장소로 가져와 반영한다. |
clone | - 원격 저장소의 전체 내용을 지역 저장소로 복제한다. |
fork | - 지정한 원격 저장소의 내용을 자신의 원격 저장소로 복제한다. |
* 스테이징 영역(Staging Area) : 작업 내용을 지역 저장소에 저장하기 전의 '임시저장소'로, 작업 내역을 바로 commit해 지역 저장소에 저장하지 않고 스테이징 영역에 저장했다가 commit을 하는 이유는, 스테이징 영역에서 작업 내용을 한 번 더 확인하여 선별적으로 지역 저장소에 반영하기 위함입니다. 이렇게 하면 스테이징 영역을 사용하지 않을 때보다 시간은 더 소요되지만 좀 더 안정된 버전관리 작업이 가능합니다.
Git을 이용해 버전 관리 작업을 시작할 때는 먼저 'init' 명령으로 지역저장소를 만들고, 'remote add' 명령으로 원격 저장소에 연결한 후 'add -> all -> commit -> push'를 합니다.
이후 버전관리는 'fetch -> 작업 -> add -> commit -> push' 과정으로 진행됩니다. 나머지 명령은 작업 과정이나 자료 송수신 과정에서 필요에 의해 수행합니다.
Git 다운로드 / 계정 설정 및 지역 저장소 만들기
1) 계정 설정하기
먼저 위의 사이트에 접속하여 OS에 맞는 Git을 설치한 후 Git Bash를 실행합니다.
Git을 통해 버전을 관리하기 위해서는 먼저 아래와 같이 사용자 이름과 이메일을 등록해 계정을 설정해야 합니다.
설정하는 이름은 commit을 수행할 때 마다 누가 commit을 했는지 알 수 있도록 기록되는 이름과 이메일입니다. 사용자가 임의로 설정하는 것으로, 원하는 것으로 하면 됩니다.
2) 지역 저장소 만들고, 변경 내역을 지역 저장소에 저장하기
계정을 설정한 후 버전 관리 내역이 저장될 지역 저장소를 만들어야 합니다.
지역 저장소는 실제 개발 작업을 진행하는 폴더에 생성해야 합니다.
cd명령어를 이용해서 이동하시거나, 아니면 작업 폴더로 이동해서 마우스 우측 버튼을 클릭하여 Git Bash Here을 클릭하면, 해당 폴더기준으로 Git Bash가 실행되고, 아래와 같이 init 명령을 실행합니다.
그럼 현재 폴더에 ' .git'이라는 지역 저장소 폴더가 그 안에 버전 관리에 필요한 폴더 및 파일들을 포함한 상태로 생성되며, 이후 버전 관리 내역은 '.git'폴더에 저장됩니다.
변경 작업을 수행하면 변경된 파일들은 '스테이징 영역'을 거쳐 '지역 저장소'에 저장됩니다. 위의 그림(1)에서 add와 commit을 하는 과정입니다.
git bash나 개발툴 터미널에서 $ git add --all 명령어를 입력하면, 파일 중 변경 내용이 있는 파일만 모두 스테이징 영역에 추가되고, 이후 commit 명령어를 이용해서 지역 저장소에 저장합니다.
만약 특정 파일만 add하고 싶다면, --all이 아닌 $ git add test.java와 같이 추가할 파일 이름을 입력 하면 됩니다.
$ git commit -m "first commit" 과 같이 -m 옵션을 주어 커밋 메시지를 부여할 수 있습니다. 메시지는 향후 작업 시 참고 자료가 됩니다.
3) 병합(Merge)기능 사용하기
처음 commit을 하면 마스터(Master) 브랜치가 생성되고, 이 브랜치에서 실질적인 버전 관리가 수행됩니다.
기본적인 작업과 별도로 새로운 기능에 대한 테스트가 필요할 때는 새로운 브랜치를 만들어 테스트를 수행한 후 테스트가 정상적으로 완료되면 새로운 기능에 대한 작업 내역을 마스터 브랜치에 병합하여 저장합니다.
아래와 같이 새로운 브랜치를 생성해 봅니다. 브랜치 이름은 test01입니다.
브랜치는 commit을 가리키는 포인터로, 처음 commit을 수행하면 마스터 브랜치가 생성되고, commit을 수행할 때마다 마스터 브랜치는 가장 최근의 commit을 가리키게 됩니다.
가장 최근의 commit을 가리키는 포인터를 현재 작업중인 마스터 브랜치에서 'test01' 브랜치로 이동합니다.
변경 작업을 완료하고 작업 폴더의 변경 내역을 저장해 봅시다. commit을 가리키는 포인터가 'test01'브랜치로 이동했기 때문에 변경 내역은 'test01'브랜치에 저장됩니다.
test01 브랜치의 커밋 내역을 마스터 브랜치와 병합하기 위해 commit을 가리키는 포인터를 마스터 브랜치로 이동하고, test01 브랜치의 커밋 내역을 마스터 브랜치와 병합(반영)합니다.
4) 지역 저장소의 버전 관리 내역을 원격 저장소에 저장하기
원격 저장소는 여러 사람들이 협업을 위해 공동으로 버전을 관리하는 곳으로, 자신의 버전 관리 내역을 반영하거나 다른 개발자의 변경 내용을 가져올 때 사용합니다.
github에 레파지토리가 생성되어 있다고 가정하고 원격 저장소를 먼저 등록해 보겠습니다.
제 깃허브의 TestRepository를 'testrepo'라는 별명으로 지정했습니다. 이 별명을 활용하여 원격 저장소에 변경 내역을 반영해 보겠습니다.
위의 2),3) 과정을 그림으로 표현해 보면 아래와 같습니다.
Git Hub 레파지토리(원격 저장소)에 가면 아래와 같이 변경된 파일만 second commit메시지가 뜨는, 버전 내역을 확인할 수 있습니다.
댓글