Git

장승현·2023년 6월 5일

Git

목록 보기
1/2
post-thumbnail

Git이란?

Version Control System(VCS) 중 하나로, 소스 코드의 버전을 효과적으로 관리하기 위해 개발된 분산형 버전 관리 시스템(Distributed Version Control, DVC)이다.

Git의 역사

git 이전의 방식은 delta-based version control로 버전마다 변경된 내용만을 가지고 있었다. 이러한 방식은 버전을 변경할 때 개선된 부분을 찾고 적용하는데 시간이 많이 걸리는 단점이 존재했다. git은 이러한 문제점을 해결하기 위해 리눅스에서 개발했다. 전체 프로젝트를 스냅샷(특정 시간에 데이터 저장 장치의 상태를 별도의 파일이나 이미지로 저장하는 기술)하는 방식을 사용하여 버전 또는 브랜치들 사이의 이동이 자유롭고 빠르다는 특징이 있다. 이는 버전마다 업데이트 되지 않은 내용들은 이전 버전의 링크를 가리키기 때문에 가볍다.

Git의 특징

  • 파일의 변경 사항을 추적하여 작업하던 파일을 되돌릴 수 있음
  • 원격 저장소(remote repository)와 각 개발자의 PC 내 로컬 저장소(local repository)로 구분되어 원격 저장소에 문제가 생길 때 로컬 저장소를 통해 복원할 수 있고 반대의 경우도 가능
  • 하나의 주제에 대해 다수의 개발자가 동시에 개발 가능
  • 많은 개발자가 사용하고 있어 협업에 도움 됨
  • 소스 코드 외에 텍스트, 그래픽, 레이아웃 파일도 버전 관리가 가능

Git의 장점

  • 가장 많이 사용됨
  • 무료
  • 오픈 소스 기반
  • 가볍고 빠름
  • 오프라인에서도 작업 가능
  • 오류를 되돌릴 수 있음
  • 쉽고 빠른 분산과 병합

Git의 기본 개념

영역

git은 4개의 영역으로 구분되어 사용된다.

크게 Working Directory, Staging Area, Local Repository는 개발자 개인의 PC 내부에서 이루어지며, Remote Repository는 Remote Server에서 이루어진다. 세부 내용은 다음과 같다.

  • Working Directory : 개발자 PC 내의 작업 폴더를 의미한다.
  • Staging Area : Local Repository에 올라가기 전 단계로 git add 명령어를 통해 파일을 업로드 할 수 있다.
  • Local Repository : Remote Repository에 올라가기 전 단계로 git commit 명령어를 통해 파일을 업로드 할 수 있다. Working Directory에서 바로 Local Repository로 업로드 할 수도 있으며, Staging Area에 있는 변경 사항 또한 함께 업로드 된다.
  • Remote Repository : 변경 사항이 Remote Server에 등록되어 함께 일하는 개발자들이 접근 가능해진다.

파일 상태

git은 파일들이 어떤 상태인지 분류하여 관리한다.

추적 관리 여부에 따라 두 가지 상태(Tracked, Untracked)로 나눌 수 있다. Tracked는 반대로 해당 파일을 추적 및 관리하는 상태를 의미하며, Untracked는 git이 해당 파일을 추적 및 관리하지 않는 상태를 의미한다. Tracked 상태로 만들기 위해서는 최소 한 번 git add 명령어 또는 git commit 명령어를 통해 변경 사항을 업로드해야 한다. Untracked 상태의 파일은 수정 또는 삭제가 일어나도 복구가 되지 않는 점을 주의해야 한다.

또한, 파일의 변경 여부에 따라 두 가지 상태(Modified, Unmodified)로 나눌 수 있다. 이는 Tracked 상태인 파일의 수정 여부에 따라 결정된다.

브랜치(Branch)

브랜치란 독립적인 작업 영역으로, 필요에 의해 만들어지는 각 branch는 다른 branch의 영향을 받지 않기 때문에 각 개발자가 작업을 동시에 할 수 있다. 이후 개발 완료된 내용은 기존 브랜치와 병합함으로써 하나의 브랜치로 변경 사항을 적용 및 관리할 수 있다.

