본문 바로가기

CS

[Git] Git 개념과 기초

Git

#git_add #git_commit #git_push #git_remote #git_hook #pre_commit #pre_push #.git

 

 

출처:https://git-scm.com/

 

1. Git이란?

컴퓨터 파일의 변경사항을 추적하고 여러 명의 사용자들 간에 해당 파일들의 작업을 조율하기 위한 분산형 버전 관리 시스템.

CLI(Command Line Interface)와 GUI(Graphic User Interface) 모두 이용할 수 있지만, CLI에서는 모든 기능들을 다 사용할 수 있기 때문에 CLI를 사용하는 것이 좋다.

 

1-1. 버전 관리가 필요한 이유/Git을 사용하는 이유?

개발자 간의 협업을 위해 전체 개발 소스를 공유하면서 개발 파트를 나눌 수 있고
같은 모듈을 개발하더라도 소스를 공유하며 개발할 수 있다.

- 동시성: 소스 코드를 주고 받을 필요 없이 다수의 개발자들이 프로젝트가 동일한 기능을 동시에 개발할 수 있다.

- 가역성: 기능을 작성하다 오류가 발생하거나 기획자가 해당 기능을 최소한 경우, 작업하던 코드를 과거로 돌려야 할 때 이전 코드로 되돌릴 수 있다.

- 기록성: 이전 코드의 내용과 수정한 에디터가 저장되기에 오류의 추적이 용이하다.

1-2. 버전 관리 시스템(VCS, Version Control System)이란?

특정 문서 또는 소프트웨어 등의 버전을 안전하게 관리(기록, 유지, 갱신)하는 시스템

  • Local VCS 로컬형 버전관리 시스템
    - 사용자의 컴퓨터에 관리할 버전 내용을 저장한다.
    - 사용하기 비교적 간단하나 다른 사람들과 공유가 어렵고, 사용자의 컴퓨터에 문제가 생겼을 때 복구가 어려운 단점이 있다.
  • Center VCS 중앙형 버전관리 시스템 (CVCS)
    - 사용자의 컴퓨터가 아닌 여러 사용자의 버전 관리 내용을 중앙 서버에서 관리한다.
    - 하나의 중앙 서버에서 팀원의 역할, 권한 등을 관리할 수 있기에 편리하지만
    - 팀원은 가장 최신 버전만 가져가서 사용할 수 있고, 중앙 서버에 문제가 생긴 경우 모든 팀원들이 작업을 할 수 없게 되며, 서버가 날아갈 경우 이때까지 쌓아온 프로젝트에 대한 소스코드 및 데이터베이서 등이 날아갈 수 있다는 위험성이 있다.
  • Division VCS 분산형 버전관리 시스템 (DVCS)
    - 중앙에서 관리하고 있던 모든 이력을 가진 저장소 전체를 복사하여 사용자의 컴퓨터로 가져와 사용한다.
    - 사용자의 컴퓨터에서는 local로 개발을 할 수 있으며, 이를 중앙 서버로 보낼 수도 있고 중앙 서버의 진행상황을 사용자의 컴퓨터로 갱신시켜서 사용할 수도 있다.
    - 중앙 서버에 문제가 생겨도 사용자의 local 저장소에 저장된 데이터로 복구시킬 수 있으며, 공동 작업을 하는 팀원들 모두가 이러한 저장소 정보를 가지고 있으므로 서버와 일부 사용자의 데이터가 날아가도 복구가 가능하다.

1-3. Git과 Github의 차이점

Git는 개인 컴퓨터에서 돌아가는 Visual Control System이다. 개인 계정을 등록할 필요가 없으며 인터넷을 연결할 필요도 없다.

Github는 Github라 불리는 회사에서 서비스하고 있는 서버에 올라간 Git이다. 따라서 개인 계정을 등록해야 하고, 인터넷에 연결되어야 사용할 수 있다. 즉 Github는 Git 소프트웨어를 지원하는 일종의 클라우드 서비스이다.

 

2. Git 기초

2-1. Git 파일의 세 가지 상태

  • committed: 데이터가 로컬 데이터베이스에 안전하게 저장되었다는 것을 의미한다.
  • modified: 수정한 파일을 아직 로컬 데이터베이스에 커밋하지 않은 것을 의미한다.
  • staged: 현재 수정한 파일을 곧 커밋할 것이라고 표시한 상태를 의미한다.

