git tutorial

Posted on

git은 무엇인가요?

https://backlog.com/git-tutorial/kr/intro/intro1_1.html

시작

git 다운로드 사이트

git을 다운로드 받고 모든 정보를 추적하고 싶은 디렉토리로 이동해서 git init을 입력합니다. 그러면 해당 디렉토리의 내용물은 모두 git으로 추적됩니다.

git의 저장 단계

git은 파일의 이력을 여러 단계로 나누어서 관리합니다. 파일에서 우리가 수정한 정보는 아래와 같은 순서로 저장 공간을 옮겨 갑니다.

  1. 작업트리 : git에서는 디렉토리를 작업트리라고 합니다. 우리가 파일을 만들어서 무언가 수정을 하면 자동으로 작업트리에 반영 됩니다.
  2. 인덱스 : 작업트리의 정보를 git add (파일명)명령어를 입력하여 인덱스라는 공간에 올려야 합니다. 인덱스에 없고 작업트리에만 있는 수정사항은 로컬저장소로 commit할 수 없습니다.
  3. 로컬 저장소 : 인덱스에 있는 수정 정보를 git commit -m "(수정사항에 관한 메시지)"명령어로 로컬 저장소에 올립니다. 변경에 관한 짧은 설명은 꼭!! 써주어야 합니다.
  4. 원격 저장소 : 로컬 저장소(내 컴퓨터)에 있는 정보를 원격저장소(github, gitbucket…)등에 올리려면 git push origin (branch명)명령어를 입력합니다. 반대로 원격저장소의 내용을 내 컴퓨터로 가져올려면 git pull명령어를 입력하면 됩니다.

branch, 가지치기

git의 branch 기능은 하나의 프로젝트에 여러 팀이 함께 작업할때 사용하거나 서로 영향을 주는 소스코드를 작성할때 파급효과를 막기위해 사용하는 기능입니다.

예를 들어서 게임을 만드는 프로젝트에 여러 작업이 있겠죠?

  • 캐릭터 디자인
  • 물리엔진
  • UI디자인
  • 실시간 서버 통신 시스템
  • 채팅 시스템
  • 보이스챗

이것보다 더 많을 것입니다. 그러나 이 수많은 팀들이 한꺼번에 하나의 폴더안의 파일들을 수정한다면 분명 이것 저것 꼬일 것입니다.

branch

그떄 위와 같이 작업을 여러 버전으로 나누어서 따로 개발을 한다면 서로 꼬일일은 없을 것입니다. 있다면 branch를 통합할때 정도 잠간 코드를 살펴 보는것 정도가 있겠습니다.

각 branch는 해당 branch에 commit한 정보만을 저장하고 있습니다. 그래서 무언가 작성을 하고 그내용을 브랜치에 저장하려면 commit을 해야합니다.

branch 생성

자신의 로컬 저장소(repository)에서 브랜치는 다음과 같이 생성합니다.

git branch (브랜치명)

mastercontent

이제 브랜치 이동을 해보겠습니다.

branch 이동

git checkout (브랜치명)

브랜치 이동은 위와 같이 합니다. 그럼 seokwon 브랜치의 내용과 master 브랜치의 내용을 달리해서 비교해 보겠습니다.

asdasd.txt

현재 마스터 브랜치에 있는 ‘asdasd.txt’의 내용입니다. 여기에서 방금 만든 ‘seokwon’브랜치로 checkout 해서 내용을 수정해보겠습니다.

seokwonbranch

앞서 설명했듯이 branch에 내용을 저장하려면 commit 명령어까지 수행해야 합니다. 이제 여기서 다시 master 브랜치로 넘어가 보면

짜잔!! seokwon 브랜치로 옮겨서 내용을 추가하기전 데이터가 그대로 남아았습니다. 이렇게 브랜치 별로 따로 작업 할수 있습니다.

branch merge, 병합

따로 작업하던 브랜치를 하나로 합칠때 브랜치를 merge한다고 합니다. A와 B브랜치를 합병한다고 하면 새로운 C브랜치가 생기는 것이 아닙니다. A에서 B를 병합하면 B는 A에 흡수되고 B에서 A를 병합하면 A는 B를 흡수합니다. 그래서 내가 현재 어느 브랜치에 있는가 잘 보고 merge를 해야합니다. 명령어는 다음과 같습니다.

git merge (병합대상 브랜치)

seokwon 브랜치에 내용을 수정해놨고 이제 master 브랜치에 내용을 추가해서 병합을 실행해보도록 하겠습니다.

edit master

병합을 실행하면

conflict

브랜치를 병합하는데 내용이 겹치게 되면 위와같이 충돌이 발생합니다. 충돌이 발생해도 큰 문제가 생긴게 아니라 git이 제공하는 유용한 기능중에 하나일 뿐입니다. master branch와 seokwon branch의 중에 하나를 골라 commit 을 하면 됩니다.

conflict solve

협업

지금까지는 로컬저장소만을 다뤘지만 이제 원격저장소를 이용해서 협업하는 방법을 설명드리겠습니다. 원격저장소도 종류가 많습니다. 저는 github을 사용하고, 대부분 github을 사용합니다.

repositories

github로그인 하고 자기 레포지토리 항목을 볼수 있는데 저기 초록색 버튼을 누르면 원격 저장소가 만들어 집니다. 이렇게 저장소를 만들었는데 아무나 와서 막 수정하면 안돼겠죠? 그래서 원격저장소에는 두가지 접근 권한이 있습니다.

  1. collaborator : 로컬 저장소에서 pull, push 명령을 자유롭게 사용할 수 있으며, 특정 저장소의 collaborator가 되고싶다면 그 저장소 주인이 따로 설정 해줘야 합니다.
  2. contributor : 협력하고 싶은 저장소를 내 저장소로 Fork해야합니다.

contributor로서 프로젝트 참여

beforefork

afterfork

그 후 똑같이 git add, git commit, git push명령어를 차례로 실행 합니다. 그리고 나서 github에 로그인을 하고 참여하려고 하는 프로젝트에 들어가서 pull request탭을 클릭합니다.

pullrequest

pullrequset2

그다음 위 명령어를 입력하면 원격저장소에 바로 반영되는 것이아니라 collaborator의 허락을 받아야 합니다.

마치며

git의 중요한 기능은 이력 관리와 협업만 있는 것이 아닙니다. 프로그램이 어디서부터 어떻게 잘못된 것인지 모를때 과거 이력으로 돌아가는 되돌리기 기능 또한 아주 중요합니다. 하지만 여기 까지 잘 따라오신 분들은 되돌리기 기능 부터는 스스로 할수 있을 것같습니다. 앞으로의 여정은 여러분이 몫입니다.

작성자

  • 이석원

참여자

  • 띵지Ll