버전 관리 시스템과 Git
버전 관리 시스템의 종류로는 로컬 버전 관리 시스템, 중앙집중식 버전 관리 시스템, 분산식 버전 관리 시스템이 있습니다.
-로컬 버전 관리 시스템(Local VCS)
간단한 데이터베이스를 사용해서 파일의 변경 정보를 관리하는 시스템입니다. 아주 간단하지만 실수하기 쉽다는 단점이 있습니다.
-중앙집중식 버전 관리 시스템(Centralized VCS)
여러 사람과 함께 작업해서 생기는 문제를 해결하기 위해서 개발되었습니다. 서버가 별도로 있고 클라이언트가 중앙 서버에서 파일을 받아서 사용하는 방식으로, 로컬 버전 관리 시스템 보다 관리가 쉽다는 장점이 있지만 중앙 서버에 문제가 발생한다면 치명적이라는 단점이 있습니다.
-분산 버전 관리 시스템(Distributed VCS)
각 클라이언트들이 모두 저장소를 전부 복제한 서버의 백업본을 가집니다. 서버에 문제가 생기면 이 복제물로 다시 작업을 시작할 수도 있고 , 많은 수의 원격저장소를 가질 수 있기 때문에 다양한 방법으로 협업할 수 있습니다.
2. Git을 이용한 작업 순서는 어떻게 되나요?
Git을 이용한 작업에는 한번만 하는 명령어 작업이 있고, 반복적으로 하는 명령어 작업이 있습니다.
한번만 하는 명령어
Github 사이트에 프로젝트 저장소를 만듭니다.
Git 사용 선언 또는 원격 저장소에서 init or clone 해옵니다. (git init or git clone)
내 로컬PC와 원격 저장소 간 링크를 연결합니다. (git remote)
반복적으로 하는 명령어
코딩 작업을 합니다.
코딩 작업이 완료되었다면 관리하고 싶은 파일을 선정합니다. 모든 파일을 선정해서 추가할수도 있지만 골라서 선정할 수도 있습니다. 원하는 파일을 선정해서 스테이지 위로 올리는 것을 스테이징이라고 합니다. (git add)
스테이지에 올라온 파일들을 로컬PC의 git history에 등록합니다. 실제로 원격 저장소로 올리는 것은 아니고 로컬PC에만 등록을 시키는 것입니다. (git commit -m)
내 작업물을 github에 올립니다. (git push)
브랜치는 다른 브랜치와 병합(merge 혹은 rebase)함으로써, 작업한 내용을 다시 새로운 하나의 브랜치로 모을 수 있습니다.
4. git merge와 rebase에는 어떤 차이가 있는지 서술해주세요.
프로젝트를 혼자 진행을 하면 명령어 충돌에 대한 걱정이 없지만 두 명 이상의 개발자가 작업을 진행하다보면 충돌을 피하기 어렵습니다.
merge와 rebase는 충돌이 일어나지 않게 도와주는 역할을 합니다. merge는 브랜치를 통합하는 것이고, rebase는 브랜치의 베이스를 옮기는 것입니다.
마스터 브랜치에서 a 브랜치를 merge했을 때
(좌) 마스터 브랜치에서 a 브랜치를 rebase했을 때
(우) a 브랜치에서 마스터 브랜치를 rebase했을 때
git reset 명령어는 특정 커밋으로 되돌아갈 수 있는데, 되돌린 버전 이후의 버전들은 전부 삭제됩니다.
git revert 명령어도 특정 커밋으로 되돌아갈 수 있는데, 되돌린 버전 이후의 버전들의 이력이 남아있습니다.
reset명령어는 그림과 같이 4번째 커밋에서 3번째 커밋으로 돌아갈 경우, 4번째 커밋은 완전히 사라집니다.
revert의 경우 위 그림의 3번째 위치의 커밋에서 2번째 커밋으로 돌아갈 경우 4번째 위치에 2번째 내용의 커밋이 위치하게 됩니다.
reset 명령어는 커밋 히스토리를 깔끔하게 유지할 수 있고, 혼자 작업 시 편하게 되돌아갈 수 있다는 장점이 있지만, 다른 사람과 협업 시 같은 브랜치에서 함께 작업할 때 충돌이 일어날 수 있다는 단점이 있습니다.
revert 명령어는 히스토리에 남게 되어 왜 돌아갔는지 등의 기록을 남길 수 있고, 다른 사람들과 협업 시 충돌을 최소화 할 수 있습니다.
*git rm : 디렉토리와 index에서 파일을 삭제하는 명령어