Monthly Seminar

git 을 간단하게 알아보자!

KAU 2020. 9. 5. 00:58

작성자:김정민

Git이란 무엇인가?

 

기존의 관리 방식

CVS,Subversion,Perforce,Bazaar등의 시스템은 각 파일의 변화를 시간순으로 관리하면서 파일들의 집합을 관리합니다.

Git의 관리 방식을 알아보자

파일이 달라지지 않았으면 Git 성능을 위해서 

파일을 새로 저장하지 않는다

단지 이전 상태의 파일에 대한 링크만 저장한다.

Git 데이터를 스냅샷의 스트림처럼 취급한다.

 

Rerepository? ==> 저장소는 어떤 공간인가?

https://gitlab.com/g0bqwch

 

리모트 저장소는 인터넷이나 네트워크 

어딘가에 있는 저장소를 말한다

 

다른 사람들과 함께 일하는 것은 

리모트 저장소를 관리하면서 

협업의 장소라고 할 수 있다.

 

Git 저장소 만들기

Git 저장소를 만드는 방법은 두 가지다.

기존 프로젝트나 디렉토리를 Git 저장소로 만드는 방법과

다른 서버에 있는 저장소를 Clone 하는 방법

더보기

기존 디렉토리를 Git 저장소로 만들기

기존 프로젝트를 Git으로 관리하고 싶을 때, 프로젝트의 디렉토리로 이동한다.

운영체제에 따라서 명령코드가 다르다.

Linux: $ cd /home/user/your_repository
Mac: $ cd /Users/user/your_repository
Windows: $ cd /c/user/your_repository

그리고 아래와 같은 명령을 실행한다:

$ git init

이 명령은 .git 이라는 하위 디텍토리를 만든다.

.git 디렉토리에는 저장소에 필요한 뼈대 파일(Skeleton)이 들어있다.

이 명령만으로는 아직 프로젝트의 어떤 파일도 관리하지 않는다.

 

Git이 파일을 관리하게 하려면 저장소에 파일을 추가하고 커밋해야 한다.

git add 명령으로 파일을 추가하고 git commit 명령으로 커밋한다.

 

$ git add *.c
$ git add LICENSE
$ git commit -m 'initial project version'

위의 명령어를 통해서 Git 저장소를 만들고 파일 버전 관리를 시작한다.

 

기존 저장소를 Clone 하기

다른 프로젝트에 참여하려하거나(Contribute) Git 저장소를 복사라고 싶을 때

git clone 명령을 사용한다.

Git이 Subversion과 다른 가장 큰 차이점은 서버에 있는 거의 모든 데이터를 복사한다는 것이다.

git clone을 사용하면 실행하면 프로젝트 히스토리를 전부 받아온다.

실제로 서버의 디스크가 망가져도 클라이언트 저장소 중에서 아무거나 하나 가져다가 복구하면 된다.

 

git clone [url] 명령으로 저장소를 Clone 한다. 

$ git clone https://github.com/libgit2/libgit2

이 명령은 'libgit2'이라는 디렉토리를 만들고 그 안에 .git 디렉토리를 만든다. 

그리고 저장소의 데이터를 모두 가져와서 자동으로 최신 버전을 Checkout해 놓는다.

libgit2 디렉토리로 이동하면 Checkout으로 생성한 파일을 볼 수 있고 당장 하고자하는 일을 시작할 수 있다.

 

$ git clone https://github.com/libgit2/libgit2 mylibgit

위와 같은 명령어를 사용하면 다른 디엑토리 이름으로 Clone 할 수 있다.

 

Git은 다양한 프로토콜을 지원한다.

 

https:// 

git://

user@server:path/to/repo.git  (SSH 프로토콜)

 

각 프로토콜은 장단점이 있으며 Git 저장소에 접근하는 방법이 다르다.

Git 저장소를 만드는 방법은 두 가지다.

기존 프로젝트나 디렉토리를 Git 저장소로 만드는 방법

다른 서버에 있는 저장소를 Clone 하는 방법

 

기존 디렉토리를 Git 저장소로 만들기

기존 프로젝트를 Git으로 관리하고 싶을 때, 프로젝트의 디렉토리로 이동한다.

운영체제에 따라서 명령코드가 다르다.

