소스코드의 version control system(VCS). 소스코드의 변경 내역을 각각의 version으로 저장하여 관리한다. 코드에 문제가 생겨 이전 상태로 되돌려야 하는 경우 하는 경우, Git을 이용하면 손쉽게 그 내역을 확인하고 작업을 다시 진행할 수 있다.
동시에 Git은 협업시스템 이기도 하다. 많은 사람들이 동시에 작업하는 하나의 프로젝트의 수정 사항들을 체계적으로 관리할 수 있게 해준다.
Github은 단순히 git을 인터넷에서 사용할 수 있게 호스팅 서버를 제공해주는 서비스라고 불 수 있다. 클라우드 기반에 배포되고, 많은 사람들이 코드베이스(repository)에 접근하여 협업할 수 있게 해준다.
물론 github을 사용하지 않고, 각각의 회사가 직접 서버를 운영하여 VCS을 운영할 수 있다. 하지만. github이 이미 이러한 서비스를 제공하고 있고, 비용도 저렴하므로 왠만하면 다 github을 사용하는 추세이다.
파일은 항상 다음의 3개 상태중 하나의 상태에 있다
git add
한 상태)git diff
, git status
등의 명령어를 통하여 수정한 내용을 잘 확인하고 commit하자.git의 내역은 tree형태로 되어있고, branch 기반으로 개발이 이루어진다. 단순히 변경사항만 저장하는 것이 아니라, 모든 파일을 snapshot으로 저장한다. 만약 파일에 아무런 수정이 이루어지지 않았다면, 이 파일은 저장되지 않고 이전상태의 파일에 대한 링크만 저장된다.
Git의 branch 모델에서 기준이 되는 브랜치는 master branch 이다.각 개발자는 master branch를 checkout 먼저 하고, master branch로 부터 자신만의 branch를 만든다.브랜치 기반으로 개발을 한 후 개발이 완료가 되고 commit을 하면 자신의 feature branch를 다시 master branch로 합한다. 이렇게 합하는 과정을 merge 한다고 한다. (보통 각각의 브랜치는 하나의 기능에 관한 코드이므로, feature branch라고 부른다)
branch에서 각자 작업을 함으로써, 만약 자신이 작성한 코드에 오류가 있을 때도, 다른 사람의 코드에까지 영향을 끼치지 않으므로 효율적으로 작업할 수가 있다.
Git을 사용하기 전에, local과 remote 환경에 대해서 이해할 필요가 있다. add, commit, merge 등의 거의 모든 작업은 로컬 환경에서 이루어진다. 로컬 환경에서 리모트 환경에 push 명령을 했을때만, 수정한 내용이 비로소 리모트 환경에 반영된다.
$ git init
: 프로젝트(소스코드가 있는 디렉토리)를 git repo로 만드는 명령어. 소스코드가 저장되어 있는 디렉토리에서 해당 명령어를 실행하여야 한다.
$ git add 디렉토리위치
: modified -> staged 로 파일의 상태를 옮긴다.
$ git clone
: github과 같은 중앙서버에서 소스코드를 통째로 local환경에 가져오는 작업을 뜻한다
git clone is basically a combination of:
git init (create the local repository)
git remote add (add the URL to that repository)
git fetch (fetch all branches from that URL to your local repository)
git checkout (create all the files of the main branch in your working tree)
$ git push origin <브랜치명>
: commit한 소스코드를 중앙서버(github)에 올리는 명령어. push할때 저절로 pull도 진행된다. (origin: remote설정했을때만)
$ git pull
: 최신 소스코드를 중앙서버에서 다운받는 명령어. 복제가 아니므로, clone과 다르다. pull과정에서 conflict이 일어날 수 있다.
같은 라인의 코드가 중복으로 수정될 경우, git은 어떤 코드를 선택해야 하는지 알 수 없다. 이 때, conflict가 발생한다. 해결 방법은 스스로 어느 수정부분을 택할지 선택하고 다시 commit 해야한다.
한 브랜치를 너무 오래 붙잡고 있을때 자주 일어나며 중간 중간에 pull을 해주는것이 좋다.
pull이 로컬에서 이루어지므로, conflict도 로컬 환경에서 일어난다.
$ git merge
: pull한 최신 버젼의 마스터 브랜치와 내가 수정한 feature 브랜치를 합치는 명령어.
$ git fetch
: remote repo에 있는 모든 브랜치를 로컬 환경에 불러온다.
$ git branch <브랜치명>
: branch 생성 명령어. 브랜치명은 규칙성 있게 만들기. (위코드의 경우 feature/<feature이름>
$ git branch
: 모든 브랜치를 쉘에 표시하는 명령어
$ git checkout <브랜치명>
: 브랜치 이동 명령어
$ git reset
: 특정 commit으로 되돌아갈 수 있는데, 되돌린 버전 이후의 버전들은 히스토리에서 삭제된다. (거의 대부분의 경우에 망쳐도 복구할 수 있다.)
내용출처: wecode private stackoverflow의 은우님이 작성하신 글을 보고 정리한 내용입니다.