git과 github는 코드를 사용하고 협력을 하는 사람들이라면 누구나 알고 있고 사용하는 프로그램과 서비스라고 생각해요. 이번에 강민철 튜터님의 git 강의를 듣게 되어서 강의를 통해 이해한 내용들을 간략하게 정리해볼게요.
git과 github는 다른 것인데, 먼저 git이 무엇인지 먼저 살펴볼게요. 튜터님은 git뿐만 아니라 어떤 프로그램이 사용되는 이유, 배워야 하는 이유 등을 알고싶다면 그 프로그램이 없는 세상을 상상해보는 것이 가장 효과적이라고 하시더군요. 강의에서는 Linus Torvalds의 사연까지 나오면서 스토리텔링 느낌으로 아주 이해가 쏙쏙되게 알려주셨지만 저는 그냥 개념들만 정리해보도록 하겠습니다.
등의 어려움과 귀찮음이 생기죠. 그래서 이런 어려움과 귀찮음을 해결하기 위해서 변경사항들, 즉 버젼을 조금 더 일목요연하게 관리하기 위해서 만든 도구가 바로 git이에요. 그럼 git으로 버젼관리를 하게 되면 무엇이 가능해지는 것일까요?
보다 쉽게 개발할 수 있게됩니다. 그렇다면 github는 무엇일까요?
github는 간단하게 말해서 "원격 저장소 호스팅 서비스" 입니다. 원격이라는 것은 인터넷 상에 있다는 뜻이고 저장소라는 것은 git으로 관리하는 프로젝트의 저장소라는 것입니다. 그리고 호스팅이라는 것은 뭐 hosting이라는 말대로 주인노릇한다는 뜻이죠. 집주인이 방들을 관리하듯이 github는 github에 존재하는 다른 사람들의 저장소를 관리해줍니다.
그런데 github가 워낙 유용하고 유명해지고 커지고 하다보니 개발자들의 SNS의 기능까지 겸하게 된 것이죠.
다음으로는 git의 대략적인 원리를 살펴보겠습니다.
먼저 git에는 3종류의 공간이 있습니다. 바로 작업디렉터리
, 스테이지
, 저장소
다. 이렇게 공간이 3가지나 되는 이유는 깃의 핵심기능인 commit과 관련이 있어요. 커밋이란 제가 이해한 것으로는 작업물의 어떤 순간을 사진 찍듯이 기록한 것과 비슷한 것 같아요. 보통 github에 커밋을 해서 코드를 공유하다고 말하는데, 좀 더 정확하게 말하자면 코드들이 어떻게 짜여져있는지 사진을 찍은 파일을 공유하는 것이고(즉 커밋을 공유하는 것이다), 그 커밋을 보고 코드를 똑같이 구성하는 것이 git의 기능이라고 할 수 있을 것 같아요.
어떤 프로그램에 유의미한 기능을 추가할 때마다 사진을 찍는다면 사진들은 프로그램의 버젼을 나타내게 되겠죠. 커밋이 이런 기능을 하는 것이고 버젼을 관리하는거에요. 즉 버젼관리라고 하는 것은 커밋파일들을 관리하는 것과 같다는거죠.
먼저 작업디렉터리에 mintzzz.txt 파일을 새로 생성하게 된다면, 그 작업디렉터리를 관리하는 git에서는 '어라? 원래 내가 찍어놓은 사진(커밋)에는 없던 것이 생겼네?' 할거에요. 우리는 그럼 이 파일을 추가한채로 또 사진을 찍을지 말지를 정할 수 있어요. 만약 사진을 찍고 싶다면 mintzzz.txt를 스테이지로 이동시켜야 합니다. 왜냐하면 git은 스테이지에 파일이 있어야 커밋을 할 수 있기 때문이에요. 새로운 파일이 여러개라면 사진찍고 싶은 파일들만 스테이지에 올려놓고 나머지는 그대로 작업디렉터리에 남겨놓으면 됩니다. 이렇게 작업디렉터리의 git이 모르는 파일들(수정, 신규생성, 삭제 등의 이유로)을 스테이지로 옮기는 것을 add
한다고 부릅니다.
그리고 스테이지에 있는 파일들은 이제 커밋이 될 기회를 가지게 되는거에요. 커밋을 하게되면 이제 그 프로그램은 새로운 버젼을 가지게 되는 것입니다.
그렇지만 여전히 이 버젼은 내 컴퓨터의 git프로그램에서만 관리가 되고 있죠. 우리가 원하는 것은 혼자서 하는 것이 아니라 모두 다 같이 코드를 공유하며 협업하는 것인데 말이에요. 그러려면 이제 git에서 관리하고 있는 커밋들을 공유해야 할 거에요. 바로 github를 통해서요!
관리하고 있는 커밋들을 github의 원격저장소에서 공유하기 위해 올리는 것을 push라고 합니다. push까지 안전하게 했다면 이제 그 코드는 컴퓨터에 커피를 쏟아도 안전해집니다. 그리고 그런식으로 만들어놓은 원격저장소를 통째로 내 로컬에 가져오고싶으면 git clone을 사용하게 됩니다.
더 좋은 버젼관리를 위해서 브랜치도 많이 사용하지만, 브랜치는 다음에 기회가 되면 더 정리해볼게요! 밑에는 간단하게 실습할 수 있는 깃 명령어를 예시로 올려보겠습니다.
# github의 원격 repository를 클론하고, 내가 코딩한 파일들 push하는 방법
- team-instruction 레포지토리에서 클론하기
1. window화면에서 클론받을 경로로 이동
2. 마우스 오른쪽 클릭해서 git bash 실행
3. git clone https://github.com/깃아이디/깃레포명.git
- mintzzz 브랜치생성 후 add, comit, push
1. 클론한 로컬저장소로 경로이동: cd team-instruction
2. 브랜치생성및변경: git checkout -b haksoo
3. 파일생성 및 작업 후 add:
touch haksoo.txt
git add .
git commit -m "message"
git push origin haksoo
# local에서 git 저장소 만들기
- git 저장소 초기화
1. 원하는 경로에 저장소로 만들려는 디렉터리 생성
2. 디렉터리 안에서 마우스 오른쪽 클릭하여 git bash 실행
3. 일반 디렉터리를 깃 저장소로 변환(초기화): git init
.git 이라는 디렉터리(숨김파일 볼 수 있게 설정)가 생겨났다면 잘 만들어진 것.
- 파일생성 후 add, commit
1. touch mint.txt / 생성 후 git status 로 상태확인
2. git add mint.txt / 디렉터리에 생성된 파일을 git의 추적대상으로 설정 / git status 로 상태확인
3. git commit -m "create mint.txt" / 추적된 파일을 커밋
(내 local의 깃 프로그램에 커밋이 등록된 것. github에는 아직 연결되지 않음)
- github의 원격저장소와 연결
1. 원격저장소 생성
- github에서 new repository로 원격저장소 생성
- README.md나 .gitignore 등 파일 추가하는 항목은 체크하지 말기
(파일이 추가되면 원격과 로컬의 커밋내용이 달라져서 충돌이 나게됨)
2. 원격저장소 주소를 로컬에서 등록
git bash에서
git remote add origin https://github.com/깃아이디/레포이름.git(자기꺼로)
git remote -v 로 확인
git branch -M main
(master 브랜치를 main으로 이름 변경하면서 생성. 저절로 main으로 설정되어있으면 명령어 안쳐도 상과없음)
3. 원격저장소에 push
git push origin main
** origin: 원격저장소
git push origin main = origin(원격저장소)에 main(로컬저장소의 브랜치 이름)을 푸시하겠다
git push origin mintzzz = origin(원격저장소)에 mintzzz(로컬저장소의 브랜치 이름)을 푸시하겠다