본문 바로가기

코드^학습/메모한 지식

git의 개념

githug를 풀어나가기 전에 git이란 어떤 것이고 어떻게 이루어져 있는지 익히고 넘어가는게 좋겠습니다.


github는 대표적인 무료 저장소입니다. 이전에 인턴하던 곳에서는 SVN을 썼었는데 옆책상에 있던 제 친구는 git도 썼던걸로 기억합니다.

저장소 repository를 만들어 소스코드나 게시물을 올리고 관리할 수 있습니다. 게다가 소스코드는 버전관리까지 가능!! 하므로 개발자라면 필히 익혀두어야할 것이라 할 수 있습니다.

형상관리는 중요하니까요. 그러나 저는 SVN을 옆에서 보기만했지(정식 사원이 아니기에) 저는 백업을 따로 소스코드만 압축(...)해서 가지고 있었습니다.

의미있는 특정버전이 생기면(기능추가하고 빌드를 했는데 정상동작한다!) 소스코드를 복사해서 압축해놨습니다. 그리고 파일명에 어떤 변경사항이 있는지 적어뒀었죠.


그러나 git을 써야죠 요즘 대세는 git...! 저는 배우는 입장으로서 지식을 여기에 정리해두고자 합니다.


1. git은 어떻게 생겨먹었나

구글에서 github라고 검색하면 가장 대표적으로 눈에 띄는 git - 간편 안내서가 있습니다. 초보자에게 git을 알려주고자 만든 git blog인듯한데

이 개념을 필히 이해해두어야만이 git을 제대로 이용할 수 있습니다. 그걸 모른채로 git 명령어 배우겠다고 githug를 두드리고 있었으니... 반성합니다.


먼저 github홈페이지에 들어가서 가입하고 repository를 하나 생성합니다.(안 해도 되는거 같은데 시험삼아 하나 만들었습니다.)

저는 현재 자료구조와 sort알고리즘 소스를 담아두기위해 두개의 repository를 만들어둔 상태입니다.

기본적으로 public으로 만들어지고 public이니만큼 당연 누구나 검색하고 열어볼 수 있습니다. private로도 만들 수 있지만 이건 결제가 필요합니다.(학교 인증 절차를 거치면 private도 무료로 만들 수 있대요! 하지만 전 졸업하고 시작했기 때문에 망.)


자 이제 git에 가입했으니 제 컴퓨터에도 git이 필요하겠죠? 로컬에서 작업한 내용을 반영할려면 로컬이랑 연결이 되어 있어야하니까요.

폴더를 하나 생성하고 git init이라고 칩니다.

$ git init

Initialized empty Git repository in /home/p/Desktop/*********/.git/

(******은 디렉토리 이름입니다. 각자 맘에드는걸로 지으세요~)


이제부터는 git에서 이 폴더의 변경사항을 추적하겠다는 의미입니다.

그리고 이제 commit을 할때 누가했는지 알 수 있도록 환경변수를 설정합니다.

$ git config --global user.name "******"

$ git config --global user.email "*******@******.kr"


아무런 반응이나 메시지가 뜨지 않지만 당황하지 마세요. 저도 안 된건가 싶었는데 그렇지 않습니다!

자 이제 이 디렉토리에서 커밋을 할 경우 누가수행했는지 알 수 있습니다.


저는 자료구조와 정렬 알고리즘 소스코드를 올려둔다고 이미 만들어둔게 있어서 제 디렉토리로 복사해왔습니다.

$ git clone https://github.com/******/DataStructure ./DataStructure

Cloning into './DataStructure'...

remote: Counting objects: 14, done.

remote: Total 14 (delta 0), reused 0 (delta 0), pack-reused 14

Unpacking objects: 100% (14/14), done.

Checking connectivity... done.


이렇게 복사해올 수 있습니다. (복사해오는 명령어 git clone!)


자 일단 세팅이 끝났으니 개념을 설명해볼게요!(응? 개념설명 후 세팅해야하는거 아닐까? / 몰라 난 이렇게 했어...)(사실 간편 안내서에도 저장소 복사 다음이 개념설명입니다ㅋㅋ)

