Version Control System(VCS) 중 하나로, 소스 코드의 버전을 효과적으로 관리하기 위해 개발된 분산형 버전 관리 시스템(Distributed Version Control, DVC)이다.
git 이전의 방식은 delta-based version control로 버전마다 변경된 내용만을 가지고 있었다. 이러한 방식은 버전을 변경할 때 개선된 부분을 찾고 적용하는데 시간이 많이 걸리는 단점이 존재했다. git은 이러한 문제점을 해결하기 위해 리눅스에서 개발했다. 전체 프로젝트를 스냅샷(특정 시간에 데이터 저장 장치의 상태를 별도의 파일이나 이미지로 저장하는 기술)하는 방식을 사용하여 버전 또는 브랜치들 사이의 이동이 자유롭고 빠르다는 특징이 있다. 이는 버전마다 업데이트 되지 않은 내용들은 이전 버전의 링크를 가리키기 때문에 가볍다.
git은 4개의 영역으로 구분되어 사용된다.
크게 Working Directory, Staging Area, Local Repository는 개발자 개인의 PC 내부에서 이루어지며, Remote Repository는 Remote Server에서 이루어진다. 세부 내용은 다음과 같다.
git은 파일들이 어떤 상태인지 분류하여 관리한다.
추적 관리 여부에 따라 두 가지 상태(Tracked, Untracked)로 나눌 수 있다. Tracked는 반대로 해당 파일을 추적 및 관리하는 상태를 의미하며, Untracked는 git이 해당 파일을 추적 및 관리하지 않는 상태를 의미한다. Tracked 상태로 만들기 위해서는 최소 한 번 git add 명령어 또는 git commit 명령어를 통해 변경 사항을 업로드해야 한다. Untracked 상태의 파일은 수정 또는 삭제가 일어나도 복구가 되지 않는 점을 주의해야 한다.
또한, 파일의 변경 여부에 따라 두 가지 상태(Modified, Unmodified)로 나눌 수 있다. 이는 Tracked 상태인 파일의 수정 여부에 따라 결정된다.
브랜치란 독립적인 작업 영역으로, 필요에 의해 만들어지는 각 branch는 다른 branch의 영향을 받지 않기 때문에 각 개발자가 작업을 동시에 할 수 있다. 이후 개발 완료된 내용은 기존 브랜치와 병합함으로써 하나의 브랜치로 변경 사항을 적용 및 관리할 수 있다.
주의 사항으로 각 작업자가 같은 파일의 같은 부분을 동시에 수정하여 병합하는 경우 충돌이 발생한다. 이때 오류가 발생한 파일 내용은 직접 수정한 후 commit 해야 문제 없이 변경 사항을 적용할 수 있다.
오류가 발생하는 부분은 해당 파일에서 ===== 기준 위(A에서 B)는 현재 branch의 내용, 아래(B에서 C)는 병합할 branch의 내용으로 구분되어 나타난다.
HEAD
현재 브랜치의 가장 최근 커밋
Tag
커밋을 참조하기 쉽도록 하는 쉬운 이름
git은 정해진 규칙 없이 브랜치를 생성해 작업하다 보면 히스토리가 복잡해지고 추적이 용이하지 못하게 된다. 이를 해결하기 위해 git을 사용하는 전략이 필요하며 가장 대표적인 전략으로는 Git Flow가 있다.
Vincent Driessen 이라는 개발자가 만든 전략이다. 크게 브랜치를 5가지로 나누어 사용하며 각 브랜치의 역할은 다음과 같다.
master와 develop 브랜치는 계속 유지되는 성격을 지니며, 나머지 브랜치는 master 또는 develop에 병합 후 삭제되는 이벤트 성의 브랜치이다.
Ubuntu 기준
sudo apt-get install git
git --version
git init
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주소>
git remote는 원격 저장소를 설정하는 명령어이다.
git remote add <name> <url>
git status 명령어는 프로젝트 내의 파일들의 상태를 확인할 수 있는 명령어이다.
git status
git add 명령어는 특정 파일을 staging area에 등록하는 명령어이다.
staging area에 등록하는 행위를 ‘스테이징’이라고도 한다.
git add <file>
git add <file> <file> (다수의 파일을 한번에 등록 가능)
git에 추가하고 싶지 않은 파일을 gitignore이란 폴더로 이동하여 제외시키는 명령어
echo *.log(해당 파일의 확장자 명) > .gitignore
git commit 명령어는 변경 사항을 local repository에 등록하는 명령어이다.
변경 사항에 대한 간략한 설명을 확인할 수 있는 commit message를 입력할 수 있다.
git commit
git commit -m "message" (-m : 메세지 포함)
git commit -am "message" (-a : staging area와 directory 내 모든 파일 포함)
git diff 명령어는 어떤 파일의 내용이 수정되었는지 확인하는 명령어이다.
git diff (working directory의 내용만 확인 가능)
git diff -staged or -cached (staging area에 있는 내용 확인 가능)
git log 명령어는 저장소의 변경 이력을 확인하는 명령어이다.
git log
git log --graph --oneline (선으로 된 그림 형태로 출력)
git log --decorate (태그 정보를 포함한 이력 출력)
git push 명령어는 commit을 통해 저장된 로컬 저장소의 변경 이력을 원격 저장소에 등록하는 명령어이다.
git push <repository> <refspec>
<repository>는 원격 저장소의 주소
<refspec>은 push할 브랜치
git clone 명령어는 원격 저장소를 내 로컬 저장소에 복제하는 명령어이다.
git clone <repository> <directory>
<directory>는 복제 대상의 폴더명
git pull 명령어는 원격 저장소의 변경 사항을 확인하고 내 로컬 저장소에 적용하는 명령어이다.
git pull <repository> <refspec>
git fetch 명령어는 원격 저장소의 변경 사항을 확인만 하는 명령어이다.
git fetch
git merge 명령어는 변경 내용의 이력을 남기면서 다른 브랜치에 현재 브랜치를 병합하는 명령어이다.
git merge <commit>
git rebase 명령어는 변경 내용의 이력을 변경하며 다른 브랜치에 현재 브랜치를 병합하는 명령어이다.
히스토리를 단순하게 만들 수 있다는 장점이 있다.
git rebase <commit>
git checkout 명령어는 현재 브랜치에서 다른 브랜치로 전환하는 명령어이다.
git checkout <branch>
git checkout -b <branch> (-b : 생성과 전환을 동시에)
git checkout -t <origin/branch> (-t : 원격 저장소의 브랜치를 같은 이름으로 가져오기)
git checkout . (변경사항 폐기)
git branch 명령어는 새 브랜치를 만드는 명령어이다.
git branch <branchname>
git branch -d <branchname> (-d : 기존 브랜치를 삭제)
git cherry-pick 명령어는 다른 브랜치에서 지정한 커밋을 복사하여 현재 브랜치로 가져오는 명령어이다.
특정 브랜치에 잘못 추가한 커밋을 다른 브랜치로 옮기거나 현재 브랜치에도 추가하고 싶을 때 사용한다.
git cherry-pick <commit>
git stash 명령어는 파일의 변경 내용을 일시적으로 기록하는 명령어이다.
git stash
git stash list (stash한 목록 확인)
git stash apply <stashname> (기록한 작업 가져오기)
git stash drop <stashname> (기록한 작업 제거하기)
git submodule 명령어는 원격 저장소 내에 존재하는 또 다른 하위 저장소를 관리하는 명령어이다.
git submodule update --remote (서브 모듈의 최신 커밋 가져오기)
원격 저장소에 push하지 않은 commit 취소 또는 staged file 취소
git reset --hard HEAD~1 (최신 commit 취소)
git reset (staged file 취소)
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