본문 바로가기

Git

Git이 무엇인고? 그리고 기본적으로 알아야 할 것은?

Youtube '얄팍한 코딩사전' 채널의 Git설명 영상을 학습하고 쓰는 글입니다

 

RPG게임을 해본 사람들이라면 git의 주기능을 이해하기가 정말 쉬울 거란 생각이 든다

 

게임을 진행하면서 이벤트의 분기점마다 save를 해놓았던 경험이 있을 것이다

망한 이벤트를 봤을 때 save포인트를 load하여 다시금 진행하기도 하고

여러가지 엔딩 루트나 이벤트를 탐색하기 위해 save와 load를 반복했을 것이다

 

git이 하는 것이 save와 load이다

save포인트를 만들기도 하고 save포인트를 load하기도 한다

 

"프로그램을 작성하다보면 이렇게도 해보고 싶고 저렇게도 해보고 싶어진다"고 한다

또 "어쩔 수 없이 분기점을 만들어 가면서 해야 하는 작업이 있을 때 git을 사용한다"고 한다

 

일단 git을 설치해야 할 것이다

아래 링크를 참고

https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-Git-%EC%84%A4%EC%B9%98

 

Git - Git 설치

이 책은 Git 2.0.0 버전을 기준으로 썼다. 대부분의 명령어는 그 이전 버전에서도 잘 동작하지만, 몇 가지 기능은 아예 없거나 미묘하게 다를 수 있다. Git의 하위 호환성은 정말 훌륭하기 때문에 2.0

git-scm.com

 

일단 git은 작업할 디렉터리를 특정하는 것에서부터 시작하는 듯하다

먼저 작업을 시작할 디렉터리로 접근하자

터미널이든 파일매니저든 내가 코딩한 파일들을 저장할 폴더를 만든다

나는 위에 적어놓은 것처럼 prac이라는 이름으로 폴더를 만들었다

~/prac/ 이라는 경로가 있고 그 안의 파일들을 작성하고 관리한다고 가정하겠다

 

설치를 했으니 설정부터 해본다

아래 페이지를 확인하며 주르르륵 다 해볼 수도 있다

https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-Git-%EC%B5%9C%EC%B4%88-%EC%84%A4%EC%A0%95

 

Git - Git 최초 설정

Vim과 Emacs, Notepad++은 꽤 인기 있는 편집기로 개발자들이 즐겨 사용한다. Mac이나 Linux 같은 Unix 시스템, Windows 시스템에서 사용 가능하다. 여기서 소개하는 편집기들이 불편해서 다른 편집기를 사

git-scm.com

 

나는 사용자 설정만 했다

$ git config --global user.name "John Doe"

""사이에 사용자 이름을 입력한다

 

$ git config --global user.email johndoe@example.com

user.email 이후에 이메일 주소를 입력한다

 

--global 옵션은 git의 기능을 사용할 때마다 별다른 명령이 없다면

--global으로 지정한 옵션을 사용하겠다는 뜻이다

 

후에 git에 익숙해져서 프로젝트마다(디렉터리마다) 다른 내용을 사용하고 싶다면

위 명령어에서 --global을 쓰지 않고 나머지만 채우면 된다

 

이 정도 했으면 대강 된 거다

이제부터 git이 뭐하는 놈인지 한번 보도록하자

 

ab@ab-VirtualBox:~/prac$ git init 이렇게 입력하면 -

/home/ab/prac/.git/ 안의 빈 깃 저장소를 다시 초기화했습니다라고 뜰 것이다

뭔 소리지? 할 것 없이 '아 그냥 git을 쓸 준비를 했다' 이렇게 알아두자

 

그러고난 후 -

ab@ab-VirtualBox:~/prac$ git status 를 입력해보자

현재 브랜치가 어디인지 -

save포인트 즉, 분기점으로 만들 상태가 존재하는지가 보인다

 

git init과 git status의 결과

 

연습을 하면서 git status 명령어를 통해 중간중간 상태를 확인해보면 -

이게 돌아가는 모양새가 어떤지를 이해하기가 쉽다

능숙하게 하진 못해도 얘가 돌아가는 원리가 보인다

 

이제 폴더 안에 파일을 만들어보자

vscode에서 세 개의 파일을 생성했다

 

내용은 적고 싶은 이름을 적어 놓는다

