IWished
article thumbnail

버전 관리 시스템을 쓰는 이유

  • 각 버전을 기록/저장
  • 이전 버전으로의 복원
  • 소프트웨어 개발 과정에서 무슨 일이 일어났는지 이해
  • 협업
  • 백업

Git

  • 형상 관리 시스템(Version Control System)
  • GitHub : Git 사용자를 위한 소셜 플랫폼

Repository

Git repository란 말 그대로 파일이나 폴더를 저장해 두는 곳이다.

Git 저장소의 좋은 점 중 하나는 파일의 변경 이력 별로 구분되어 저장이 가능하다는 점이다.

비슷한 파일이라도 내용 중 일부 문구가 서로 다르면 다른 파일로 인식되기 때문에 파일을 변경 사항 별로 구분해 저장할 수 있다.

 

원격 저장소와 로컬 저장소

Git은 원격 저장소와 로컬 저장소 두 종류의 저장소를 제공한다.

  • 원격 저장소(Remote Repository)
    • 파일이 원격 저장소 전용 서버에서 관리되며 여러 사람이 함께 공유하기 위한 저장소
  • 로컬 저장소(Local Repository)
    • 내 PC에 파일이 저장되는 개인 전용 저장소

평소에는 내 PC의 로컬 저장소에서 작업하다가 작업 내용을 공개하고 싶을 때 원격 저장소에 업로드하면 공개가 가능하다.

원격 저장소에서 다른 사람이 작업한 파일을 로컬 저장소로 가져올 수도 있다.


Branch

브랜치(Branch)는 원격 저장소 내에서 많은 사람들이 동일한 소스코드를 함께 공유하고 다룰 때 각자 독립적인 작업 영역(저장소) 안에서 마음대로 소스코드를 변경할 수 있게 해준다.

  • 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행할 수 있게 해준다.

이렇게 분리된 작업 영역에서 변경된 내용은 나중에 원래의 버전과 비교해서 하나의 새로운 버전으로 병합(Merge) 할 수 있다.

 

브랜치 종류

통합 브랜치 (Integration Branch)

  • 배포될 소스 코드가 기록되는 브랜치
  • Git Repository를 생성하면 기본적으로 main 브랜치가 생성된다.
    • 주로 해당 프로젝트의 모든 기능이 정상적으로 작동하는 상태의 소스코드를 담아둔다.

피처 브랜치 (Feature Branch)

  • 기능 추가, 버그 수정과 같이 단위 작업을 위한 브랜치
  • 통합 브랜치로부터 만들어지며 피처 브랜치에서 하나의 작업이 완료되면 다시 통합 브랜치에 병합하는 방식으로 진행된다.

브랜치 명령어 모음

# 새로운 브랜치 생성
$ git branch 새로운 브랜치 이름

# 새로운 브랜치 생성 후 해당 브랜치로 전환
$ git switch -c 새로운 브랜치 이름
$ git checkout -b 새로운 브랜치 이름

# 브랜치 목록 확인
$ git branch

# 브랜치 목록과 각 브랜치의 최근 커밋 확인
$ git branch -v

# 브랜치 삭제
$ git branch -d 삭제할 브랜치 이름
$ git branch -D # 해당 명령어는 병합하지 않은 브랜치를 강제 삭제하는 방법입니다.

# 브랜치 전환
$ git switch 브랜치 이름
$ git checkout 브랜치 이름

# 브랜치 병합
master 브랜치로 dev 브랜치를 병합할 때 (master ← dev)
$ git checkout master
$ git merge dev

# 로그에 모든 브랜치를 그래프로 표현
$ git log --branches --graph --decorate

# 아직 commit 하지 않은 작업을 스택에 임시로 저장
$ git stash

Clone

누군가의 변경 이력이 적용된 원격 저장소가 있으면 통째로 복제해와 내 PC에서 작업할 수 있다.

원격 저장소를 복제하려면, 클론(Clone)을 해야한다.

  • 복제란, 원격 저장소의 내용을 통째로 다운로드 하는 것을 말한다.
  • 복제한 저장소를 다른 PC에서 로컬 저장소로 사용할 수 있게 된다.
이 때, 변경 이력도 함께 로컬 저장소에 복제되므로, 원격 저장소와 똑같이 이력을 참조하고 커밋을 진행할 수 있다.

fork

fork는 다른 사람의 원격 저장소에서 내가 어떤 부분을 수정하거나 추가 기능을 넣고 싶을 때 해당 저장소를 내 원격 저장소로 그대로 복제하는 기능이다.

fork한 저장소는 원본 저장소와 연결되어 있고, 원본 저장소에 새로운 커밋이 생기면 그대로 fork된 내 원격 저장소로 반영 될 수 있다.

