[Git] Git이란 무엇인가?!

minidoo·2021년 3월 5일
1

Git

목록 보기
1/3
post-thumbnail

Git ?

버전 관리 ( 형상 관리 )

파일 변화를 시간에 따라 기록하고, 이후 특정 시점의 버전을 다시 꺼내올 수 있는 시스템
버전 관리 시스템 ( VCS, Version Control System ) : 각 파일을 이전 상태로 되돌릴 수 있음
"Commit이 하나의 버전" made by Linus Torvalds ( 리누스 토르발스 )

로컬 버전 관리 (VCS)

(로컬) 데이터베이스를 사용해서 파일의 변경 정보를 관리
압축해서 관리되기 때문에 비효율적

중앙집중식 버전 관리 (CVCS)

파일을 관리하는 서버가 별도로 있고 클라이언트가 중앙 서버에서 파일을 받아서 사용 (Checkout)
중앙 서버에서 문제가 발생하면 다른 사람과 협업할 수 없으며, 백업할 방법도 없음 (오프라인 사용 불가)

분산 버전 관리 (DVCS)

단순히 파일의 마지막 스냅샷을 Checkout 하는 것이 아니라, 저장소를 히스토리와 더불어 전부 복제
서버에 문제가 생기면 이 복제물로 다시 작업 시작 가능 (서버와 로컬 모두 사용 가능)


DVCS ?

Git (DVCS) 의 특징

  1. 데이터를 파일 시스템 스냅샷(Snapshot)의 연속으로 취급하고 크기가 작음
  2. 성능을 위해 파일을 새로 저장하지 않고 이전 상태의 파일에 대한 링크만 저장
  3. 거의 모든 명령을 로컬에서 실행 (로컬 파일과 데이터만 사용)
  4. 데이터를 저장하기 전에 항상 체크섬을 구하고 체크섬으로 데이터를 관리 ( 체크섬: 가장 Atomic한 데이터 단위 )

Git (DVCS) 와 CVCS의 차이

Git (DVCS)CVCS
로컬 PC에서 Commit : 로컬 저장소에 반영
로컬 저장소에서 Push : 원격 저장소에 반영
로컬 PC에서 Commit : 중앙 저장소에 반영
Commit → Fetch → Merge (Pull: Fetch + Merge) → Push모든 사람이 중앙 서버에 있는 같은 자료를
받아오고 Commit하는 순간 모든 사람에게 공유됨

Git Commands

1. git config

Git의 사용 환경에 대한 설정

우선 순위 : 프로젝트(config) > 전역(global) > 시스템(system)

[시스템 설정]
$ git config --system

[전역 설정]
$ git config --global

[프로젝트 설정]
$ git config

사용자 정보

주로 --global로 설정

$ git config --global user.name "사용자 이름"
$ git config --global user.email "사용자 이메일"

core.autocrlf

OS마다 Line Ending 처리하는 방법 다름
띄어쓰기, 줄바꿈 등의 변경은 수정 사항으로 적용되지 않도록 설정

[기본]
$ git config --global core.autocrlf false

[Window]
$ git config --global core.autocrlf true

[MAC]
$ git config --global core.autocrlf input

core.editor

커밋, 태그 메시지 작성 등 git을 통한 편집에 사용할 에디터 설정
기본은 vi로 실행

[ex]
$ git config --global core.editor emacs

2. Create Project

1) Remote(원격) 저장소 없이 로컬에 생성 (init)

$ git init
$ git remote add origin <git-server-address>
$ git push -u origin main

git init : .git 폴더를 생성, git을 사용하기 위한 세팅이 완료

git remote add origin <git-server-address> : remote 저장소와 연결

git push -u origin main : 원격 저장소에 반영

.gitignore

git에 관리되지 않을 파일(untracking) 리스트를 관리하는 파일

프로젝트 생성 후 파일을 stage에 올리기(git add) 전에 .gitignore 파일에 관리되지 않을 파일을 적어두었는지 확인

git repository에 올라와 있는 파일을 .gitignore에 추가하고자 할 때, 이미 올라와 있는 파일은 현재 tracking되고 있기 때문에 이 tracking을 제거해야 한다.

1. .gitignore 파일 수정
2. git command
$ git rm -r --cached .	// cache에 기록된 tracking 중인 파일 리스트 삭제
$ git add .
$ git commit -m "refactor:remove ignored file"
$ git push origin branch

2) Remote(원격) 저장소를 통한 로컬에 생성 (clone)

$ git clone <remote repository url>

해당 Repository의 default branch를 기준으로 새로운 신규 브런치 생성 후 작업하는 습관 가지기 😉

3. Snapshotting

Git의 핵심 기능으로서, 파일들의 스냅샷을 관리하는 명령어들

Working Directory의 파일은 크게 Tracked(관리 대상)와 Untracked(관리 대상 아님)으로 나뉜다.