주의 사항으로 각 작업자가 같은 파일의 같은 부분을 동시에 수정하여 병합하는 경우 충돌이 발생한다. 이때 오류가 발생한 파일 내용은 직접 수정한 후 commit 해야 문제 없이 변경 사항을 적용할 수 있다.

오류가 발생하는 부분은 해당 파일에서 ===== 기준 위(A에서 B)는 현재 branch의 내용, 아래(B에서 C)는 병합할 branch의 내용으로 구분되어 나타난다.

Git 기타 용어

HEAD

현재 브랜치의 가장 최근 커밋

Tag

커밋을 참조하기 쉽도록 하는 쉬운 이름

Git 전략

git은 정해진 규칙 없이 브랜치를 생성해 작업하다 보면 히스토리가 복잡해지고 추적이 용이하지 못하게 된다. 이를 해결하기 위해 git을 사용하는 전략이 필요하며 가장 대표적인 전략으로는 Git Flow가 있다.

Git Flow

Vincent Driessen 이라는 개발자가 만든 전략이다. 크게 브랜치를 5가지로 나누어 사용하며 각 브랜치의 역할은 다음과 같다.

  • master : 제품으로 출시될 수 있는 브랜치
  • develop : 다음 출시 버전을 개발하는 브랜치
  • feature : 기능 개발을 위한 브랜치로, develop 브랜치에서 가져오며 기능 구현이 끝나면 다시 develop으로 병합 후 삭제한다. 일반적으로 개발자의 로컬에서만 유지하고 origin에는 푸시하지 않는다.
  • release : 출시 버전을 준비하는 브랜치로, develop 브랜치에서 가져온다. 명명 규칙은 release-*이며 다음 릴리즈를 위한 개발이 최종 완료되었다고 판단하는 시점에서 생성한다. 해당 브랜치에서는 소스 코드 내에 버전과 관련된 값을 수정해 커밋하고 브랜치 생성 후의 버그 픽스는 또한 해당 브랜치에서 진행한다. 이렇게 릴리즈가 모두 준비되면 develop과 master 브랜치에 병합 후 삭제한다. 주의할 점으로 릴리즈 대상이 되는 feature branch는 이미 develop에 병합되어 있어야 하며 다음에 릴리즈할 feature branch는 포함돼서는 안된다.
  • hotfix : 출시 버전에서 발생한 버그를 수정하는 브랜치로, master 브랜치에서 가져오며 명명 규칙은 hotfix-*이다. 작업이 완료되면 develop과 master 브랜치에 병합하고 삭제한다.

master와 develop 브랜치는 계속 유지되는 성격을 지니며, 나머지 브랜치는 master 또는 develop에 병합 후 삭제되는 이벤트 성의 브랜치이다.

Git 명령어

Installation

Ubuntu 기준

sudo apt-get install git
git --version

Init

git init

Gitconfig

git에 관한 모든 환경 설정은 gitconfig 파일에 저장된다.
이를 확인하기 위한 명령어는 다음과 같다.

git config -list (터미널 환경에서 확인)
git config -global -e (파일로 여는 명령어)
git config -global core.editor "code" (visual studio code로 여는 명령어)
git config -global core.editor "code -wait" (-wait는 해당 파일을 수정하는 동안 추가적인 명령어는 실행할 수 없게 하는 옵션)

유저 정보를 설정하는 명렁어는 다음과 같다.

git config -global user.name "user_name" (유저 이름 설정하는 명령어)
git config -global user.name (유저 이름 확인하는 명령어)
git config -global user.email "user_email" (유저 이메일 설정하는 명령어)

단축키 설정하는 명령어는 다음과 같다.

git config -global alias.단축키 명령어

토큰 설정

토근 생성
config파일에서 url = https://<user.name><token>@<url주소>

Remote

git remote는 원격 저장소를 설정하는 명령어이다.

git remote add <name> <url>

Status

git status 명령어는 프로젝트 내의 파일들의 상태를 확인할 수 있는 명령어이다.

git status

Add

git add 명령어는 특정 파일을 staging area에 등록하는 명령어이다.
staging area에 등록하는 행위를 ‘스테이징’이라고도 한다.

git add <file>
git add <file> <file> (다수의 파일을 한번에 등록 가능)

Ignore

