git은 분산 버전 관리 시스템이다.
분산 버전 관리는 소프트웨어 버전 관리를 위한 시스템이다.
이 시스템은 각 개발자가 중앙 서버에 접속하지 않은 상태에서도
코드 작업을 할 수 있는 것이 특징이다.
git을 사용해서 파일 버전 관리를 할 때 파일은 다음 3개의 상태 중 하나이다.
이렇게 중간 상태가 존재하는 이유는,
commit 하기 전에 중간 상태를 저장할 수 있도록 하기 위함이다.
commit은 해당 개발이 완전 완료되었을 때 하는 것이기 때문에,
중간 상태를 저장할 필요가 있다면 staging을 하는 것이다.
git을 사용한 버전 관리의 flow는 다음과 같다.
프로젝트를 git repository로 만들기 위해서 사용하는 명령어.
git init을 해서 git repo로 만들어야 git으로 버전 관리가 시작된다.
수정 사항들, 즉 modified 파일들을 staged 상태로 이동시킬 때 사용.
staged 파일들을 commit 하고자 할 때 사용하는 명령어
어떤 수정 사항들이 적용되었는지 보고자 할 때 사용하는 명령어
현재 상태를 보여주는 명령어
commit 내역들을 보여줌
원하는 파일을 git repo에서 삭제
원하는 파일을 git repo 상에서 이동시킬 때 사용
branch를 생성할 때?(브랜치 목록을 볼때?)
어떤 브랜치를 선택?이동? 할때 사용하는 명령어
git을 사용할 때는 branch 기반으로 개발한다.
git은 데이터를 단순한 변경사항으로 저장하지 않는다.
git은 파일을 스냅샷의 연속으로 저장한다.
git은 새로 commit이 들어오거나 프로젝트의 상태를 저장할 때마다,
파일이 존재하는 그 순간을 중요하게 여긴다. 수정 사항만을 저장하는게 아니라
파일의 스냅샷을 시간순으로 저장하는 것이다.
따라서 변경사항을 볼 때 현재 스냅샷과 이전 스냅샷을 비교하여 변경사항을 볼 수 있는 것이다.
개발자들의 변경사항들을 합쳐서 새로운 최신 버전을 만들어야 하는데,
문제는 어떤 스냅샷을 기준으로 변경사항들을 합치느냐 하는 문제가 생긴다.
이를 해결하기 위해 branch가 사용된다.
기준이 되는 스냅샷이 있다. 이를 master branch라고 한다.
각 개발자는 master branch를 checkout 하고, 거기서 자신만의 branch 를 만든다.
이를 feature branch라고 한다. 이를 기반으로 개발하고 commit 하면
자신의 featuer branch를 다시 master branch로 합하게 된다.(이것이 merge)
git은 분산버전관리 시스템이라고 한다.
그러니까 다같이 으쌰으쌰해서 개발하려고 할 때 가장 효과적인 방법이다.(?)
중앙서버에서 데이터?를 받아 개발하고 수정하고 올린다. 그리고 합친다.
중앙서버는 하나의 서버가 아닌 개발에 참여하는 모든 개발자의 컴퓨터가 서버가 될 수 있다.
이렇게 되어야, 나중에 중앙 서버가 맛이 갔을 때 대멘붕에 빠지지 않고 개발할 수 있다.
왜냐면 a가 맛이 가도 b에 데이터가 있으니까. b가 맛이 가도 c가 있고.
아무튼 이런 행위가 git이고 이걸 좀 더 쉽게 해줄 수 있게 하는게 github
git이란 좋은거고 훌륭한거고 꼭 필요한건데 어떻게 하는거지. 일단 git을 설치하고..
디렉토리?폴더를 만들어서 또는 폴더로 이동해서?(이동은 어떻게 하는걸까)
git을 하겠다고 명령을 내리면 된다.
git을 했다. 이렇게 하면 git을 한다. 근데 이건 반쪽 짜리다.
git은 분산버전관리 시스템이며, 이것의 가장 큰 목적은 다같이 코딩하고 개발하기 위함이다.
로컬저장소만으로는(위에서 git해서 현재는 local저장소만 있음 그러니까 내 PC에서만 gitgit함)
도와줄수 없다. 원격 저장소를 만들고 거기에 내 코드를 올리고 다른 사람 코드를 받고 수정하고 이걸 해야하는거다. 이걸 하기위해서 git hub의 원격 저장소를 만들어가지고 그 난리를 치는거다.
이제 연결하면 된다. 내 PC에서 gitgit 거리는 폴더의 원격 저장소로 github에 만든 그 저장소를 사용하겠다고 하면 된다. 연결해서 수정하고, 스테이징?하고 문제없으면 커밋하고 커밋했으면 푸시하면 된다. 커밋이랑 푸시를 헷갈리면 안된다. 커밋은 로컬 저장소에서 끝나는 행위라고 한다. 푸시는 원격 저장소로 내 파일을 넘겨주는거다. 커밋 된 애들을 전달하는거임.
그러니까... 택배를 보내는데 우리집에서 뭘 택배로 보낼지 결정하고(스테이징), 그걸 포장하고 하는것 까지가 커밋이면 푸시는 그걸 우체국에 가져다 주는거임. 내 손을 벗어남. 이제 위아더월드 되는게 푸시이다. 벨로그 임시저장까지가 커밋이고 출간하기가 푸시다. 그렇다.
파일을 추가하기전에, 어디서 본 게 있으니 브랜치를 만들어서 거기에 올리자고 생각할 수있다.
그래서 'git branch 이름' 을 신나게 쳐보는데 계속 거절당한다. 단호하다.
fatal : not a vaild object name: 'master'
라는 결과만 돌아온다. 이는 마스터 브랜치에서 아직 한 번도 커밋하지 않았기 때문이라고 한다.
다른 브랜치를 만들기 위해선 최소 1번은 커밋을 해야한다고 한다.
git에서 바로 파일을 만들고(수정) add하고 커밋하고 푸시도 하던데 이건 기초 실습이니까 그냥 아까 만든 폴더에 새로운 파일을 복사 붙여넣기로 추가해서 add하고 푸시하겠다.
다왔다 이제. 만들라고 하는 branch도 만들고 checkout으로 그 브랜치로 이동도 했다.
이제 푸시만 하면 내 작업물이 원격저장소로 보내진다. (지금은 테스트용으로 만들어서, 원격저장소에 아무것도 없어서 clone을 하든 pull을 하든 뭐 없다. 그래서 아직 잘 모르겠다.)
수정(개발) > 애드(스테이지) > 커밋 > 푸시
수정 > 애드 > 커밋 > 푸시
수정 > 애드 > 커밋 > 푸시
이해하기 아주 좋은 그림이 있다.
출처 : https://blog.osteele.com/2008/05/my-git-workflow/
아주 대단한 분이시다.
Visual Studio Code 에서 작업하는 중,
바로 git을 연결할 수 있다.
ctrl + ` // 바로 이것
이거 진짜 미친 기능 아닌가. 놀랍다.
바로 연결할 수 있다는거다.
git 켜서 mkdir 하고 cd 하고 그런거 말고
그냥 작업 중에 ctrl + ` 를 하면 여기서 바로 git 작업을 할 수 있다는거다.
이거 진짜 미친거 아닌가? 와. 사람들. 와. 개발자들. 와 머리좋아. 와 감사합니다.
작업하다가
ctrl + ` 해서 터미널 키고
git init 해서 깃 초기화하고
git status 해서 상태보고
git add . 해서 스테이징?하고
git commit 해서 커밋하고
git push 해서 원격 저장소로
아 아마도 당연한 이야기지만
원격저장소랑 연결은 해야한다.
와 이거 만드신분, 전수해주신분 적게 일하고 많이 버세요.