Tracked 파일은 이미 스냅샷에 포함돼 있는 파일로 Unmodified(수정하지 않음), Modified(수정함), Staged(커밋하면 저장소에 기록) 상태 중 하나이다.

git add . 를 하면 Untracked 상태에서 Tracked 상태(Staging 상태)로 바뀐다. git commit 를 하면 Staged 상태가 되고 (Unmodified), 이 상태에서 파일을 수정하면 Modified 상태가 된다.

$ git add <파일>

변경 파일들 또는 신규 추가된 파일을 Staging 상태로 변경

$ git commit

Staged 상태의 파일들을 포함해 스냅을 생성

$ git reset <옵션> <돌아갈 커밋 ID>

돌아가려는 커밋으로 repository를 재설정 후 옵션에 따른 파일 처리

  • --hard : 돌아가려는 이력의 이후 커밋 내용을 모두 삭제
  • --soft : 돌아가려 했던 이력으로 되돌아 갔지만, 이후 내용이 삭제되지 않고 남아 있는 상태 (commit 하기 전 상태)
  • --mixed : 돌아가려 했던 이력으로 되돌아 갔지만, 이후 내용이 삭제되지 않고 남아 있는 상태 (add 하기 전 상태)

$ git status

파일의 상태 확인

4. Branch & Merge

$ git branch <브런치명>

새로운 브런치 생성

$ git checkout <브런치 & 태그>

지정된 브런치 또는 태그로 변경

$ git merge <작업 브런치>

다른 브런치의 작업 내역(commit)을 합침

  • default : 작업 브런치의 히스토리 공유
  • --squash : 작업 내역(commit)을 하나의 커밋으로 합쳐 새로운 commit 생성
    ( ex. 5개의 commit 내역을 1개의 새로운 commit으로 합침 )

$ git tag

현재의 스냅상태를 tag로 저장 ( branch와 함께 tag로도 저장 )

[tag로 저장하기]
$ git tag <태그명> <대상 커밋의 체크섬>

[tag 확인]
$ git show <태그명>

$ git stash

아직 마무리하지 않은 작업을 스택에 잠시 저장할 수 있도록 하는 명령어
( 미완료 작업을 commit하지 않고 나중에 다시 꺼내와 작업할 수 있음 )

[하던 작업 임시로 저장하기]
$ git stash

[stash 목록 확인하기]
$ git stash list

[stash 적용하기]
$ git stash apply <stash 이름>
  
[stash 제거하기]
$ git stash drop <stash 이름> 

5. Patching

$ git revert [commit hash]

특정 커밋을 되돌린다.

* git reset과 git revert 차이 *
  
  ABCD
  
  위와 같이 커밋 로그가 있고 원격 저장소에도 push된 상태라 가정한다.
  B 커밋으로 reset --hard를 하면 C, D 커밋은 히스토리에서 사라진다.
  로컬 저장소에서는 C, D 커밋이 사라졌지만 원격 저장소에는 C, D가 남아있다.
  이 상태로 원격 저장소에 push를 하면 충돌이 발생한다.
  
  따라서 이때 사용하는 것이 git revert이다.
  이전 커밋 내역을 그대로 남겨둔 채 새로운 커밋을 생성한다.
  
  ABCDD2C2
  
  위와 같이 이전 C, D 커밋 내역을 그대로 남겨두면서 revert 커밋을 추가한다.
  따라서 원격 저장소에 push해도 충돌이 발생하지 않는다.
  
  TIP) 다른 사람과 공유하는 브런치의 경우 git revert, 혼자 작업하는 브런치의 경우 git reset

$ git rebase [브런치]

작업하면서 남겼던 commit 중 불필요한 것들은 생략시키고 필요한 commit만 남겨서 master에 병합 ( 다음 게시글 )

6. Sharing (Remote)

$ git fetch

원격 저장소의 내용을 확인만 하고 로컬 데이터와 병합하지 않을 때 사용 ( merge 하지 않음 )

$ git pull

원격 저장소의 변경된 데이터를 가져옴

( git pull = git fetch + git merge )

$ git push

로컬 저장소에 변경된 이력(commit)을 원격 저장소로 업로드

$ git push origin master
리모트 저장소에 push 하기

$ git remote

원격 저장소 관련 설정을 위한 명령어

$ git remote -v
등록된 저장소 이름과 URL 표시
ex) origin https://github.com/minidoo/ex.git (fetch)

$ git remote add <리모트 이름> <경로>
새 리모트를 추가
ex) git remote add origin https://github.com/minidoo/ex.git

$ git remote show <리모트 이름>
모든 리모트 경로의 브런치와 정보를 표시
ex) git remote show origin

$ git remote rm(remove) <리모트 이름>
리모트 경로를 제거
ex) git remote rm origin

Thanks to 팀장님 🙂🙃🙂

0개의 댓글