얘들로 분기점을 만들어 볼 것이다

 

이렇게 만들어놓은 후 다시 한번 git status를 입력해보자

파일을 생성한 후 git status를 입력한 결과창

 

현재 어느 브랜치에 있는지가 나오고

커밋이란 말이 나오고

추적하지 않는 파일이 나온다

그리고 마지막 줄에 추적하려면 "git add"를 사용하라는 문구도 보인다

 

브랜치는 평행우주라고 생각하면 된다

브랜치의 이름은 평행우주에 붙이는 이름이고 -

최초의 브랜치 즉, 원본 브랜치의 이름은 master이다

지금 당장 이해 못해도 된다

 

커밋(commit)이란?

현재 git status를 입력했을 때 출력되는 상태를 save포인트로 삼겠다는 명령어이다

git status를 입력했을 때 출력되는 상태를 분기점으로 삼겠다는 명령어이다

지금까지를 commit 하면

cat과 dog과 mouse라는 파일이 있는 상태를 save포인트(분기점)로 만드는 것이다

 

git add는 commit하기 전에 commit의 대상을 확정해두는 것이다

 

감이 잘 오지 않을 수 있으니 일단 코드를 굴려보자

먼저 cat dog mouse가 있는 이 상태를 commit 대기상태로 만들 것이다

여기서 commit 대기상태는 알기 쉽게 설명하기 위한 말일 뿐이고 공식 용어가 아니다

나중에 잘 알게 되면 알아서들 정확히 이해하길 바란다

 

git add -A 라고 입력하면 일단은 아무일도 일어나지 않을 것이다

여기서 git status로 상태를 다시 한번 보자

git add -A 입력 후 git status

 

아까와는 다르게 커밋의 대상이 될 상태가 등록이 된 걸 볼 수 있다

이래서 commit 대기상태로 만든다고 설명한 것이다

'스테이지 해제하려면.. git rm --cached (파일이름)'이라고 나오는데 -

이건 특정 파일을 commit 대기상태에서 제외할 때 쓴다

 

cat을 git rm --cached cat으로 조져보겠다

git rm --cashed cat 명령의 결과

 

cat이 commit 대기상태에서 제외된 것을 확인할 수 있다

'커밋할 사항에 포함하려면..git add (파일이름)'이라고 또 친절하게 알려주는 것도 볼 수 있다

알아서들 하길 바란다

 

아무튼 git add -A 명령을 통해 -

commit을 실행할 즉, save포인트로 지정할 상태를 등록했다

이제 이 상태를 commit 해보자

(cat을 다시 포함한 상태로 진행한다)

 

git commit -m "cat_dog_mouse"

큰따옴표""사이에는 분기점의 이름을 적어준다

그래야 뭐가 뭔지 알아보고 헛짓을 하지 않을 것이다

git commit -m "(분기점 이름)"을 실행한 후 git status로 상태 확인

 

뭔 소린지는 정확히 몰라도 에러가 안 나고 잘 됐다는 건 대충 알 수 있을 것이다

그리고 추가로 또status를 입력해보면

commit 대기 상태로 넣을 만한 놈이 남지 않았고 -

commit 대기 상태에 있는 놈들도 없고 -

commit을 완료했기 때문에 작업 폴더가 깨끗하다고 나온다

아무튼 우리는 cat_dog_mouse라는 save포인트를 방금 만든 것이다

 

<save.01> cat_dog_mouse / cat: tom, dog: bull, mouse: jerry

 

이제 게임을 계속 진행해보자

save를 했으니까 든든하게 앞으로 전진할 수가 있다

 

whale이라는 파일을 만들고 내용에 생각나는 이름을 넣어보자

나는 내용에 bob을 적었다

 

이제 이 상태에서 또ㄸㄸ git status로 상태를 살펴보자

새 파일을 생성한 후 git status

 

예상대로 whale이 나온다

여기까지 만족스럽다

 

조금 더 진행해보자

나는 mouse가 마음에 들지 않는다

삭제하겠다

 

진짜 삭제했음

 

그리고 또또ㄸㄸㄸ git status를 해보겠다

나는 status신봉자다

 

mouse를 삭제한 후 git status

 

'삭제했다는 사실'을 git status에서 잡아준다

이제 '커밋하도록 정하지 않은 변경 사항'이나 '추척한다 추척하지 않는다' -

