정환타 개발노트

Git - 형상 관리 시스템(+ 사용방법) 본문

DevOps

Git - 형상 관리 시스템(+ 사용방법)

JungHwanTa 2020. 1. 31. 17:43

Git

Git은 분산 형상 관리 시스템으로 협업시에 주로 사용되는 버전 관리 시스템인 VCS 중 하나이다. 

Git은 기존의 VCS에 비해 설치가 간단하고 빠른 속도를 자랑한다. 또한 브랜치 병합이 '매우' 빠르며 사용법도 상당히 간단하다.

 

특히 병합과정에서 에서는 추적의 기능도 제공하기에 누가, 언제, 무엇을 어떤 부분을 병합했는지 쉽게 확인할 수 있다.

따라서 오픈소스와 같은 대규모 개발 진행환경에서 매우 유용하다고 한다.

 

Git의 기본 사용법은 다음과 같다.

 

저장소 생성(init & clone)

init는 새롭게 저장소를 만드는 명령어다. init을 활용하여 새로운 Git 저장소를 생성할 수 있다.

 

원격에 있는 서버의 저장소를 복제해서 로컬에 가져오려면 다음과 같은 명령어를 사용한다.

git clone 사용자명@서버 주소:"저장소 경로"

 

파일 추가(add)

깃(git)에서는 소스코드를 저장소에 최종 반영하기까지 두 단계를 거치는 two-phase 커밋을 사용한다.

 

따라서 로컬에서 작업한 코드를 저장소에 반영하기 전에는 중간단계인  'staging'이라는 과정을 거처야한다. staging은 작업한 내용을 반영하기 전에 최종으로 확인하는 중간단계 정도의 개념이며 'add'라는 명령어를 통해 중간 단계인 stage로 커밋을 할 수 있다.

 

작업 디렉토리와 stage간의 비교는 'git diff'를 통해서 가능하다. 또한 stage와 master 버전의 비교는 'git diff --cached'를 통해 가능하다.

 

저장소 반영(commit)

add를 통해서 반영할 파일을 추가하고 diff를 통해 확인을 한 후에 이를 저장소에 반영하기 위해서는 'commit'명령어를 사용한다.

commit의 중요한 포인트는 '커밋 메세지'이다. 커밋 메세를 통해 코드에 대한 설명을 같이 추가하여 저장소에 반영한다.

git commit -m "변경 내용 설명"

 

원격 저장소에 반영(push)

위의 과정까지 나의 로컬의 git local 저장소에 반영을 하였다. 깃은 분산 저장소이기 때문에 커밋 과정만으로는 서버에 코드가 저장되지 않는다. 따라서 원격 저장소(서버)에  코드를 반영하려면 별도의 반영 작업이 필요하다.

즉, 최종적으로는 작업 디렉토리 -> stage -> local 저장소 -> 원격 저장소 의 과정을 거친다.

git push origin "브렌치명"

 

만일 원격저장소를 clone하여 만든 경우가 아닐경우 push 이전에 원격 저장소를 정의해야 한다.

git remode add "원격저장소명" "원격저장소 주소"
git push "원격저장소명" "브랜치명"

 

 

브랜치 관리

1. 브랜치 생성

git branch "브랜치 이름"

2. 작업 브랜치 이동

git checkout "브랜치 이름"

 

병합(merge)

병합은 다른 브랜치의 내용을 현재 작업중인 브랜치로 합쳐오는 작업이다. 

예를 들어 현재 master 브랜치에서 작업중에 bugFix라는 브랜치의 내용을 반영하고 싶을 경우 master 브랜치에서 'git merge bugFix'명령어를 실행하여 bugFix브랜치의 내용을 반영한다.

 

이때 이전에 설명한 충돌이 발생할 수 있는데, 충돌이 발생할 경우 직접 충돌 부분을 수정한 후 git add 와 git commit 과정을 거친 후에 최종 반영한다.

 

변경내용 읽어오기(pull & fetch)

원격 저장소에서 다른 사람이 수정한 내용을 내 로컬 저장소로 가져오기 위해서는 pull과 fetch 두가지의 방법을 사용한다.

 

1. fetch 

fetch는 원격 저장소의 내용을 별도의 브랜치로 읽어온다. 실제로는 나의 로컬 저장소에 반영이 되지 않는다.

 

2. pull

pull은 fetch + merge라고 생각하면 되는데 원격 저장소의 내용을 가져와 나의 로컬 저장소까지 반영하는 작업을 한꺼번에 해주는 명령어이다. 이때에도 충돌이 발생한다면 충돌 부분을 수정해야 한다.

 

태깅

태깅은 아래와 같은 명령어를 사용한다.

git tag -a "태그명" -m "태그 설명"

이전에 설명했듯이 보통 태그명과 설명에는 날짜 혹은 빌드 버전을 명시한다.

 

태깅한 버전으로 'checkout'을 통해 브랜치 이동이 가능하며 태그 공유를 위해서는 태그를 서버로 push 해야 한다.

git push origin "태그명"

 

리베이스(rebase)

리베이스는 git에서만 존재하는 고유 기능이며, merge와 유사한 기능을 하지만 merge에 비해 코드 변경 히스토리를 깔끔하게 만들어주는 명령어 이다.

 

일반적으로 V1에서 V2의 브랜치를 생성하고 master 에서는 commit을 진행하여 V3로 진행되는 과정에서 V2의 내용을 V3로 합치기 위해서는 merge를 사용하게 되는데 이때, merge가 반영되면 V4가 새롭게 생성되며 V2에 대한 브랜치 내용과 히스토리는 모두 유지된다.

 

리베이스를 사용하여 방금과 같은 상황에서 V2와 V3를 합칠 수 있는데, 리베이스가 반영되면 V4가 생기고 V2의 브랜치와 히스토리는 삭제된다.

Comments