Git이란?
코딩을 접해본 사람이라면 알고 있는 Github는 Git을 사용한 서비스이다. Git은 로컬에서 동작하여 버전 관리를 해줌으로서 효율적인 협업이 가능하게 하는 시스템이며, Github는 클라우드 서버를 이용한다는 것이 다르다. 규모가 큰 곳의 경우 Git 서버를 자체적으로 구축하여 사용 하곤 한다.
Git의 특징
- 가지치기와 병합 : 여러 가지(branches)를 생성해 독립성을 유지하면서 여러 버전으로 개발이 가능하다.
- 가볍고 빠르다 : SVN(중앙 시스템)에 비해 깃은 로컬에 프로젝트가 존재하기에 네트워크 속도와 관계 없다.
- 분산작업 : 사용자들은 각각 복사된 프로젝트에서 독립된 작업이 가능하다. 이들은 모두 전체 코드를 가지고 개발에 집중할 수 있으며 Git에서는 통합관리자를 두어 역할을 분담 하며 코드를 병합하는데 집중한다.
- 데이터 보장 : 16진수 문자열의 commit id를 통해 파일 또는 구성이 완벽히 같다는 것을 알 수 있다.
- 오픈 소스
- Git을 사용한 호스팅 서비스 : Github, Atlassian Bitbucket, GitLab
라이프 사이클
Working directory의 파일을 git add하여 staging area로 이동시키고 git commit하여 repository로 이동한다.
수정된 상태의 파일은 modified에 위치하고 git add로 staged 상태로 만든다.
git commit으로 메시지와 함께 staging area의 파일을 repository에 저장한다.
명령어
저장소 생성
git init //폴더 경로에서 입력
Staging
Git add 파일명
Git add . //현재 폴더의 모든 파일
git status //Staging 파일들의 상태를 확인 가능
Commit
git commit -m "message" //git 저장소에 staging area의 모든 파일을 저장한다.
//옵션 m은 즉시 작성함을 의미한다.
//메시지를 입력하지 않으면 에디터가 켜진다.
git commit --amend //메시지를 수정할 수 있다.
git log //저장소 반영 내역 확인, commit id와 내용 확인 가능
git log
git log -p -2
//-p, --patch : 각 commit의 수정결과를 보여주는 diff와 같은 역할을 수행한다.
//-n : 상위 n개만 보여준다.
git log --stat
//--stat : 어떤 파일이 commit에서 수정되고 변경되었는지, 파일 내 라인이 추가, 삭제 되었는지 확인
git log --pretty=oneline
//각 commit을 한 줄로 출력
git log --graph
//commit간 연결된 관게를 아스키 그래프로 출력한다.
//branch에서 유용하게 사용된다.
git log -S function_name
//코드에서 추가되거나 제시된 내용 중 특정 테스트 검사
git diff
//commit 변경 사항 비교
git reset
git reset HEAD Readme.txt
//파일의 수정사항을 취소
가지치기(Branch)
Branch
독립적으로 어떤 작업을 진행하기 위한 영역이다.
- 메인 Branch : 배포할 수 있는 수준의 안정적인 Branch
- 토픽 Branch : 기능 추가나 버그 수정과 같은 단위 작업을 위한 Branch
생성
//생성
git branch feature:new
//현재 Branch 확인
git branch
//Branch 변경
git checkout fix:new
//snapshot 변경 (과거 파일 내용 확인)
git log --pretty=oneline //snapshot 해시 확인
git checkout d12345
Merge
Fast - forward
git checkout master
git merge feature:new
Branch에서만 수정이 이루어 지고 master로의 병합이 이루어지는 것을 Fast-forward라고 한다.
아래 처럼 이어지는 check point가 형성되어 master와 branch가 같은 c3을 가리키고 있다.
갈라지는 Brach
Branch와 master에서 파일을 동시에 수정하는 경우, 새로운 check point가 형성된다. Fast-forward와는 다르게 branch는 c3을 maste는 c5를 가리키고 있다.
git log --graph --all
//commit graph를 확인할 수 있다.
위 명령어로 check point를 확인할 수 있다.
* HEAD는 마지막 커밋을 가리키는 snapshot이다!
* snapshot은 staging 되어진 데이터들을 commit 명령으로 영구히 저장한 것을 부른다. HEAD 역시 snapshot으로 branch에서 현재 위치한 branch를 가리키는 포인터 역할을 함께 수행한다.
Branch 삭제
토픽 Branch는 병합 후 삭제하는 것이 일반적이다.
git branch -d feature:new
Conflict
Merge한 두 Branch에서 같은 파일을 변경하는 경우 발생한다. 일반적으로 VS Code에서는 에디터를 통해 쉽게 충돌된 부분을 확인할 수 있다. 그리고 master의 변화를 지속적으로 불러와 충돌이 발생하는 부분을 제거하는 것이 중요하며, master가 자주 변경되는 일이 없도록 하는 것이 기본이다.
//충돌된 파일이 어디인지 알 수 있다.
git status
원격 저장소 사용하기
github와 같은 원격 저장소에는 git repository와 동일한 구성이 있다. 이를 git clone으로 복사할 수 있으며, git remote로 로컬과 원격 저장소를 연결할 수 있다. origin은 원격 저장소의 단축 이름을 의미한다. 다른 이름으로도 지정할 수 있다.
//저장소 복사
git clone <url>
//연결
git remote add origin <url>
//연결된 원격 저장소 확인
git remote
git remote -v //이름과 url 함께 확인 가능
//이름 변경
git remote rename origin <name>
//저장소 삭제
git remote rn <name>
Pull & Fetch
원격 저장소에서 데이터를 가져오면서 병합하는 것을 pull이라고 하며 데이터를 가져오는 것만을 fetch라고 한다.
//로컬 데이터와 병합
git pull
Push
로컬 저장소에서 작업한 내용을 원격 저장소로 보낼 수 있다. 다른 사람이 먼저 push한 경우 반드시 pull가 선행되어야한다.
git push origin master
HEAD를 이용한 버전 관리
git reset --<option> HEAD
//--soft (default)
HEAD를 이전의 snapshot으로 이동시킬 수 있다. 기본적으로 예전 버전으로 돌아가 commit을 수정할 수 있다.
//--hard
//working directory에 존재하는 파일도 사라진다.
트래킹 브랜치
원격 저장소는 working directory가 존재하지 않으며 bare 저장소라고 부른다. 마찬가지로 master를 가지고 있다. 원격 저장소를 동기화 하게 되면 origin/master 브랜치가 생기게 되는데 이를 트래킹 브랜치라고 한다.
원격저장소의 브랜치가 어디에 위치하는지를 보여주고 checkout 할 수 없으며 commit 위치 또한 강제 변경이 불가능하다. git merge origin/master로 merge가 가능하다.
Git rebase
branch가 많아져서 history 정리가 필요한 상황에 사용한다.
현재 위치한 Branch의 commit 부터 대상이 되는 Branch의 공통된 부모 전까지의 commit을 master에 이어 붙인다.
Branch는 다른 곳에서 분기로 생성이 되는데, 그 분기점을 바꾸는 것이라고 보면 된다.
실무 product를 개발할 때 여러 개발자들의 merge에서 발생하는 conflict를 줄이고 history 관리를 쉽게 하기 위해
master로의 모든 merge 이전 rebase를 진행하는 룰이 있는 경우도 있다.
git checkout cat
git rebase master
conflict가 발생할 수 있는데, 해결 후 다음 과정을 진행할 수 있게 하는 명령어이다.
git rebase --continue
'Programming' 카테고리의 다른 글
[Swift] IOS 기본 이해하기 (0) | 2021.12.17 |
---|