Linux: $ cd /home/user/your_repository
Mac: $ cd /Users/user/your_repository
Windows: $ cd /c/user/your_repository

그리고 아래와 같은 명령을 실행한다:

$ git init

이 명령은 .git 이라는 하위 디텍토리를 만든다.

.git 디렉토리에는 저장소에 필요한 뼈대 파일(Skeleton)이 들어있다.

이 명령만으로는 아직 프로젝트의 어떤 파일도 관리하지 않는다.

 

Git이 파일을 관리하게 하려면 저장소에 파일을 추가하고 커밋해야 한다.

git add 명령으로 파일을 추가하고 git commit 명령으로 커밋한다.

 

$ git add *.c
$ git add LICENSE
$ git commit -m 'initial project version'

위의 명령어를 통해서 Git 저장소를 만들고 파일 버전 관리를 시작한다.

 

기존 저장소를 Clone 하기

다른 프로젝트에 참여하려하거나(Contribute) Git 저장소를 복사라고 싶을 때

git clone 명령을 사용한다.

Git이 Subversion과 다른 가장 큰 차이점은 서버에 있는 거의 모든 데이터를 복사한다는 것이다.

git clone을 사용하면 실행하면 프로젝트 히스토리를 전부 받아온다.

실제로 서버의 디스크가 망가져도 클라이언트 저장소 중에서 아무거나 하나 가져다가 복구하면 된다.

 

git clone [url] 명령으로 저장소를 Clone 한다. 

$ git clone https://github.com/libgit2/libgit2
 

libgit2/libgit2

A cross-platform, linkable library implementation of Git that you can use in your application. - libgit2/libgit2

github.com

이 명령은 'libgit2'이라는 디렉토리를 만들고 그 안에 .git 디렉토리를 만든다. 

그리고 저장소의 데이터를 모두 가져와서 자동으로 최신 버전을 Checkout해 놓는다.

libgit2 디렉토리로 이동하면 Checkout으로 생성한 파일을 볼 수 있고 당장 하고자하는 일을 시작할 수 있다.

 

$ git clone https://github.com/libgit2/libgit2 mylibgit

위와 같은 명령어를 사용하면 다른 디엑토리 이름으로 Clone 할 수 있다.

 

Git은 다양한 프로토콜을 지원한다.

 

https:// 

git://

user@server:path/to/repo.git  (SSH 프로토콜)

 

각 프로토콜은 장단점이 있으며 Git 저장소에 접근하는 방법이 다르다.

Git은 파일을 세 가지 상태로 관리한다

Git으로 하는 일은 기본적으로 아래와 같다.

1. Working Directory에서 파일을 수정한다.

2. Staging Area에 파일을 Stage해서 commit할 snapshot을 만든다.

3. Staging Area에 있는 파일을 commit해서 Git Directory에 영구적인 snapshot으로 저장한다.

 

Git은 파일을 Committed, Modified, Staged 이렇게 세 가지 상태로 관리한다. 

 

Committed란 데이터가 로컬 데이터베이스에 안전하게 저장 됐다는 것을 의미한다.

Modified는 수정한 파일을 아직 로컬 데이터베이스에 커밋하지 않은 것을 말한다.

Staged란 현재 수정한 파일을 곧 커밋할 것이라고  표시한 상태를 의미한다.

 

세 가지 상태는 Git 프로젝트의 세 가지 단계와 연결돼 있다. 

Git 디렉토리, 워킹 트리, Staging Area 이렇게 세 가지 단계를 이해해 보자.

Git Directory

Git이 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳을 말한다. (Git의 핵심)

Git Directory에 있는 파일들은 committed 상태이다.

 

Working Directory

프로젝트의 특정 버전을 Checkout한 것이다. 

다시 말해 Git Directory에 있는 압축된 데이터베이스에서 특정 버전의 파일을 가져와서 Working Directory를 만든다.

(Checkout은 예를 들어 지난주 화요일에 회사에서 작업한 프로젝트 파일을 

집에서 수정하기 위해 USB를 통해 내가 작업하는 특정 폴더에 저장하는 명령어라고 할 수 있다.  

 USB = Git Directory, 내가 작업하는 폴더 = Working Directory)

 

Staging Area

Git Directory에 있으며 곧 commit할 파일에 대한 정보를 저장한다. 

