728x90
반응형

Git

 

Git의 정의는 분산 버전 관리 시스템을 뜻한다.

 

Git 사용 목적 

 

Git이나 SVN과 같은 분산 버전 관리 시스템을 사용하는 목적은 아래와 같은 상황 때문이다.

 

Git 개념 

 

Repository 

 

Repository는 말 그대로 파일 등이 저장되는 저장소로 즉 프로젝트 폴더를 말한다.

저장소의 종류는 다음과 같다.

Remote Repository (원격 저장소) : 원격 서버에 저장된 저장소로 여러 사람이 함께 공유한다.

Local Repository (개인 저장소) : 우리가 직접 관리하는 저장소로 내 PC에 저장되어 있다.

 

Commit 

 

Commit은 프로젝트의 변경 이력을 말한다.

 

Stage 

 

Stage에 대해 설명하기 전 Index에 대한 개념을 이해해야 한다.

Index는 Commit을 통해 변경사항들이 반영되기 전 해당 변경사항의 이력들이 저장되는 공간이다.

 

따라서 우리가 특정 파일이나 코드를 변경 시 해당 이력은 Index에 기록된다.

 

이때 이 기록되는 행위를 Stage 또는 Staging이라 한다.

 

따라서 다음과 같이 5개의 변경사항이 있을 시, 그 중에서 원하는 변경 사항만 stage하고 원하지 않는 변경 사항은 unstage 한 뒤 commit을 진행하면 된다.

 

Branch 

 

Branch는 특정 커밋으로부터 분기되는 포인터를 말하는 것으로, 여러 명이 같은 코드를 공유하며 협업하는 상황에서 각 개발자들이 개발을 진행하고 있는 환경 또는 흐름을 말한다.

 

각 개발자들은 여러 Commit을 만들며 프로젝트를 개발하는데, 이때 누가 어떤 Commit을 추가했는지 구분이 가능해야 한다.

 

이때 사용되는 것이 바로 Branch이다.

 

 

새로운 Branch가 생성되더라도 기존의 메인 Branch는 그대로 남아있다.

 

위와 같이 한 사용자가 자신의 기능의 세부 Branch를 또 다시 나눌 수도 있다.

Branch 생성 가능 갯수에는 제한이 없다.

 

Checkout 

 

Checkout은 현재 위치한 Commit에서 다른 Commit으로 이동하는 것을 말한다.

Checkout을 통해 현재 Commit에서 같은 Branch내 다른 Commit으로 이동하거나 다른 Branch 내 Commit으로 이동할 수 있다.

 

Checkout으로 인해 이전 시점의 버전으로 되돌아갈 수도 있고, 다른 사람의 Branch로 전환해 다른 개발자들의 코드 진행 상황을 확인해 볼 수도 있다.

 

Merge 

 

Merge는 나뉘어진 Branch를 다시 하나의 Branch로 합치는 것을 말한다.

가장 오류가 많이 발생하는 과정이니 주의 

 

Merge 진행 시 현재 Branch를 Brancg가 합쳐지는 기존 메일 Branch로 전환한 후 수정된 Branch를 Mrege해야 오류가 발생하지 않는다.

 

여러 개의 Branch들을 한꺼번에 Merge할 때도 마찬가지로 차례차례 기존 Branch상태에서 Merge를 진행한다.

 

또한 Merge에는 종류가 2가지가 있다. 하나는 fast-dforwad이고, 나머지 하나는 non fasf-forward이다.

 

fast-forward는 기본 merge 방식으로, 서로 다른 두 Branch를 충돌 없이 자동 merge시키는 병합니다.

 

하지만 그 과정에서 때때로 일부 문법으로 인해 충돌이 발생하면 병합에 실패하는 경우가 발생한다.

 

이때 해당 충돌 기록을 살피며 일일히 해당 코드를 수정한 뒤 Merge를 이어서 진행하면 성공적으로 Branch가 병합된다.

 

이러한 Merge 방식이 non fast-forward이다.

 

또한 이 과정에서 코드의 수정이 이루어졌으니 마찬가지로 새로운 commit이 생성된다.

 

Clone 

 

Clone은 원격 저장소로부터 특정 프로젝트를 통째로 내 로컬 저장소에 다운받는 것을 말한다.

 

Push

 

Push는 현재 내 로컬에서 작업한 변경 사항들을 원격 저장소에 반영하는 것을 말한다.

