버전 관리 시스템은 파일의 변화를 기록, 추후 특정 버전을 로드할 수 있는 시스템이다.
현재 버전 관리는 로컬 / 중앙집중형 / 분산형으로 나뉘며 Git은 분산형에 속하며, 변화의 히스토리를 각 개인이 관리하게 된다.
Git은 데이터를 파일 시스템 스냅샷(Snapshot)의 연속으로 취급, 파일이 달라지지 않으면 새로 저장하지 않고 이전 상태에 대한 링크(Link)만 저장한다.
Git은 파일을 아래 세 가지 상태로 관리한다.
- Committed : 데이터가 로컬 데이터베이스에 저장됨.
- Modified : 수정 파일이 로컬 데이터베이스에 커밋되지 않음.
- Staged : 현재 수정한 파일을 곧 커밋할 것이라는 상태
위 참고자료의 디렉토리와 영역에 대해서 알아보겠다.
- Git Directory : 다른 컴퓨터에 있는 저장소를 복제(clone)하거나 프로젝트 생성(init)시 만들어진다.작업중인 디스크에 있고 해당 디렉토리 안에 압축된 DB에서 파일을 불러와 Working Directory를 만든다.
- Working Directory : 프로젝트의 특정 버전을 체크아웃(checkout)한 것이다.
- Staging Area : Git Directory에 있으며 단순한 파일이다. 커밋할 파일에 대한 정보를 저장하며 인덱스(Index)라고도 한다.
git commit : 수정 파일 업로드
- ex)
위 사진과 같이 명령어 한번 입력시마다 커밋이 추가된다
git branch : branch 추가
- ex)
위 명령어로 branch 추가 후 커밋 실행 시, 별도의 분기로 커밋된다.
명령어 중 -f를 붙이면 특정 위치로 branch 이동도 가능하다.- ex) git branch -f branch_1;
git checkout : 지정한 위치로 'HEAD'가 이동한다.
- ex) git checkout main;
- ex) git checkout C2;
git merge : 선택된 branch로 다른 branch를 병합 후 커밋한다.
- ex)
(branch_1 선택 중)git merge main;
(main 선택 중)git merge branch_1;
git rebase : 선택된 branch의 내용을 복사하여 다른 branch로 병합 후 붙여넣는다.
- ex)
(branch_1 선택 중)git rebase main;
명령어 중 -i를 붙이면 추가로 branch 내 순서를 바꿔 이동도 가능하다.- ex)
git rebase -i main
git reset : 선택된 커밋을 삭제하고 이전으로 branch 이동
git revert : 선택된 커밋을 유지한 상태로 이전의 커밋을 추가
- ex) git reset C2
- ex) git revert C2
git cherry-pick: 입력한 커밋을 복사
- ex) git cherry-pick C2 C3
git tag : 입력할 태그(설명)을 지정된 커밋에 추가. 주로 버전명 표시에 사용함.
- ex) git tag ver1.5.35 C2
git clone : 원격 저장소를 로컬로 복제
- ex) git clone
git fetch : 원격 저장소의 내용을 로컬로 가져오는 것
- 로컬에 없는 커밋 다운로드
- 원격브랜치 업데이트
- 원격 브랜치 : 원격 저장소의 브랜치 추적
git pull : (git fetch + git merge)
- 원격 저장소의 내용을 로컬로 가져와 branch를 병합
git push : 로컬의 내용을 원격 저장소로 업로드
아래 그림과 같은 상황에서 git push 명령어를 입력해도 원격 저장소가 업데이트 되지 않는다.
부모 C1에서 로컬과 원격 각 C3, C2로 커밋되었기 때문인데, pull과 rebase를 통해 정리가 가능하다.
- ex) git pull --rebase; git push
- ex) git pull; git push
규모가 큰 개발팀의 경우 원격저장소의 main 브랜치가 잠겨있다.
따라서 main branch 커밋 후 push 명령어 입력시 다음과 같은 오류가 발생할 수 있다.
! [remote rejected] main -> main (TF402455: Pushes to this branch are not permitted; you must use a pull request to update this branch.)
일반적으로 이 경우 main은 잠겨있는 상태에서 branch를 생성하여 push 후 후 작업을 거쳐 main에 따로 병합한다.
아래 예제와 같은 경우 브랜치를 생성후 작업, 커밋 후 push하면 된다.
- ex)
clene 진행시 원격 저장소에 저장된 branch에 따라 로컬에 원격 브랜치가 생성되며, 새 브랜치를 생성해서 원격의 branch를 추적하도록 할 수 있다.
- ex) git checkout -b branch_1 origin/main
: branch_1의 이름을 가진 브랜치를 생성하고 원격 main을 추적한다.
로컬의 커밋들을 원격의 특정 브랜치로 push 할때 사용한다.
- ex) git push origin main^:foo; git push origin foo:main;
원격의 커밋을 로컬의 특정 브랜치로 fetch할때 사용한다.
- ex) git fetch origin main^:foo; git fetch origin foo:main;
원격의 커밋을 로컬의 특정 브랜치로 pull할때 사용한다.
- ex) git pull origin bar:foo; git pull origin main:side;
git config : 설정
- ex) git config --local user.name "OOO"
- ex) git config --local user.email "OOO"
git add : 수정 된 파일을 staged 영역에 추가
- ex) git add 파일명.(확장자)