이런 말들이 정확히는 이해되지 않아도 슬슬 감이 올 것이다

 

whale을 추가하고 mouse를 삭제한 이 상태도 save포인트 즉, 분기점으로 만들어보자

앞서 했던 짓을 반복할 것이다

먼저 git add -A를 통해 현재 git status에서 주시하고 있는 변경사항을 -

 commit 대기상태로 만들어줄 것이다

그리고 git commit -m "" 명령어를 통해 save포인트 즉, 분기점을 생성할 것이다

 

git add -A 명령 후 git commit -m "(분기점 이름)"

 

이번에도 아주 훌륭하게 save포인트(분기점)가 생성되었다

 

<save.02> WhaleComes_MouseOut / cat: tom, dog: bull, Whale: bob, mouse: jerry

<save.01> cat_dog_mouse / cat: tom, dog: bull, mouse: jerry

 

이 짓도 지겹지만 딱 한 번만 더 해서 save포인트 03까지 만들어본다

이번엔 penguin을 추가하고 cat의 내용을 수정하겠다

penguin: ping9, cat: ->gilnyang

 

그리고 뭘 한다?

 

 

 

ㅇㅇ git status 해볼 거임

 

penguin파일을 생성하고 cat의 내용을 수정한 뒤 git status

 

파일의 추가와 파일의 수정을 모두 잡아내는 모습이다

아주아주 만족스럽다

이 맛에 git status를 연신 쳐대는 것 같다

 

아무튼 이 상태를 세 번째 save포인트 즉, 세 번째 분기점으로 만들어보자

일단 이 상태를 commit 대기 상태로 만들어야 할 것이다

먼저 git add -A를 입력하고 -

git commit -m "(분기점 이름)"으로 마무리하면 될 것이다

git add -A에서 -A는 ALL이라는 뜻일 것 같다(*추측임)

git commit -m 에서 -m은 memo라는 뜻일 것 같다(*추측임)

앞선 방식과 동일하게 세 번째 save포인트를 생성했다

 

그럼 지금까지 이런 포인트들이 생성됐다

<save.03> penguinComes / cat: gilnyang, dog: bull, whale: bob, penguin: ping9, mouse: jerry

<save.02> WhaleComes_MouseOut / cat: tom, dog: bull, whale: bob, mouse: jerry

<save.01> cat_dog_mouse / cat: tom, dog: bull, mouse: jerry

 

이렇게 해놓은 후 ㄸㄸㄸㄸㄸㄸㄸ git stauts를 입력해보면

커밋할 사항이 없고 작업 폴더가 깨끗하다는 말을 할 것이다

이제는 다 예상이 됩니다

 

그럼 이렇게 save포인트를 만들어놨으면 load도 해보는 게 맞을 것이다

일단 save포인트의 목록을 보자

아래의 명령어로 확인한다

git log

다git log를 통해 분기점 목록을 확인할 수 있다

 

이제 지금 상황에서 전의 save포인트로 돌아가볼 때다

두 가지 방법이 있다

첫 번째 방법은 '지금 상태를 또 하나의 save포인트로' 만들고 돌아가는 방법이고

두 번째 방법은 '지금 상태를 삭제해버리고 이전의 save포인트로' 돌아가는 방법이다

 

일단은 첫 번째 방법을 써보자

얌전하게 지금을 보존해놓고 이전으로 돌아가는 것이다

일단 지금 상태를 점검하자

 

<save.03> penguinComes / cat: gilnyang, dog: bull, whale: bob, penguin: ping9, mouse: jerry

<save.02> WhaleComes_MouseOut / cat: tom, dog: bull, whale: bob, mouse: jerry

<save.01> cat_dog_mouse / cat: tom, dog: bull, mouse: jerry

 

현재는 penguinComes의 내용이 그대로 남은 상태이다

penguinComes라는 분기점을 만든 후 아무것도 수정하지 않았기 때문이다

이 점을 확인한 후 -

이제 <save.02>WhaleComes_MouseOut으로 돌아가볼 텐데 -

한 가지 짚고 넘어가야할 것이 있다

 

여기서 <save.02>WhaleComes_MouseOut으로 돌아가는 원리가 무엇일까?

'<save.02>이후 <save.03>으로 진행하면서 했던 짓들을 취소'하면서 돌아가는 것이다