Staging Area는 생략할 수도 있다.

 

Merge = 갱신이다. 

 다른 사람의 업데이트 이력을 내 저장소에도 갱신 하는것

더보기

내가 끌어온 저장소가 최신 버전이 아닌 경우, 즉 내가 pull 을 실행한 후 다른 사람이 push 를 하여 원격 저장소를 업데이트 해버린 경우에는 위의 그림과 같이 내 push 요청이 거부되어 버립니다.

이런 경우 병합(merge)이라는 작업을 진행하여 다른 사람의 업데이트 이력을 내 저장소에도 갱신 해야합니다. 만약 병합하지 않은 채로 이력을 덮어쓰게 되면 다른 사람이 push 한 업데이트 내역(그림의 커밋C)이 사라져 버리기 때문입니다.

내가 끌어온 저장소가 최신 버전이 아닌 경우, 즉 내가 pull 을 실행한 후 다른 사람이 push 를 하여 원격 저장소를 업데이트 해버린 경우에는 위의 그림과 같이 내 push 요청이 거부되어 버립니다.

이런 경우 병합(merge)이라는 작업을 진행하여 다른 사람의 업데이트 이력을 내 저장소에도 갱신 해야합니다. 만약 병합하지 않은 채로 이력을 덮어쓰게 되면 다른 사람이 push 한 업데이트 내역(그림의 커밋C)이 사라져 버리기 때문입니다.

 

리모트 저장소를 Pull 하거나 Fetch 하기

git fetch 명령은 리모트 저장소의 데이터를 모두 로컬로 가져오지만, 자동으로 Merge하지는 않는다.

그래서 로컬에서 하던 작업을 정리하고 나서 수동으로 Merge 해야 한다.

 

 git pull 명령은 Clone 한 서버에서 데이터를 가져오고 그 데이터를 자동으로 현재 작업하는 코드와 Merge 시킨다.

더보기
$ git fetch [remote-name] 

이 명령은 로컬에는 없지만, 리모트 저장소에 있는 데이터를 모두 가져온다.

그러면 리모트 저장소의 모든 브랜치를 접근할 수 있어서

언제든지 Merge를 하거나 내용을 살펴볼 수 있다.

 

저장소를 Clone 하면 명령은 자동으로 리모트 저장소를 'origin'이라는 이름으로 추가한다.

그래서 나중에 gi fetch origin 명령을 실행하면 Clone 한 이후에 수정된 것을 모두 가져 온다.

git fetch 명령은 리모트 저장소의 데이터를 모두 로컬로 가져오지만, 자동으로 Merge하지는 않는다.

그래서 로컬에서 하던 작업을 정리하고 나서 수동으로 Merge 해야 한다.

 

그냥 쉽게 git pull 명령으로 리모트 저장소 브랜치에서 데이터를 가져올 뿐만 아니라 자동으로 로컬 브랜치와 Merge

시킬 수 있다. 먼저 git clone 명령은 자동으로 로컬의 master 브랜치가 리모트 저장소의 master 브랜치를 추적하도록 한다. 그리고 git pull 명령은 Clone 한 서버에서 데이터를 가져오고 그 데이터를 자동으로 현재 작업하는 코드와 Merge 시킨다.

 

리모트 저장소에 Push 하기

프로젝트를 공유하고 싶을 때 Upstream 저장소에 Push 할 수 있다.

이 명령은 git push [리모트 저장소 이름] [브랜치 이름]' 으로 단순하다.

 

$ git push origin master

이 명령은 Clone 한 리모트 저장소에 쓰기 권한이 있고, Clone 하고 난 이후 아무도 Upstream 저장소에 Push 하지 않았을 때만 사용할 수 있다. 다시 말해서 Clone 한 사람이 여러 명 있을 때, 다른 사람이 Push 한 후에 Push 하려고 하면

Push 할 수 없다. 먼저 다른 사람이 작업한 것을 가져와서 Merge 한 후에 Push 할 수 있다.

 

Branch란 무엇인가​? 협업을 위한 장치이다.

 

Gitkraken은 협업을 위한 tool이다

협업을 하다보면 기존파일에 수정 혹은 새로운  파일 업로드 등의 과정을 거치게 되는데 