2-2. Git 프로젝트의 세 가지 단계

  • .git Directory: git 디렉토리는 git이 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳을 말한다. git의 핵심이다. 다른 컴퓨터에 있는 저장소를 clone할 때 git 디렉토리가 만들어진다.
  • Working Tree/Staging Area: 프로젝트의 특정 버전을 checkout한 것이다. git 디렉토리는 지금 작업하는 디스크에 있고 그 디렉토리 안에 압축된 데이터베이스에서 파일을 가져와서 워킹 트리를 만든다.
  • Staging Area/Index: git 디렉토리에 있다. 단순한 파일이고 곧 커밋할 파일에 대한 정보를 저장한다.

출처: https://codegym.cc/groups/posts/379-getting-started-with-git-a-comprehensive-guide-for-newbies

 

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

  1. 워킹 트리에서 파일을 수정한다.
  2. Staging Area에 파일을 stage해서 커밋할 스냅샷을 만든다. 모든 파일을 추가할 수도 있고 선택하여 추가할 수도 있다.
  3. Staging Area에 있는 파일을 커밋해서 git directory에 영구적인 스냅샷으로 저장한다.

Git Directory에 있는 파일들은 committed 상태이다. 파일을 수정하고 staging area에 추가했다면 staged이다. checkout하고 나서 수정했지만, 아직 staging area에 추가하지 않았으면 modified이다.

 

2-3. Git 저장소 만들기

기존 디렉토리를 git 저장소로 만드는 방법과, 기존 저장소를 clone하는 두 가지 방법을 주로 사용한다.

  • 기존 디렉토리를 git 저장소로 만들기
    아직 버전관리를 하지 않는 기존 프로젝트를 git로 관리하고 싶은 경우이다.
    1. 우선 프로젝트의 디렉토리로 이동한다.
# Linux
$ cd /home/user/my_project
# macOS
$ cd /Users/user/my_project

          2. 하위 디렉토리를 만든다.

$ git init

               해당 명령어는 #.git라는 하위 디렉토리를 만든다. 여기에는 저장소에 필요한 skeleton이 들어있다.

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

 

          3. 파일을 추가하고 커밋한다.

$ git add *.c

$ git add LICENSE

$ git commit -m ‘initial project version’

 

  • 기존 저장소를 clone하기
    git clone [url] 명령으로 저장소를 clone한다.

 

2-4. Git 명령어들

  • #git commit
    stage 상태에 있는 파일을 commit으로 만들 수 있다. stage에 있는 내용으로 커밋을 만들 때 commit 명령어를 사용한다.
# 기본 에디터가 열리고 변경 내용을 입력하고 저장하면 커밋이 생성된다.
$ git commit
# 에디터를 열지 않고 바로 메세지를 입력할 수 있다.
$ git commit -m "commit message"
# 신규 파일을 제외하고 트래킹하는 모든 파일의 변경사항을 스테이징함과 동시에 커밋을 만든다.
$ git commit -a
# 스테이징과 커밋을 한번에 하며 메세지를 입력한다.
$ git commit -am "commit message"
# 이전 커밋에 현재 변경 내용을 추가한다.
$ git commit --amend

 

  • #git add 
    작업 디렉토리 상의 변경 내용을 스테이징 영역에 추가한다. git add는 다음 커밋을 기록할 때가지 변경분을 모아놓기 위해서 사용한다. 따라서 git commit 명령어를 통해 명시적으로 기록을 남기기 전까지는 git add 명령어를 많이 실행해도 git 저장소의 변경 이력에는 어떤 영향도 주지 않는다.