그 사이 무슨 짓을 했는지 확인해보자

 

penguin: ping9, cat: ->gilnyang

펭귄을 추가하고 고양이의 이름을 변경했다

 

그렇다면 펭귄을 추가한 사실을 없애고 고양이의 이름을 변경 전으로 되돌리면서

돌아가는 것이라고 할 수 있겠다

 

//

지금까지 우리는 git add -Agit commit -m "" 명령을 수행하는 사이에는 -

아무런 짓도 하지 않았다는 걸 떠올려보자

 

즉, git의 추적 목록에 올리고 나서 -

그 어떠한 것도 수정하지 않은 채 곧바로 commit을 수행했기 때문에 -

분기점으로 돌아가는 것이 쉬워 보이고, 또 취소하면서 돌아간다 한들 내용이 명확하기 때문에

생각할 것이 없다

그리고 그 사이에 수정이 일어났을 때 어떤 식으로 분기점이 작동할지는 나도 모른다

안 해봤으니까!

이건 알아서들 해보시길 바란다

//

 

명령어는 git revert (분기점 코드의 앞 6자리) 이다

여기서 우리는 <save.03>시점의 상태를 반대로 이행하므로써 <save.02>로 갈 것이기 때문에

<save.03>의 분기점 코드 앞 6자리를 입력해주면 되겠다

 

한번 해보자!

git revert로 이전 상황으로 되돌아갔다

 

나는 이 글을 작성하기 전에 실행했던 뭔가가 남은 건지

망한 revert가 작동되었다

 

굉장히 당황스럽다

(대충 revert 하다가 망했다는 로그임)

 

vscode의 소스제어 탭에서 이것저것 누르다가 아무튼 revert를 하긴 했는데

사실 삭제는 일어나면 안됐었다

 

이 글을 보고 따라하는 사람이 혹시나 있다면 성공했을 것이다

아무튼 이게 첫 번째 방법이었다

 

이제 두 번째 방법을 써볼 것이다

이번엔 제발 그냥 되길 바라면서 글을 쓴다

아까 동영상 보면서 따라할 땐 잘됐는데 너무 당황스럽다

이번에도 잘 안되면 울 수도 있다

 

두 번째 방법은 '지금 상태를 삭제해버리고 이전의 save포인트로' 돌아가는 방법이다

명령어는 git reset (돌아갈 목표 분기점 코드의 앞 6자리)가 되겠다

어찌어찌 <save.02>로 와있으니 <save.01>로도 한번 가보자

 

제발 돼라!

git reset후 ddo git status를 한 결과

 

git reset을 했을 때 경고가 뜨거나 소스제어 탭에 신호가 들어올 수 있다

이 변경을 허가할 시 파일이 삭제되고 파괴된 데이터는 돌릴 수 없다 -

뭐 이런 경고가 뜨는데 이건 당연한 것이다(스크린샷 못 찍었음)

전으로 돌아가는 과정에 일어나는 삭제에 대해 묻는 것이므로 삭제를 눌러주면 되겠다

 

아무튼 그러고 나서 git log로 분기점을 확인해보면-

git log 결과

 

처음으로 잘 돌아온 것이 확인된다

 

vscode의 버전이 높아져서 그런 건지

아니면 동일한 디렉터리 이름과 파일 이름을 사용해서 그런 건지

revert가 이상하게 작동되고 막 소스제어 탭에서 부르고

매우 당황스러웠다

 

이 짓을 몇 번 더 반복해보면 확실히 감이 잡힐 것 같다

그리고 생각을 좀 해보면서 해야겠다

git add -Agit commit -m ""사이에 변경이 일어났을 때는

또 어떤 식으로 작동할지 예상해보고 돌려보고 차이점이 있다면 기록하고

그렇게 해볼 생각이다

 

vscode에서 터미널을 직접 이용할 수 있다는 점이 꽤 마음에 든다

vscode도 가끔씩 사용하게 될 것 같다

 

일단은 git에 대한 유튜브 강의를 계속 보면서 기본기를 다져야겠다

다음 포스팅은 오늘 처리하지 못한 Branch에 관한 내용

그리고 그 다음은 github에 관한 내용으로 계획 중이다

 

끝!

 

 

Youtube '얄팍한 코딩사전' 채널의 Git설명 영상을 학습하고 작성 완료한 글입니다