github의 사이트로 접근할 수 있는 곳은 [원격 서버 저장소]

제가 만든 디렉토리는 [working directory]인데 여기는 실제 파일들이 저장됩니다.


그리고 [staging]라는 개념은 commit하기 이전에 준비상태인 파일들입니다. (폴더가 아니에요. 상태입니다 상태!)

이때 staging area와 같이 이해할 상태가 unstaging 상태와 untracked 상태입니다.

unstaging 상태는 이미 있던 파일에 대한 변경사항이 발생했을 경우 그 파일은 unstaging 상태라고 할 수 있습니다.

untracked 상태는 새로 추가된 파일이 생기면 새로 추가된 그 파일은 untracked 상태라고 할 수 있습니다.

(git은 저장소의 변경된 내용을 추적해서 변경사항을 반영하기 때문에 새로 추가된 파일에는 추적할 수 없다라는 의미인 untracked라고 호칭하는 것 같습니다.)

이 두 상태를 staging 상태로 바꿔서 commit 명령어를 실행하면 HEAD에 반영하게 되죠


마지막으로 [HEAD]는 commit된 파일들이 모여진 최종 확정본입니다. 물론 [원격 서버 저장소]에 반영된건 아닙니다.

자 그러면 파일 추가는 어떻게 하는 걸까요?

$ git add test.c


이렇게 하면 됩니다. 그러나 이건 추가만 한 상태이기 때문에 아직 HEAD에 반영은 안 됐어요.

반영은 이렇게 합니다.

$ git commit -m "적을메세지"

[master *******] 테스트용 출력부분 제거   <----- ***은 hash번호같이 이상한 문자&숫자의 조합입니다.

 1 file changed, 39 deletions(-)


자 그렇다면 [원격 서버 저장소]로는 어떻게 올릴까요?

이렇게합니다.

$ git push orignal master

Username for 'https://github.com': ******

Password for 'https://******@github.com': 

Counting objects: 3, done.

Delta compression using up to 2 threads.

Compressing objects: 100% (3/3), done.

Writing objects: 100% (3/3), 356 bytes | 0 bytes/s, done.

Total 3 (delta 1), reused 0 (delta 0)

To https://github.com/******/**********

   6facd25..2e4a051  master -> maste


만약 원격 저장소를 그대로 복제하지 않았을 경우에는

$ git remote add origin <주소>


음 마스터와 브랜치(branch)에 대해 이해할 차례인거 같습니다.

처음 파일을 업로드하고 그것을 master로 잡을 수 있습니다. C의 포인터로 생각하시면 쉬운데요. master라는 포인터가 처음 올린 어떤 내용을 가리키고 있는겁니다.

그리고 기능 추가라던지 변경을 위해서 뭔가 바꿔야 한다면 branch 를 만들어서 거기에서 변경을 취하고 원본과 합치면 됩니다. 참 쉽죠?(뭣이?)


마스터에서 가지는 어떻게 만들까요?

$ git checkout -b branchname


가지를 포기할 땐?

$ git checkout master


가지를 삭제할 땐?

$ git bracnch -d branchname


자 가지도 아까 처럼 push하기 전까진 다른사람이 접근할 수 없으므로 이것도 push로 [원격 서버 저장소]에 보내야합니다.

$ git push origin branchname


가지가 뻗기만하면 프로젝트가 완성이 안 되겠죠. master와 합쳐져야 최종버젼을 확정할 수 있겠죠.

즉 merge 를 해야합니다.

$ git merge branchname


원격 저장소에 맞춰서 현재 로컬을 갱신할려면 이 명령어입니다.

$ git pull


위의 두가지 명령어 모두 git이 내용을 병합하려고 시도합니다.

그러나 합치다보면 충돌이 생기겠죠. 대비해야 하겠죠. 변경사항이 많다보면 그럴 확률이 자주 있을 수 있으리라 생각합니다.

그 부분은 직접 제가 하고나서 추가하겠습니다.


그 외에도 tag의 기능과 로컬 번경 내용 되돌리기

등은 앞으로 진행해가면서 추가하도록 하겠습니다.