git에 추가하고 싶지 않은 파일을 gitignore이란 폴더로 이동하여 제외시키는 명령어

echo *.log(해당 파일의 확장자 명) > .gitignore

Commit

git commit 명령어는 변경 사항을 local repository에 등록하는 명령어이다.
변경 사항에 대한 간략한 설명을 확인할 수 있는 commit message를 입력할 수 있다.

git commit
git commit -m "message" (-m : 메세지 포함)
git commit -am "message" (-a : staging area와 directory 내 모든 파일 포함)

Diff

git diff 명령어는 어떤 파일의 내용이 수정되었는지 확인하는 명령어이다.

git diff (working directory의 내용만 확인 가능)
git diff -staged or -cached (staging area에 있는 내용 확인 가능)

Log

git log 명령어는 저장소의 변경 이력을 확인하는 명령어이다.

git log
git log --graph --oneline (선으로 된 그림 형태로 출력)
git log --decorate (태그 정보를 포함한 이력 출력)

Push

git push 명령어는 commit을 통해 저장된 로컬 저장소의 변경 이력을 원격 저장소에 등록하는 명령어이다.

git push <repository> <refspec>
<repository>는 원격 저장소의 주소
<refspec>은 push할 브랜치

Clone

git clone 명령어는 원격 저장소를 내 로컬 저장소에 복제하는 명령어이다.

git clone <repository> <directory>
<directory>는 복제 대상의 폴더명

Pull

git pull 명령어는 원격 저장소의 변경 사항을 확인하고 내 로컬 저장소에 적용하는 명령어이다.

git pull <repository> <refspec>

Fetch

git fetch 명령어는 원격 저장소의 변경 사항을 확인만 하는 명령어이다.

git fetch

Merge

git merge 명령어는 변경 내용의 이력을 남기면서 다른 브랜치에 현재 브랜치를 병합하는 명령어이다.

git merge <commit>

Rebase

git rebase 명령어는 변경 내용의 이력을 변경하며 다른 브랜치에 현재 브랜치를 병합하는 명령어이다.
히스토리를 단순하게 만들 수 있다는 장점이 있다.

git rebase <commit>

Checkout

git checkout 명령어는 현재 브랜치에서 다른 브랜치로 전환하는 명령어이다.

git checkout <branch>
git checkout -b <branch> (-b : 생성과 전환을 동시에)
git checkout -t <origin/branch> (-t : 원격 저장소의 브랜치를 같은 이름으로 가져오기)
git checkout . (변경사항 폐기)

Branch

git branch 명령어는 새 브랜치를 만드는 명령어이다.

git branch <branchname>
git branch -d <branchname> (-d : 기존 브랜치를 삭제)

Cherry-Pick

git cherry-pick 명령어는 다른 브랜치에서 지정한 커밋을 복사하여 현재 브랜치로 가져오는 명령어이다.
특정 브랜치에 잘못 추가한 커밋을 다른 브랜치로 옮기거나 현재 브랜치에도 추가하고 싶을 때 사용한다.

git cherry-pick <commit>

Stash

git stash 명령어는 파일의 변경 내용을 일시적으로 기록하는 명령어이다.

git stash
git stash list (stash한 목록 확인)
git stash apply <stashname> (기록한 작업 가져오기)
git stash drop <stashname> (기록한 작업 제거하기)

Submodule

git submodule 명령어는 원격 저장소 내에 존재하는 또 다른 하위 저장소를 관리하는 명령어이다.

git submodule update --remote (서브 모듈의 최신 커밋 가져오기)

Reset

원격 저장소에 push하지 않은 commit 취소 또는 staged file 취소

git reset --hard HEAD~1 (최신 commit 취소)
git reset (staged file 취소)

Reference

https://dololak.tistory.com/304
https://youtu.be/Z9dvM7qgN9s
https://backlog.com/git-tutorial/kr/
https://subicura.com/git/guide/basic.html#gui-%E1%84%83%E1%85%A9%E1%84%80%E1%85%AE-%E1%84%89%E1%85%A1%E1%84%8B%E1%85%AD%E1%86%BC%E1%84%92%E1%85%A1%E1%84%80%E1%85%B5

profile
늦더라도 끝이 강한 내가 되자

0개의 댓글