git 과 github는 VCS(Version Control System) 인데
version은 소스코드(sourcecode) 파일의 version을 의미한다.
소스코드(sourcecode) 의 변경사항 내역을 관리하는 시스템 이라는 의미가 VCS 입니다. 소스코드 란, 코드 파일들을 의미합니다velog.py
, velog.js
같은 파일들을 말합니다.
코드의 변경 사항 내역들을 기록하고 관리하기 위해서 사용합니다. 하지만 왜 그 많은 변경 사항들을 기록하고 관리하려고 사용을 하는지 에 대한 의문이 들꺼라 생각합니다.
사람도 실수를 하는데 그 사람이 코딩하는 코드파일이 문제가 없을꺼라 보장할수없습니다. 중간중간 문제가 생길것이고, 또 제일 최신코드에 문제가 생길수도있습니다. 그러면 문제가 생겼을때 이전 코드로 되돌리고 싶은데 이미 최신코드만 가지고있는 상태에선 그럴수가없습니다.
또한 코드 버전 관리는 팀단위로 개발을 할때 엄청난 효율을 발생시킵니다. 혼자가 아닌 여러명이서 동시에 개발을 진행할때 누가 어떠한 코드를 언제 어떻게 수정했는지 등의 내역들을 확인할수있고 관리 할수있다는것이 굉장히 중요한 사항입니다. 종종 동일한 파일에 여러 개발자가 코드를 수정하는 경우가 있음으로 각 수정 사항들을 체계적으로 관리할 수 있어야 합니다.
Git 은 git을 사용하여 자신의 로컬에서 소스코드를 관리(add, commit, merge, 등) 을 하는 작업을 합니다.
Github는 github에서는 다른사람과 공유 나 백업을 할수있는 웹사이트이고, git을 사용하여 만들어진 소스코드를 올리고 그 소스코드를 저장하는 하나의 중앙서버라 생각하면된다.
git 을 사용하여 VCS를 할때 파일은 3개의 상태중 하나의 상태에 존재하게 된다.
git init
새로운 repository 를 생성하기 위해 사용합니다.
올리고 싶은 폴더나 새로운 폴더를 하나 만들고, 그 안의 폴더로 터미널에서 이동하여
git init 를 입력하면 그 폴더는 새로운 하나의 git 저장소가 만들어집니다.
git clone
클론의 의미는 복제 라는 의미입니다. 즉, repository 를 복제할때 사용합니다.
git clone /로컬/저장소/경로
원격 서버의 저장소를 복제할수도있습니다.
git clone 사용자명@호스트:/원격/저장소/경로
git add
, git commit
올리고 싶은 파일 또는 변경된 파일을 추가 하는 방법입니다. git add
를 사용하는 순간 "staged" 에 속해있게 됩니다. 즉 add를 사용하기전엔 "modified" 이지만 사용하고나선 "staged" 중간단계에 오게됩니다.
이 해당 파일을 "commit" 하려면
git commit -m "해당파일의 설명"
이렇게 commit을 하게되면 "Committed" 상태로 오게됩니다. 하지만 아직 원격 저장소에는 반영이 되지 않았습니다.
git push
, git remote
commit 한 내용은 아직 로컬 저장소 안에 머물러 있습니다. 이 변경 내용을 원격 서버(github)로 보내보려 합니다 git push origin master
master는 하나의 branch 입니다.
만약 기존에 있던 원격 저장소를 clone 한 것이 아니라면, 원격서버의 주소를 git에 입력해줘야합니다. git remote add origin <원격 서버 주소>
이러한 커맨드를 입력하였으면, 이제 변경한 내용은 원격서버로 올라갔을겁니다.
branch 는 안전하게 격리된 상태에서 무언가를 만들때 사용할수있습니다.
git add
를 하셨다면 master 가지가 먼저 선택이되어있습니다.
하지만 바로 master에 올리기전에 다른 저장소에 저장한다음 쓰고 완벽한걸 master에 올리고싶다면
branch를 이용하면됩니다. 먼저 git checkout -b <(branch이름)>
의 커맨드를 사용하시면 이름을 지정해준 branch가 생성되고 그 branch로 이동하게됩니다. git branch -d <(branch이름)>
은 지정해준 branch를 삭제하는 커맨드 입니다. 다시 master branch로 돌아가고싶으면 git checkout master
커맨드를 치면 다시 master branch로 이동하게됩니다. 여기서 특이한건 checkout의 의미 인데요, "내가 사용할 branch 를 지정한다" 라는 의미 입니다.
또한 branch를 만들고나서 바로 사람들이 접근할순없습니다. git push origin <branch>
를 커맨드하여 원격 저장소로 push 해줘야 비로소 완성됐다 할수있습니다.
로컬 저장소에 있는것을 원격 저장소에 맞춰 갱신하려면 git pull
커맨드를 입력하면 원격저장소의 변경 내용이 로컬 작업 디렉토리에 받아지고(fetch) 병합(Merge) 된다.
다른 branch 에 있는 변경 내용을 현재 branch(ex, master branch) 에 Merge 하려면 git merge <branch>
커맨드를 입력하면된다.
pull 이든 merge 든 git은 자동으로 변경 내용을 병합하려고 시도한다. 하지만, 항상 병합이 성공하는게 아니라 가끔 충돌(conflicts)이 일어나기도 한다. 충돌이 발생하면, git이 알려주는 파일의 conflicts 부분을 직접 수정하여 병합이 가능하도록 만들수 있다. conflicts가 해결됐다면, git add <file_name>
커맨드로 아까 conflicts 가 났던 파일을 병합하라고 지시한다.
변경 내용을 Merge 하기전에 어떠한 부분이 어떻게 바뀌었는지 git diff <원래brach> <비교대상branch>
커맨드를 통해 알아볼수도있다.