Networks/Git

SK networks AI Camp - 버전관리 시스템&Git

코딩하는 Español되기 2024. 7. 27. 08:00

버전 관리 시스템

: 문서나 설계도, 소스 코드 등의 변경점을 관리해주는 소프트웨어

○ 버전 관리 필요성

  : 파일을 편집할 때마다 매번 복사하는 일은 번거롭고 실수할 가능성 多

 

○ 버전 관리 장점

    ● 변경점 관리 : 어떤 내용을 누가 작성해서 어느 시점에 들어갔는지 확인 가능
    ● 버전 관리 : 특정 시점에 Tag를 달아 버전 표시, branch를 통해 동시에 여러 버전 개발 가능
    ● 백업&복구 : 잘못될 경우 다시 특정 시점으로 돌아갈 수 있고, 복구도 가능

버전 관리 종류

○ 로컬 버전 관리

    ● 버전관리를 위해 디렉토리로 파일을 복사하는 방법을 사용
    ● 간단하므로 자주 사용 But 뭔가 잘못되기 쉽고, 파일을 잘못 수정/복사/삭제 가능

 

○ 중앙 집중식 버전 관리

    ● 프로젝트 진행 시 함께 작업하는 경우 多. 이럴 때 발생하는 문제 해결을 위해 CVCS(중앙집중식 VCS) 사용

    ● 몇가지 치명적 결점 존재 : 중앙서버에 문제가 발생할 경우

 

○ 분산 버전 관리 시스템

    ● Git, Mecurial, Bazaar, Darcs 같은 DVCS에서의 클라이언트는 단순히 파일의 마지막 스냅샷을 Checkout 하지 않음

    ● 저장소를 히스토리와 더불어 전부 복제, 서버에 문제 발생 시 복제물로 다시 작업 가능

    ● 클라이언트 중에서 아무거나 골라도 서버 복원 가능(Clone은 모든 데이터를 가진 진정한 백업)


Github 저장소

: 원격 저장소와 로컬 저장소 두 종류의 저장소를 제공

 - 원격 저장소(Remote Repository) : 원격 저장소 전용 서버에서 관리되며 여러 사람이 함께 공유하기 위한 저장소

 - 로컬 저장소(Local Repository) : 내 PC에 파일이 저장되는 개인 전용 저장소 

Git 상태

Committed : 데이터가 로컬 DB에 안전하게 저장됐다는 것 

Modified : 수정한 파일을 아직 로컬 DB에 커밋하지 않은 것

Staged :  현재 수정한 파일을 곧 커밋할 것이라고 표시한 상태

○ 다른 버전 관리 시스템과 달리, Git은 커밋 이전에 스테이징(Stage area) or 인덱스라 불리는 상태를 가짐

   이 상태에서 커밋 내역을 검토하고 특정 파일만 먼저 커밋하고 일부 파일은 나중에 커밋 가능

브랜치(Branch)

○ 여러 개발자들이 동시에 다양한 작업을 할 수 있게 만들어 주는 기능

각자 독립적인 저장소 안에서 마음대로 코드 수정 가능

○ 이렇게 분리된 작업 영역에서 변경된 내용은 나중에 원래 버전과 비교해서 하나의 새로운 버전으로 만들어 낼 수 있음

○ 이렇게 만들어진 브랜치는 다른 브랜치와 병합(Merge)함으로, 작업 내용을 다시 새로운 하나의 브랜치로 모으기 가능

브랜치 전략

Git Flow의 특징: 브랜치가 5가지로 나뉜다는 특징

○ main(master) : 서비스를 직접 배포하는 역할

○ feature(기능) : 각 기능 별 개발 브랜치

○ develop(개발) : feature에서 개발된 내용이 저장되는 브랜치

○ release(배포) : 배포하기전 QA(품질 검사)하기 위한 브랜치

○ hotfix(빨리 고치기) : main 브랜치로 배포를 하고 나서 버그를 생겼을 때 빨리 고치기 위한 브랜치


Git 기본 명령어

git init : (로컬)저장소 생성

git status : 현재 상태 확인

git add : 현재 상태 추적

git commit : 현재 상태 저장

git log : 커밋 히스토리 조회

git reset : 이전 상태로(이력제거)

git revert : 이전 상태로(이력 유지)


branch 사용법

○ git switch -c -브랜치 생성

    - 새 브랜치를 만들 때, 현재 브렌치를 기준으로 만들기 때문에 현재 브랜치 확인이 중요!!!

  ● 작업

    - 브랜치 확인 → 새로운 브랜치 생성

git status
git switch -c add-color

* git switch의 -c 옵션은 브랜치 생성과 이동을 한번에 수행하여 아래의 명령어와 동일

git branch add-color
git switch add-color

○ add-color 브랜치에서 작업

  ● 작업

    - green, blue 파일 추가

    - 전체 변경사항을 인덱스에 추가

    - 커밋 작성