작업이 완료될 때마다 원격 저장소에 Push해야 다른 사람들이 내 코드를 확인할 수 있다.

 

Pull 

 

Pull을 원격 저장소에서 변경된 사항들을 내 로컬 저장소에 반영하는 것을 말한다.

Push와 정반대의 개념으로 다른 사람이 Push를 해서 원격 저장소에 코드를 업데이트하면 

우리는 해당 코드를 pull하여 로컬의 코드를 업데이트한다.

 

이때 기존의 코드와 내 코드가 다른 경우 Merge를 진행해 코드를 병합하게 된다.

 

clone과 개념이 헷갈릴 수도 있는데, Clone은 프로젝트를 처음 불러올 때 프로젝트 전체를 다운받는 것이지만,

Pull은 해당 프로젝트에서 변경된 사항들만 다운받는 것이다.

 

Git Flow

 

git flow란 저장소를 보다 고수준으로 관리하기 위한 브랜칭 기법이다.

프로젝트의 규모가 점점 커지면, 많은 인원들이 코드에 동시에 접근하면서 필연적으로 문제가 발생하게 된다.

따라서 현재 내 브랜치가 어떤 문맥에서 생겨나게 됐는지 파악하기 위해 Git Flow에 대한 이해는 반드시 필요하다.

 

Git Flow는 기본적으로 브랜치를 feature - develop - release - hotfix - master 

5단계로 나누어 코드를 관리한다.

 

Master Branch

 

Master Branch는 실제로 클라이언트에서 이용하는 최종 형태의 메인 Branch이다.

 

Develup Branch

 

Develop Branch 현재 개발이 진행 중인 메인 Branch이다.

Master Branch와 마찬가지로 추가적으로 생성 또는 삭제되지 않는 Branch이다.

 

Feature Branch

 

Feature Branch 새로운 기능을 추가하기 위해 사용되는 Branch로 특정 기능이 개발이 필요할 때 Develop Branch에서 파생되며, 기능 개발이 완료되면 Develop Branch로 병합된다.

가장많이 생성되었다 삭제되는 Branch이다.

 

Release Branch 

 

Release Branch 실제로 프로젝트를 배포하기 위한 프랜치이다.

 

이 Branch는 기즘까지 개발한 기능들이 있는 Develup Branch에서 파생되어, 각종 오류사항이나 문제들을 검토 및 수정하는 일종의 테스트 서버로 볼 수 있다.

 

수정이 완료되면 Release Branch는 Develup Branch와 Master Branch로 병합된다.

 

Hotfix Branch 

 

Hotfix Branch Hotfix Branch는 배포된 Master Branch에서 예기치 못한 버그가 발생했을때 급하게 Develop Branch,Feature Branch를 거치지 않고 버그를 구정하는 단계이다.

 

 

 

 

 

 

 

 

반응형

'IT > GitHub' 카테고리의 다른 글

[실무] 깃허브 remote error GH006 에러  (0) 2022.06.15
SVN의 개념 및 GIT과의 차이점  (0) 2022.06.15
728x90
반응형

SVN(Subversion)

 

SVN은 여러명이서 작업하는 프로젝트의 버전관리나 각자 만든 소스의 통합과 같은 문제를 해결하기 위해 저장소를 만들어 그곳에 소스를 저장해 소스 중복이나 여러 문제를 해결하기 위한 형상관리/소스 관리 툴이다.

형상관리 : 소스의 변화를 끈임없이 관리하는 것 

 

프로젝트 소스는 SVN 서버의 Trunk라는 곳에 위치하는데, 자신의 Local 저장소에 Trunk의 소스를 다운 받아 수정 및 

추가 후 다시 업로드 하는 방식.

 

자신만의 소스를 다른 개발자들과 떨어져서 작업하려면 Branch를 만들어 작업 후 자기자신만 접근, 개발하여 

완성되면 Merge 기능을 사용하여 Trunk와 소스를 합치면 된다.

 

A가 자신이 수정한 소스나 폴더를 Commit하면 B는 해당 소스를 Update하면 최신 소스를 받아올 수 있다. 

 

SVN 사용 목적

 

형상관리 툴을 사용하게 되면 소스를 버전 별로 관리할 수 있어서 개발할 때 실수로 소스를 삭제하거나 수정하기 이전으로 돌아가야되는 경우에 유용하게 사용할 수 있다.

 