# 작업 디렉토리의 변경 내용 일부만 스테이징 영역에 넘기고 싶을 때
$ git add [파일/디렉토리 경로]
# 현재 디렉토리의 모든 변경 내용을 스테이징 영역에 넘기고 싶을 때
$ git add .
# 작업 디렉토리 내의 모든 변경 내용을 스테이징 영역에 넘기고 싶을 때
$ git add -A
# 변경 사항을 터미널에서 확인하면서 하나씩 스테이징 영역에 넘기고 싶을 때
$ git add -p

 

  • #git remote
    remote repository를 관리하는 명령어로, 새로운 저장소를 추가하거나 변경할 수 있다.

    # 새 remote 추가
    $ git remote add [주소별명] [url]
    # remote 저장소 목록 불러오기
    $ git remote -v

 

  • #git push
    원격 저장소(remote repository)에 코드 변경 내용을 업로드하기 위해 사용한다. git commit는 로컬 저장소(local repository)에 코드 변경 내용을 남기더라도 원격 저장소에는 알 수 없고, 반드시 명시적으로 git push를 사용해야 원격 저장소로 로컬 저장소의 코드 변경 내용들이 전송된다.

    $ git push [저장소명] [branch명]
    # 인자를 매번 입력하는 것을 생략하기 위해 -u 옵션을 사용할 수 있다.
    $ git push -u [저장소명] [branch명]
    $ git push
    

2-5. #git hook

정해진 시점에 스크립트를 실행하도록 하는 것이다. hook의 기본 디렉토리는 .git/hooks이다. 실행할 수 있는 스크립트 파일을 확장자 없이 저장소의 hooks 디렉토리에 넣으면 훅 스크립트가 켜지고 계속 호출된다.

클라이언트 훅과 서버 훅으로 나뉜다. 클라이언트 훅은 commit, merge가 발생하거나 push가 발생하기 전 클라이언트에서 실행하는 훅이다. 서버 훅은 git repository로 push가 발생했을 때 서버에서 실행하는 훅이다.

 

클라이언트 훅은 commit-workflow hook, email-workflow script 그리고 기타 훅으로 분류한다.

  1. 커밋 워크플로 훅
    git commit으로 커밋을 할 때 실행하는 훅으로, 모두 네 가지이다.
    • #pre-commit
      커밋을 할 때 가장 먼저 호출되는 훅으로, commit 메세지를 작성하기 전에 호출된다.
    • prepare-commit-msg
      git이 커밋 메시지를 생성하고 나서 편집기를 실행하기 전에 실행된다. 커밋 메시지를 수정하기 전 먼저 프로그램을 수정하고 싶을 때 사용한다.
    • commit-msg
      커밋 메시지가 들어있는 임시 파일의 경로를 인자로 받는다. 이 훅에서 최종적으로 커밋이 완료되기 전에 프로젝트 상태나 커밋 메시지를 검증한다.
    • post-commit
      커밋이 완료되면 실행된다. 커밋된 것을 누군가 혹은 다른 프로그램에게 알릴 때 사용한다.
  2. 이메일 워크플로 훅
    git am으로 이메일을 통해 patch 파일을 적용할 때 실행하는 훅이다.
    • applypatch-msg
      git am명령 실행 시 가장 먼저 호출된다.
    • pre-applypatch
      patch 적용 후 실행하며, patch를 중단시킬 수 있다.
    • post-applypatch
      git am 명령에서 마지막으로 실행되며, patch를 중단시킬 수 없다.
  3. etc
    rebase, merge, push와 같은 이벤트를 실행할 때 실행되는 훅이 포함된다.
    • pre-rebase
      rebase하기 전에 실행된다.
    • post-rewrite
      커밋을 변경하는 명령을 실행했을 때 실행된다.
    • post-merge
      merge가 끝나고 나서 실행된다.
    • #pre-push
      git push 명령을 실행하면 실행된다. remote 정보를 업데이트 하고 remote로 데이터를 전송하기 전에 실행된다. push 하기 전 커밋이 유효한지 확인하는 용도로 사용할 수 있다. 훅에서 0이 아닌 값을 반환하면 Push를 중지시킨다.

 

Reference

https://git-scm.com/book/ko/v2/시작하기-버전-관리란%3F

https://kotlinworld.com/265

https://velog.io/@muman_kim/Git분산형-버전관리시스템

https://jeonghwan-kim.github.io/dev/2020/02/10/git-usage.html

https://www.daleseo.com/git-add/

https://www.daleseo.com/git-push/

https://kotlinworld.com/284

https://git-scm.com/book/ko/v2/Git맞춤-Git-Hooks

https://library.gabia.com/contents/8492/

'CS' 카테고리의 다른 글

[Linux] Shell Script 개념과 기초  (0) 2023.04.16