2020. 5. 5. 14:33 ㆍ개발 이야기/오픈소스
안녕하세요. 오랜만에 글을 적는 해커의 개발일기 입니다.
오늘은 개발자들의 기초 중에 기초인 Git에 대해 알아보도록 하겠습니다.
그동안 Git에 대해 블로그를 적을 생각을 해본 적이 없었는데요.
어떻게 보면 코딩만큼이나 중요한 것이 개발 환경에 익숙해지는 것이라고 생각이 들기도 합니다.
그럼 Git에 대해 알아보겠습니다.
Git은 거의 모든 개발자들이 사용하는 버전 관리 시스템입니다. 버전 관리란 무엇을 얘기할까요? 코딩만 공부한 컴퓨터 학도가 회사에 가면 처음에 Git에 대해 배우게 될 텐데요. 자기가 열심히 작성한 소스코드와 다른 개발자들이 열심히 작성한 소스코드를 한 곳에 모으거나, 에러가 발생했을 경우 이전에 상태도 되돌릴 수도 있도록 해 주고 소스코드의 변경된 이력을 쉽게 확인할 수 있도록 해주는 것이 버전 관리라고 할 수 있습니다. 이 Git은 제가 좋아하는 리누스 토발즈에 의해 개발되었는데요. 정말 심플한 로직으로 구현되었지만 빠르고 강력한 버전관리 시스템입니다.
무엇이든 잘 사용한다면 훌륭한 툴이 되지만, 잘 사용하지 못한다면 스트레스의 근원이 되기 마련인데요.
Git을 사용하면서 가장 빡치는 순간은.. 바로 내가 개발한 코드와 다른 개발자가 개발한 코드가 겹치는 경우.. 바로 conflict 나는 경우입니다. 잘 알아야 이런 경우를 잘 피해 가고 또, conflict 나더라도 잘 해결할 수 있겠죠?
1. Git 설치 - https://git-scm.com/downloads
설치는 해당 페이지에서 다운로드하셔서 설치하시면 됩니다. 리눅스의 경우에는 아래와 같은 명령어로 손쉽고 빠르게 설치할 수 있습니다.
apt-get install git
yum install git
2. 기초 셋팅 및 간단 사용법
프로젝트용 디렉터리를 만든 후 소스 관리를 하려면 아래와 같은 명령어를 입력해줍니다.
2-1) 깃 초기화
git init
2-2) 소스코드 관리할 소스코드 파일 추가
# 기존 소스코드가 있는 경우
git add sourceCode.py
# 소스코드 전부를 add하고 싶은 경우
git add .
# REAME.md를 만들어 add하는 경우
echo "# test" >> README.md
git add README.md
2-3) 소스코드 commit - 커밋을 하면 로컬에서 변경 이력이 기록되게 됩니다(레파지토리에 기록되지 않은 상태)
# -m은 메시지의 약자로 commit할 때 어떤 메시지를 남길지 정할 수 있음.
# 통상 이슈번호 + 이슈 설명으로 기록됨
# [#1(이슈번호)] - 첫번째 커밋
git commit -m "[#1] - 첫번째 커밋"
2-4) 원격지 설정(소스코드를 업로드할 레파지토리 설정)
# 테스트용 레파지토리에 원격지 설정
git remote add origin https://github.com/bourbonkk/test.git
2-5) push - 원격지에 소스코드 업로드
# master branch에 푸시하기
git push -u origin master
2-6) clone - 원격지 or 레파지토리에서 소스코드 복제하기
git clone https://github.com/bourbonkk/test.git
# 예시
git clone https://github.com/bourbonkk/android-ffmpeg64bit-example.git
2-7) pull - 원격지에 소스코드가 업데이트된 경우에 업데이트 내용을 내 로컬 소스코드에 적용하기
# 당연히 remote 설정이 되어있어야함(기본적인 것을 많이 놓침)
git pull
여기까지 하면 소스코드 관리의 첫걸음을 시작하게 됩니다. 혼자 개발을 하는 경우에는 여기까지만 알아도 아무런 문제가 되지 않습니다. 하지만 git을 사용하는 가장 큰 이유는 소스코드 관리와 여러 개발자 간의 협업을 위함인데요. 이런 이유 때문에 꼭 알아야 하는 개념이 있습니다. merge와 branch인데요. 자신이 clone해온 시점 소스코드가 현재 소스코드보다 예전 버전의 소스코드인 경우 다시 pull을 받아 push를 하면 자동으로 merge가 되게 됩니다. 물론! 업데이트로 수정된 부분과 내가 수정한 부분이 중복되지 않는다면입니다.
하지만 다른 개발자와 내가 수정한 소스코드가 동일하다면 conflict가 발생해 해당 부분을 잘 변경해 주어야 하는데요. 아래 이미지와 같은 현상이 발생됩니다.
그러면 맞는 부분을 두고 나머지는 삭제 후 push를 해주면 merge가 되게 됩니다. 이 부분은 직접 해보시면 바로 이해할 수 있는 부분입니다.
많은 개발자가 함께 개발을 하게 된다면 branch를 백번 활용해야 하는데요. branch는 한국말로 분기를 나타내며 브랜치를 만든 시점에서 별도의 소스코드 관리를 하게 됩니다. 보통 현업에서는 이슈에 따른 branch를 만들어 해당 부분에서 소스코드를 관리하고 문제가 없으면 master 브랜치에 병합되도록 작업을 진행하게 됩니다.
3. 브랜치 사용하기
3-1) 브랜치 만들기 - 브랜치를 만들고 git branch로 어떤 브랜치가 있는지 확인합니다.
git branch <branch name>
# 예시
git branch issue1
$ git branch
issue1
*master
3-2) 브랜치 전환하기 - 만든 브랜치로 이동해 해당 브랜치에서의 소스코드 관리를 시작합니다
git checkout <branch>
#예시
$ git checkout issue1
Switche to branch 'issue1'
이렇게 되면 commit 하고 push 할 때마다 issue1 브랜치고 push하게 됩니다. 아래 Develop 브랜치처런 따로 분기가 뻗어가게 됩니다.
3-3) 브랜치 병합하기 - master 브랜치와 병합하게 됩니다.
$ git checkout master
Switched to branch 'master'
# git merge issue1
Updating 1257027..b2b23c4
Fast-forward
myfile.txt | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
3-4) 브랜치 삭제하기 - 소스코드를 master와 merge를 완성할 경우 issue1 이슈의 브랜치는 더 이상 필요하지 않기 때문에 브랜치를 삭제해줍니다.
$ git branch -d <branchname>
# 예시
$ git branch -d issue1
Deleted branch issue1 (was b2b23c4).
$ git branch
* master
여기까지 Git에 대한 셋팅, 기초 사용법 그리고 브랜치를 이용한 작업 방법까지 알아보았습니다. 이 정도만 알아도 현업에서 Git을 이용한 소스코드 관리에는 크게 무리가 없을 것으로 생각이 듭니다. 하지만 소스코드를 push 했고, merge되었는데 심각한 버그가 발생해 이를 잡지 못했을 경우에는 어떻게 할까요? 우리는 Rollback을 생각하게 됩니다. Git에도 이 Rollback 기능이 존재하기 때문에 해당 가능을 알아보도록 하겠습니다.
4. 소스코드 Rollback 하기
4-1) revert로 최신 commit 취소
$ git revert HEAD
[master d47bb1d] Revert "가장 최신의 commit 취소"
1 files changed, 1 insertions(+), 2 deletions(-)
4-2) reset으로 커밋 삭제하기
# reset을 이용해 master 브랜치의 앞 두개의 커밋 삭제
$ git reset --hard HEAD~~
4-3) rebase -i 로 커밋 통합 및 수정 마지막 rebase --continue 까지 해줘야 정상적으로 수정이 완료 됩니다.
$ git rebase -i HEAD~~
# 다시 add 와 커밋 실행 후 continue 해줌
$ git add sample.txt
$ git commit --amend
$ git rebase --continue
4-4) 이제 다시 master 브랜치에 merge합니다
$ git checkout master
Switched to branch 'master'
$ git merge --squash issue1
Git의 대부분의 기능을 알아볼 수 있는 시간이었습니다. 사실 Rollback의 경우는 저는 잘 사용할 일이 없어서 익숙하지 않은 부분입니다. 기초적인 부분과 브랜치를 사용하는 부분만 잘 익힌다면 현업에서 문제가 될 일은 잘 없을 것으로 생각됩니다. 꼭 Git을 잘 숙지해서 스트레스를 줄이길 바라겠습니다.
'개발 이야기 > 오픈소스' 카테고리의 다른 글
# Docker를 이용해 DB 셋팅하기 - postgresql (2) | 2020.08.13 |
---|---|
# Dockerfile로 임시 빌드 환경 구성하기(Dockerfile 응용하기) (0) | 2020.08.13 |
# 오픈소스 OpenTracing - Jaeger (0) | 2020.03.25 |
# 오픈소스 분산형 NoSQL DBMS Cassandra(카산드라) (0) | 2020.03.17 |
# Container Orchestration - 쿠버네티스(kubernetes - K8s) (0) | 2020.03.14 |