팀 프로젝트에서도 누가,무엇을.어떻게 수정했는지도 알 수 있기 때문에 코드를 병합하거나 수정된 소스를 추적하는 데에도 사용 된다.

 

단순히 사용 목적을 나열하자면 아래와 같다. 

 

- Revision 별로 파일 백업이 가능하다.

  파일 복원이 가능해지고, 실수가 발생해도 수정이 빨리 이루어 질 수 있다.

 

- 개발 버전과 배포 버전을 섞이지 않고 쉽게 관리 가능

   소스코드 버전관리

 

- 파일 이름 변경,이동,디렉토리 버전 관리도 지원이 가능하다.

- 여러 사용자가 동시에 커밋을 하더라도 충돌이 발생하지 않는다.

   프로젝트 협업 지원

 

 - 한번 커밋이 발생 할때 마다 revision이 올라간다.

   어느 revision이 어떤 파일을 commit했는지 확인 용이

 

- commit시에 자동 로그 기능이 있다.

  작업 이력 관리

 

- 서버와 클라이언트 양방향 데이터 전송으로 네트워크 소통량이 최소화된다.

- 접근이 가능한 개발자는 누구든 쉽게 수정이 가능하다.

 

SVN 용어 & 명령어 

 

용어 

 

Repository 

 

프로젝트 파일 및 변경 정보가 저장되는 장소로 모든 프로젝트의 프로그램 소스들은 이 저장소안에 저장 된다.

한 프로젝트 마다 하나의 저장소가 필요하며, 네트워크를 통해서 여러 사람이 접근 할 수 있고 

소스뿐만이 아니라 소스의 변경 사항도 모두 저장된다.

 

Trunk 

 

프로젝트에서 가장 중심이 되는 디렉토리로 개발 소스를 Commit했을 때 개발 소스가 모이는 장소이다.

소스와 파일 포함 

 

모든 개발 작업은 trunk 디렉토리에서 이루어지며 trunk 디렉토리 아래에는 바로 소스들의 파일과 디렉토리가 들어가게 된다.

 

Branch

 

trunk에서 뻗어져 나온 나뭇가지를 뜻하며, 프로젝트 내의 작은 프로젝트의 개념이다.

 

trunk 디렉토리에서 개발하다 보면 큰 프로젝트에서 또 다른 작은 분류로 빼서 따로 개발해야할 경우가 생기는데, 

이때 프로젝트안의 작은 프로젝트를 생성하는 개념으로,  branches 디렉토리 안에 또 다른 디렉토리를 두어

그 안에서 개발하게 된다.

 

trunk에서 분리/복사한 소스로 버전별 배포판을 생성하거나 trunk와 별도로 운영환경을 위한 안정화된 소스 관리 목적으로 사용된다. 

 

Tag 

 

tag는 꼬리표라는 뜻으로 버전 별로 소스코드를 따로 관리하는 공간이다.

버전 별로 태그를 붙여 tag 디렉토리 안에 보관하는 개념 

 

특정 시점의 상태 보존 목적으로 사용 장기적으로 버전 별로(1.0, 1.1 등) 소스 코드를 따로 저장하는 공간이다.

특정 시점에서 프로젝트의 스냅샷을 찍어두는 것

 

Revision

 

수정된 버전이라는 의미로, 클라이언트가 Repository에 새로운 파일,수정 등을 commit할때 마다 번호가 하나씩 증가한다.

 

Head 

 

Repository에 저장된 최신 revision을 의미한다.

누군가에 의한 가장 최근에 commit된 revision이다.

 

Base 

 

클라이언트가 checkout,update 등의 명령을 통해 Repository로 부터 내려받은 revision을 의미한다.

 

이 revision을 가지고 클라이언트는 수정 및 commit을 하게 된다.

 

만약 Head와 Base가 다르다면 commit이 거부되고 update를 먼저 수행해야 commit이 가능해진다.

 

내가 update한 후 소스 코드를 수정하고 있는 상황에서 다른 사람이 commit하여 revision이 증가한 경우 

Head는 다른 사람이 commit한 revision이 되어 내 소스코드가 이전 revison이 된 경우이다.

 

lmport 

 

맨 처음 프로젝트 시작할때 빈 Repository에 맨 처음 파일들을 저장소에 등록하는 명령어이다.

 

Checkout 

 