이 때 fetch나 rebase의 과정이 필요하다.

그 후 원본 저장소에 내가 변경한 작업 내용을 적용하고 싶다면 해당 저장소에 Pull Request를 해야한다.

Pull Request가 원본 저장소의 관리자로부터 승인이 되면 내가 변경한 작업 내용이 커밋되고 병합되어 원본 저장소에 반영되게 된다.

Pull Request를 하기 전까지는 fork한 내 원격 저장소에만 변경 사항이 적용된다.


Commit

저장소에서 파일 및 폴더의 추가/변경 사항을 기록하려면 커밋(Commit)을 해야한다.

커밋을 하면 이전 커밋 상태부터 현재 상태까지의 변경 이력이 기록된 커밋이 만들어진다.

  • 커밋은 시간순으로 저장되며 최근 커밋부터 거슬러 올라가면 과거 변경 이력과 내용을 알 수 있다.

각 커밋에는 영문/숫자로 이루어진 40자리 고유 이름이 붙는다. 저장소에선 이 40자리 이름을 보고 각 커밋을 구분하고 선택한다.

  • 버그 수정, 기능 추가 등 특별한 의미가 있는 업데이트를 작업 별로 구분해서 각각 커밋하면, 나중에 이력을 보고 특정 변경 내용을 찾기 쉽다.

커밋은 이력을 남기는 중요한 작업이기 때문에 커밋을 할 땐 커밋 메시지를 필수로 입력해야한다.

  • 메시지는 명료하고 이해하기 쉽게 남겨야 본인 뿐만 아니라 다른 사람이 커밋 이력을 확인하기 쉽다.
Git에서 권장하는 메시지 형식
     1번째 줄 : 커밋 내의 변경 내용을 요약
     2번째 줄 : 빈 칸
     3번째 줄 : 변경한 이유

Push

로컬 저장소에서 변경된 이력을 원격 저장소에 공유하려면, 로컬 저장소의 변경 이력을 원격 저장소에 업로드 해야 한다.

이때 웹 상의 원격 저장소로 변경된 파일을 업로드 하는 것을 Git에서는 푸시(Push)라고 한다.

  • Push를 하면, 원격 저장소에 내 변경 이력이 업로드 되어, 원격 저장소와 로컬 저장소가 동일한 상태가 된다.

Pull

원격 저장소에서 여러 사람이 함께 작업하면 모두가 같은 원격 저장소에 푸시(Push)를 한다.

그럼 다른 사람이 원격 저장소에 올려놓은 변경 내용을 내 로컬 저장소에도 적용할 필요가 있다.

원격 저장소에서 로컬 저장소로 업데이트를 하려면 풀(Pull)을 실행한다.

  • Pull을 하면, 원격 저장소에서 최신 변경 이력을 다운로드하여 내 로컬 저장소에 그 내용을 적용한다.

Git 명령어 예시

Fork

다른 사람의 원격 저장소를 자신의 원격 저장소로 복사

# GitHub 웹페이지에서 fork 버튼 클릭

 

Clone

원격 저장소를 로컬 저장소로 복사

$ git clone https://github.com/user/repo.git

 

Status

현재 저장소의 상태를 표시하며 변경 사항이나 수정 사항을 보여줌

$ git status

 

Restore

파일이나 파일의 변경 사항을 복원

# 최근 커밋된 내용으로 복원
$ git restore file.txt

# 특정 버전의 내용으로 복원
$ git restore file.txt@version

 

Add

변경된 내용을 저장소에 추가하여 커밋할 준비

$ git add file.txt

 

Commit

저장소의 변경 사항을 기록하고 이를 설명하는 커밋 메시지를 추가

$ git commit -m "커밋 메세지"

 

Reset

저장소의 변경 사항을 취소하여 스테이징 영역에서 제거하거나 완전히 삭제

# 스테이징 영역에서 제거
$ git reset file.txt

# 커밋을 삭제하고 변경 내용을 모두 취소
$ git reset --hard HEAD^

 

Log

저장소의 커밋 기록을 표시

$ git log

 

Pull

원격 저장소에서 변경 사항을 로컬 저장소로 복사

$ git pull origin main

 

Push

로컬 저장소에서 변경 사항을 원격 저장소로 복사

$ git push origin main

 

Init

디렉토리에서 새로운 Git 저장소를 초기화

$ git init

 

Remote add

로컬 저장소에 새로운 원격 저장소를 추가

$ git remote add origin https://github.com/user/repo.git

 

Remote -v

로컬 저장소와 연결된 모든 원격 저장소를 나열

$ git remote -v