touch green blue #1
echo "green1" >> green
echo "blue1" >> blue
git add -A #2
git commit -m "add green, blue" #3

○ git switch - 브랜치 변경

  ● add-color 브랜치에서 진행한 작업이 기존 main 브랜치와 독립적인 것을 확인

  ● 작업

    - 현재(add-color) 파일 확인

    - 브랜치 리스트 확인

    - master 브랜치로 이동

    - 파일 다시 확인 ==> green, blue 파일이 없음(= main 브랜치와 독립적임)

ls #1
git branch # 2. : 나가기; q
git switch master # 3
ls #4

○ update-red 브랜치 추가

  ● 작업

    - update-red 브랜치 생성 후 이동

    - red 파일 내용 변경

    - 전체 변경사항을 인덱스에 추가

    - 커밋 작성

git switch -c update-red #1
echo "red11" >> red #2
git add -A #3
git commit -m "update red" #4

○ 현재 브랜치 상황

  ● master : red, orange, yellow

  ● add-color : red, orange, yellow, green, blue

  ● update-red : red(변경), orange, yellow

 

○ git merge - 브랜치 합치기

  ● 작업

    - master 브랜치로 이동

    - add-color 브랜치 수정사항을 master 브랜치로 merge

    - add-color에서 작성한 커밋로그가 master 브랜치에도 추가된 것을 확인

    - master 브랜치에서 green, blue 파일이 추가된 것을 확인

git switch master #1
git merge add-color #2
git log #3
ls #4

○ 결과 정리

  ● add-color에서 작업한 내용(파일들)이 master 브랜치로 머지

  ● master 브랜치에 green, blue파일 추가된 것을 확인

  ● add-color에서 작성한 커밋 로그가 master 브랜치에도 추가된 것을 확인

 

○ conflict - 충돌 해결

update-red 브랜치에서 수정한 red 파일을 master 브랜치에서도 수정하여 충돌상황을 생성해보기

  ● 작업

    - master 브랜치에서 red 파일 수정

    - 전체 변경 사항을 인덱스에 추가

    - 커밋 작성

    - update-red 브랜치를 master 브랜치로 머지

   ==> 충돌 발생

echo "red111" >> red
git add -A
git commit -m "update red111"
git merge update-red # 충돌!

○ 충돌내용 확인

  ● red 파일 확인(충돌내용 확인!)

cat red

○ 충돌 해결

    - red파일에서 필요없는 내용 모두 삭제(수정)

    - 전체 변경사항을 인덱스에 추가

    - 커밋 진행

      ==> vi 창이 열리면, ecs 누르고 :x를 입력 후 엔터

git add -A
git commit

.gitignore

○ 프로젝트 작업시 로컬 환경의 정보나 빌드 정보 등 원격 저장소에 관리하지 말아야되는 파일에 대해 지정

   원격 저장소에 실수로 올라가지 않도록 관리하는 파일

○ 정의한 정보들에 해당하는 파일에 대해 git track하지 않도록 설정하는 역할

○ 사용 규칙

    ● '#'로 시작하는 라인은 무시

    ● 슬래시(/)로 시작하면 하위 디렉터리에 적용되지 않는다.

    ● 디렉터리는 슬래시(/)를 끝에 사용하는 것으로 표현

    ● 느낌표(!)로 시작하는 패턴의 파일은 무시 안됨

○ 예시

// 1. '파일명'으로 제외 (* 경로 상관없이 지정한 파일명으로 모두 제외 가능)
ignoreFileName.js

// 2. 특정 '파일'만 제외 (* 현재 기준을 .ignore파일이 있는 경로라고 생각)
src/ignoreFileName.js

// 3. 특정 '디렉토리' 기준 이하 파일들 제외
node_module/

// 4. 특정 디렉토리 하위의 특정 '확장자' 제외
src/*.txt

// 5. 특정 디렉토리 하위의 그 하위의 특정 '확장자' 제외
src/**/*.txt

// 6. 특정 '확장자' 제외 
.txt

// 7. 4번 특정 '확장자'에서 일부 제외 할 파일 
!manual.txt

○ .gitignore 파일 생성

  ● 직접 파일 생성

    1. VSCode 폴더의 최상위에서 새파일 생성

    2. 파일이름을 .gitignore 라고 지정된 이름으로 생성

  ● 터미널 명령어

    - 생성하려는 Repository의 최상위에서 아래의 명령어 입력

touch .gitignore

○ gitignore 필요한 내용 사이트

https://www.toptal.com/developers/gitignore

 

gitignore.io

Create useful .gitignore files for your project

www.toptal.com

○ gitignore가 작동되지 않을 때 대처법

git rm -r --cached .
git add .

○ commit/push된 파일 제외 방법

git rm .env --cached
git add .
git commit -m "remove .env file from git"
git push

○ .gitignore에서 제외할 파일

  : "!" 기호를 파일명 앞에 적어두면 해당 파일은 제외되지 않음

# *.keystore
!debug.keystore
my-release-key.keystore