Git에 대해 알아보자 1. Git의 개념과 Git Flow[오지는 컴퓨터 공부-사용자 쌍문동믹서기]
Git
의 정의는 분산 버전 관리 시스템을 뜻한다.
Git
이나 SVN
과 같은 분산 버전 관리 시스템을 사용하는 목적은 아래와 같은 상황 때문이다.
상황 : 팀 프로젝트 수행을 위해
Gil
,Log
,Load
,Bear
4명의 개발자가 모였다.
이 네 명은 원활한 프로젝트를 위해 구현할 기능 개발을 나누었다.
Gil
,Log
가 기능 1을,Load
가 기능 2,Bear
가 기능 3을 개발하기로 정했다.
이 네 명의 개발자가 Git
과 같은 분산 버전 관리 시스템을 사용하지 않을 경우 아래와 같은 문제가 발생할 수 있다.
Gil
은 이미 코드를 다 구현했지만Log
로부터 완성된 코드를 공유받지 못해 다음 단계로 진행할 수가 없다.Log
가 코드를 완성했지만Gil
의 코드와 충돌이 발생했다. 결국 서로의 코드를 이해하기 위해Gil
은Log
의 코드를 읽고,Log
는Gil
의 코드를 읽어야 한다. 이 과정에서 코드를 완성한Load
와Bear
는 추가적인 충돌을 방지하기 위해Gil
,Log
를 기다린다.- 오류를 모두 고치고
Gil
,Log
,Load
,Bear
는 현재까지 코드를 다같이 총 2번 합쳤다. 2번째까지는 아무 문제가 없었다. 그러다 3번 째 코드를 합치는 과정에서 오류가 발생한 경우 문제가 어디서 발생했는지 알아보기 위해 2번째 합친 코드로 돌아가보기로 하는데, 아무도 이전 코드를 가지고 있지 않았다.- 이제 전체 코드를 이해하기 위해 엄청난 시간을 들여서 각자가 짠 전체 코드를 모두가 이해하며 봐야 한다.
Load
는 기능 1을 살펴보다 궁금증이 생겨Gil
에게 질문을 한다. 하지만 해당 파트는Gil
이 짠 게 맞지만,Log
가 코드를 합치는 과정에서 호환성을 위해Gil
의 코드를 일부 수정했다.Log
도 마찬가지로 자기가 짠 코드지만 여러 수정 과정을 거치다 보니 내가 짠 코드가 무엇인지 헷갈리게 된다.
Git에 대해 알아보자 1. Git의 개념과 Git Flow[오지는 컴퓨터 공부-사용자 쌍문동믹서기]
Repository
는 말 그대로 파일 등이 저장되는 저장소로, 즉 프로젝트 폴더를 말한다.
저장소의 종류는 다음과 같다.
Remote Repository (원격 저장소)
: 원격 서버에 저장된 저장소로, 여러 사람이 함께 공유한다.
Local Repository (개인 저장소)
: 우리가 직접 관리하는 저장소로, 내 PC에 저장되어 있다.
Commit
은 프로젝트의 변경 이력을 말한다.
Stage
에 대해 설명하기 전 Index
에 대한 개념을 이해해야 한다.
Index
는 Commit
을 통해 변경사항들이 반영되기 전 해당 변경사항의 이력들이 저장되는 공간이다.
따라서 우리가 특정 파일이나 코드를 변경 시 해당 이력은 Index
에 기록된다.
이때 이 기록되는 행위를 Stage
또는 Staging
이라 한다.
따라서 다음과 같이 5개의 변경사항이 있을 시, 그 중에서 원하는 변경 사항만 stage
하고 원하지 않는 변경 사항은 unstage
한 뒤 commit
을 진행하면 된다.
Branch
는 특정 커밋으로부터 분기되는 포인터를 말하는 것으로, 여러 명이 같은 코드를 공유하며 협업하는 상황에서 각 개발자들이 개발을 진행하고 있는 환경 또는 흐름을 말한다.
각 개발자들은 여러 Commit
을 만들며 프로젝트를 개발하는데, 이때 누가 어떤 Commit
을 추가했는지 구분이 가능해야 한다.
이때 사용되는 것이 바로 Branch
이다.
새로운 Branch
가 생성되더라도 기존의 메인 Branch
는 그대로 남아있다.
위와 같이 한 사용자가 자신의 기능의 세부 Branch
를 또 다시 나눌 수도 있다.
Branch
생성 가능 갯수에는 제한이 없다
Checkout
은 현재 위치한 Commit
에서 다른 Commit
으로 이동하는 것을 말한다.
Checkout
을 통해 현재 Commit
에서 같은 Branch
내 다른 Commit
으로 이동하거나, 다른 Branch
내 Commit
으로 이동할 수 있다.
Checkout
으로 인해 이전 시점의 버전으로 되돌아갈 수도 있고, 다른 사람의 Branch
로 전환해 다른 개발자들의 코드 진행 상황을 확인해 볼 수도 있다.
Merge
는 나뉘어진 Branch
를 다시 하나의 Branch
로 합치는 것을 말한다.
가장 오류가 많이 발생하는 과정이니 주의
Merge
진행 시 현재 Branch
를 Branch
가 합쳐지는 기존 메인 Branch
로 전환한 후 수정된 Branch
를 Merge해야 오류가 발생하지 않는다.
여러 개의 Branch
들을 한꺼번에 Merge할 때도 마찬가지로 차례차례 기존 Branch
상태에서 Merge를 진행한다.
또한 Merge
에는 종류가 2가지가 있다. 하나는 fast-forward
이고, 나머지 하나는 non fast-forward
이다.
fast-forward
는 기본 merge 방식으로, 서로 다른 두 Branch
를 충돌 없이 자동 merge 시키는 병합이다.
하지만 그 과정에서 때때로 일부 문법으로 인해 충돌 (Conflict)이 발생하면 병합에 실패하는 경우가 발생한다.
이때 해당 충돌 기록을 살피며 일일히 해당 코드를 수정한 뒤 Merge
를 이어서 진행하면 성공적으로 Branch
가 병합된다.
이러한 Merge
방식이 non fast-forward
이다.
또한 이 과정에서 코드의 수정이 이루어졌으니 마찬가지로 새로운 Commit
이 생성된다.
Clone
은 원격 저장소로부터 특정 프로젝트를 통째로 내 로컬 저장소에 다운받는 것을 말한다.
Push
는 현재 내 로컬에서 작업한 변경 사항들을 원격 저장소에 반영하는 것을 말한다.
작업이 완료될 때마다 원격 저장소에 Push
해야 다른 사람들이 내 코드를 확인할 수 있다.
Pull
은 원격 저장소에서 변경된 사항들을 내 로컬 저장소에 반영하는 것을 말한다.
Push
와 정반대의 개념으로, 다른 사람이 Push
를 해서 원격 저장소에 코드를 업데이트하면 우리는 해당 코드를 Pull
하여 로컬의 코드를 업데이트한다.
이때 기존의 코드와 내 코드가 다른 경우 Merge
를 진행해 코드를 병합하게 된다.
Clone
과 개념이 헷갈릴 수도 있는데, Clone
은 프로젝트를 처음 불러올 때 프로젝트 전체를 다운받는 것이지만, Pull
은 해당 프로젝트에서 변경된 사항들만 다운받는 것이다.
Git Flow
란 저장소를 보다 고수준으로 관리하기 위한 브랜칭 기법이다.
프로젝트의 규모가 점점 커지면, 많은 인원들이 코드에 동시에 접근하면서 필연적으로 문제가 발생하게 된다.
따라서 현재 내 브랜치가 어떤 문맥에서 생겨나게 됐는지 파악하기 위해 Git Flow
에 대한 이해는 반드시 필요하다.
Git Flow
는 기본적으로 브랜치를 feature
- develop
- release
- hotfix
- master
5단계로 나누어 코드를 관리한다.
Master Branch(메인 배포판)
는 실제로 클라이언트에서 이용하는 최종 형태의 메인 Branch
이다.
Develop Branch(메인 개발)
현재 개발이 진행 중인 메인 Branch
이다.
Master Branch
와 마찬가지로 추가적으로 생성 또는 삭제되지 않는 Branch
이다.
Feature Branch(추가 기능 개발)
새로운 기능을 추가하기 위해 사용되는 Branch
로, 특정 기능의 개발이 필요할 때 Develop Branch
에서 파생되며, 기능 개발이 완료되면 Develop Branch
로 병합된다.
가장 많이 생성되었다 삭제되는 Branch
이다.
Release Branch(배포 준비, 오류 확인)
실제로 프로젝트를 배포하기 위한 브랜치이다.
이 Branch
는 지금까지 개발한 기능들이 있는 Develop Branch
에서 파생되어, 각종 오류 사항이나 문제들을 검토 및 수정하는 일종의 테스트 서버로 볼 수 있다.
수정이 완료되면 Release Branch
는 Develop Branch
와 Master Branch
로 병합된다.
Hotfix Branch(긴급 오류 수정)
Hotfix Branch
는 배포된 Master Branch
에서 예기치 못한 버그가 발생했을 때 급하게 Develop Branch
, Feature Branch
를 거치지 않고 버그를 수정하는 단계이다.
수정이 완료되면 Develop Branch
와 Master Branch
로 병합된다.