저장소에서 소스를 받아 오는 명령어로, 받아온 소스에는 소스 뿐만이 아니라 버전관리를 위한 파일도 같이 받아 온다.

지우거나 변경시 저장소와 연결 불가능 

 

Export 

 

Checkout과 달리 버전관리 파일을 뺀 순수한 소스만 가져오는 명령어로 마지막에 사용한다.

 

Commit 

 

로컬 저장소의 체크아웃 한 소스의 변경된 내용(수정,파일 추가,삭제 등)을 저장소에 저장하여 갱신 하는 명령어이다.

 

Update 

 

체크아웃 해서 받은 소스를 서버 저장소의 최신 소스 버전으로 업데이트 하는 명령어이다. 

소스 수정이나 Commit하기전에 한 번씩 해주는게 좋다.

 

Revert 

 

로컬 저장소의 소스 코드 내용을 이전 상태로 돌리는 명령어이다.

 

Log 

 

저장소에 어떠한 것들이 변경 되었는지 revison을 통해 확인 할 수 있는 명령어이다.

 

Diff 

 

예전 소스 파일과 지금의 소스 파일의 차이점을 비교해 보는 명령어이다.

 

Blame 

 

한 소스 파일을 대상으로 각 리비전에 대해서 어떤 행을 누가 수정했는지 작업한 내용을 확인하는 명령어이다.

출력 순서는 리비전,커밋한 사용자의 ID,소스 순이다.

 

lock 

 

파일에 락을 걸어 락을 건 사용자만이 수정할 수 있게 해주는 명령어이다.

해제는 svn unlock을 통해 할 수 있으며, 왜 파일에 락을 걸었는지도 로그를 기록 할 수 있다.

 

Add

 

새 파일을 만들었을 경우에 파일을 추가 해주는 명령어이다.

저장소에 저장은 되지 않아 add 뒤엔 꼭 svn commit을 꼭 해줘야 한다.

 

Status 

 

자신이 수정하고 있는 파일의 상태를 알려주는 명령어이다.

 

Mkdir 

 

새로운 디렉토리를 만드는 명령어로 실제 변경사항은 commit시에 적용된다.

 

Delete 

 

파일/디렉토리를 삭제하는 명령어이다.

 

Move 

 

파일을 이동하는 명령어로 실제 변경사항은 commit시에 적용된다.

 

rename 

 

파일 이름을 변경하는 명령어로 실제 변경사항은 commit시에 적용된다.

 

List 

 

파일 리스트를 확인하는 명령어이다.

 

Switch

 

소스 서버를 변경하는 명령어이다.

 

lnfo

 

로컬 저장소 또는 원격 저장소의 파일, 폴더 정보를 확인하는 명령어이다.

 

SVN vs GIT

 

SVN 

 

- svn은 대부분의 기능을 완성해놓고 소스를 중앙 저장소에 commit한다.

  SVN에서 commit은 중앙 저장소에 해당 기능을 공개한다는 의미.

 

- GIT과 가장 큰 차이점은 개발자가 자신만의 Version History를 가질 수 없다.

  local History를 이용하긴 하지만 일시적이고 자신이 몇일전까지에 한해 작업한 내역을 

 확인 가능하지만 버전 관리가 되지는 않는다.

 

- Commit한 내용에 실수가 있을 시에 다른 개발자에게 바로 영향을 미치게 된다.

 

GIT 

 

- GIT은 개발자가 자신만의 Commit History를 가질 수 있고, 개발자 저장소와 서버 저장소를

독립적으로 관리가 가능하다.

 매우 유연한 방식으로 소스를 운영할 수 있으며, 이러한 유연성이 git의 가장 큰 장점

 

- Commit한 내용에 실수가 있더라도 바로 서버에 영향으 미치지 않는다.

- 마음대로 Commit(Push)하다가 자신이 원하는 순간에 서버에 변경 내역을 보낼 수 있으며,

서버의 통합 관리자는 관리자가 원하는 순간에 각 개발자의 Commit History를 가져올 수 있다.

 

참고 사이트 

 

https://velog.io/@gillog/SVNSubversion-%EA%B8%B0%EB%B3%B8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

'IT > GitHub' 카테고리의 다른 글

[Git] Git 개념 정리  (0) 2022.06.17
[실무] 깃허브 remote error GH006 에러  (0) 2022.06.15

+ Recent posts