kraken에서는 누가 어떤 글과 파일을 건드렸는지 한눈에 알 수 있다.

(심지어 delete 했다는 표시도 나오며 delete 이전의 파일을 볼 수 있다)

Branch란 우측의 그림처럼 기존 main에서 뻗어 나온 파생이다.

즉 팀원이 이전파일에 수정하거나 새로 파일을 추가한 후 merge A into B

 선택하면 branch가 생성된다.

여기서 A란 새로 추가한 파일 혹은 수정한 코드이고 B는 기존의 파일이다

Merge 함으로 인해 새로운 파일/코딩과 기존 파일과의 관계를 한눈에 볼 수 

있고 작성자가 누구인지 볼 수 있다.

특이사항은 merge 한 후 gitlab에서 confirm해야 하며 

gitlab안에서 자체적으로 Merge가 가능하다

더보기

브랜치란 독립적으로 어떤 작업을 진행하기 위한 개념입니다. 필요에 의해 만들어지는 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행할 수 있습니다.

또한 이렇게 만들어진 브랜치는 다른 브랜치와 병합(Merge)함으로써, 작업한 내용을 다시 새로운 하나의 브랜치로 모을 수 있습니다.

아래 그림을 보면, 브랜치를 사용하여 동시에 여러 작업을 진행할 때의 작업 흐름을 한눈에 파악할 수 있습니다.

여러 명이서 동시에 작업을 할 때에 다른 사람의 작업에 영향을 주거나 받지 않도록, 먼저 메인 브랜치에서 자신의 작업 전용 브랜치를 만듭니다. 그리고 각자 작업을 진행한 후, 작업이 끝난 사람은 메인 브랜치에 자신의 브랜치의 변경 사항을 적용합니다. 이렇게 함으로써 다른 사람의 작업에 영향을 받지 않고 독립적으로 특정 작업을 수행하고 그 결과를 하나로 모아 나가게 됩니다. 이러한 방식으로 작업할 경우 '작업 단위', 즉 브랜치로 그 작업의 기록을 중간 중간에 남기게 되므로 문제가 발생했을 경우 원인이 되는 작업을 찾아내거나 그에 따른 대책을 세우기 쉬워집니다.

브랜치란 독립적으로 어떤 작업을 진행하기 위한 개념입니다. 필요에 의해 만들어지는 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행할 수 있습니다.

또한 이렇게 만들어진 브랜치는 다른 브랜치와 병합(Merge)함으로써, 작업한 내용을 다시 새로운 하나의 브랜치로 모을 수 있습니다.

아래 그림을 보면, 브랜치를 사용하여 동시에 여러 작업을 진행할 때의 작업 흐름을 한눈에 파악할 수 있습니다.

여러 명이서 동시에 작업을 할 때에 다른 사람의 작업에 영향을 주거나 받지 않도록, 먼저 메인 브랜치에서 자신의 작업 전용 브랜치를 만듭니다. 그리고 각자 작업을 진행한 후, 작업이 끝난 사람은 메인 브랜치에 자신의 브랜치의 변경 사항을 적용합니다. 이렇게 함으로써 다른 사람의 작업에 영향을 받지 않고 독립적으로 특정 작업을 수행하고 그 결과를 하나로 모아 나가게 됩니다. 이러한 방식으로 작업할 경우 '작업 단위', 즉 브랜치로 그 작업의 기록을 중간 중간에 남기게 되므로 문제가 발생했을 경우 원인이 되는 작업을 찾아내거나 그에 따른 대책을 세우기 쉬워집니다.

 

Git Lab & Git Hub  어떤 서비스를 받을것 인가?

github

-가장 많은 Integration을 지원.
-가장 많은 오픈소스 저장소 보유.
-가장 안정적인 서버 상태를 제공

- 보통 OpenSource Project가 진행되어짐.

- private repository로 사용할 경우는 일부 비용을 내야해 개인 프로젝트 저장소로는 적합하지 않음.

Gitlab

private project더라도 비용이 없음.

- 비용을 추가로 내면 기술지원도 받을수 있음.

Git kraken

 

활용

더보기

실제 작업에서 git을 사용하여 코드를 저장하고 수정할 수 있다.

 

참고글

https://backlog.com/git-tutorial/kr/stepup/stepup1_1.html

git 메뉴얼