티스토리 뷰

Language/Python3

Python3 - Git & Github(1)

ShinyOcean 2021. 5. 7. 16:22

안녕하세요 :)

 

파이썬 개발 관련 첫번째 포스팅은 깃과 깃허브에 대하여 먼저 다루어 보겠습니다.

사실 실제 개발과는 전혀 관계없는 내용이긴 하지만 앞으로는 깃과 깃허브를 이용하여 블로그에 포스팅하듯이 흔적을 열심히 남겨보겠습니다.

 

 

깃이란?

 

깃이란 프로젝트 버전 관리 도구입니다.

프로그램소스, 퍼펫설정파일, 졸업논문 등등 거의 모든 컴퓨터 파일을 관리할 수있습니다. 

각 파일에 버전을 부여하여 저장하고 상태 변화를 추적하며 필요한 경우 원하는 버전으로 복원하는 기능을 제공합니다.

 

큰 특징들은 다음과 같습니다.

 

가지치기와 병합을 사용한다(use branch & merage)

로컬에서 대부분의 명령을 처리한다

작고 빠르며 프로젝트 배포가 매우 편리하다

다른 버전관리 도구보다 강력한 협업 기능을 제공한다.

프로젝트의 무결성 보장

오픈소스로 개발되어 누구나 사용가능

 

깃은 파일을 세가지 상태로 나누어 관리합니다.

1. 제출된상태(cummitted)

-작업을 로컬 데이터베이스에 저장할 경우

 

2. 수정된 상태(modified)

-파일을 수정하게 될 경우

 

3. 준비영역에 추가된 상태(staged)

-수정한 파일을 제출하기위해 준비 영역에 추가할 경우

 

또 각각의 상태 이동에서의 용어는 다음과 같습니다.

만약 작업 디렉터리에서 준비 영역으로 옮긴다면 git add

준비 영역에서 로컬 저장소로 옮긴다면 git commit

로컬저장소에서 작업 디렉터리로 꺼낸다면 git check out

 

그렇가면 깃허브란 또 무엇일까?

깃은 깃 자체로도 굉장히 유용한 프로젝트 관리 도구이지만 이는 여럿이 함께하는 프로젝트에서 더 그 가치가 커집니다.

깃 프로젝트를 안전하게 보존하고 여러 사용자가 공동으로 관리할수 있도록 원격 저장소를 이용하게 되는데 이를 깃허브라고 합니다. 깃으로만 관리 하던 중요한 프로젝트를 여러사람과 함께 공유하기 위해 만들어진 원격 저장소 정도로 이해할수 있을것 같습니다.

 

누구나 깃허브 이용하여 프로젝트를 생성하고 다른 사용자의 프로젝트를 수행할 수 있습니다.

 

그렇다면 깃 허브에서는 원격 저장소라는 새로운 상태가 생기게 됩니다.

로컬 저장소의 커밋된 내용을 깃허브의 원격 저장소로 옮기는 것을 git push

원격저장소에서 로컬 저장소로 끌어오는 것을 git fetch 라 합니다

 

이제 우분투 리눅스 환경에서 git과 gut hub를 설치하여 운용해보겠습니다.

 

위처럼 apt-get update를 통해 패키지 관리자를 업데이트 해주고 git을 설치합니다. 저의 경우 root계정을 로그인되어있기 때문에 위처럼 했지만 일반 사용자의 경우 sudo를 붙여 명령어를 사용합니다.

 

설치가 완료되면 버전확인을 해볼수 있고 아래와 같이 버전이 나오게된다면 정상입니다.

설치를 진행하자마자 해줄일은 사용자이름과 전자메일 주소를 입력해주어야 합니다.

명령은 다음과 같습니다.

git config --global user.name "사용자이름"

git config --global user.email "전자메일 주소"

 

기본적인 깃의 설치및 설정이 완료 되었습니다.

 

그럼 실제로 파일버전을 관리할 디렉터리를 생성하고 깃을통해 관리 해보겠습니다.

 

 

첫 과정은 위와 같습니다. 먼저 디렉터리를 만들고 그 안으로 이동하여 git init 명령을 통해 디렉터리를 초기화 해줍니다.

그러면 아래와 같은 파일이 하나 생긴것을 확인할수 있습니다. 이름은 .git이며 시스템 관리자가 처리하는 모든 작업내용이 저장됩니다.

기본적으로 현재 디렉터리의 상태를 보고하는 명령인 git status로 초기 상태를 확인해보면 다음과 같습니다.

그리고 테스트를 위한 텍스트 파일을 하나 vi에디터를 통해 만들어 보겠습니다.

그리고 git status로 확인해보면 다음과 같이 파일은 있지만 변화는 추적하지 않는 untracked file로 존재하고 있습니다.

 

위의 알림 내용에서도 알수 있듯이 추적을 허용하려면 깃의 관리 대상으로 등록 해야합니다. 이를 위해 git add라는 명령을 사용하게 됩니다. git add명령을 받은 파일은 앞서 설명한것과 같이 준비영역으로 올라가게됩니다.

(만약 디렉터리내의 모든 파일들을 준비영역으로 추가하고 싶다면 git add . 이라고 입력하면 됩니다. 여기서의 . 은 당연히 현재 디렉터리의 . 이겠죵)

 

그리고 다시 git status 명령으로 확인해본 결과는 다음과 같습니다.

 

 

위와 같이 새 파일 이라는 초록 글씨로 변화 하였고 깃의 파일 관리대상(staged),스테이지가 되었습니다.

근데 저도 포스팅하면서 느끼는것인데 우분투 리눅스 환경의 언어 설정을 한국어로 하게 되면 위와 같이 자세하게 설명이 되어 편리 하네요ㅎ...

 

이제 마지막 과정인 준비영역에서 로컬 저장소로 보내는 커밋 과정만이 남았습니다.

명령어는 git commit -m '작업내용' 을 이용하여 커밋합니다. -m은 메세지옵션으로 작업한 내용을 요약하는 간단한 설명이면 됩니다.

위와 같이 커밋이후에는 상태를 조회하였을때 조회되는것이 없이 깨끗해야 합니다

그렇다면 열심히 만든 파일은 커밋이후 어떻게 되었을까요?

 

지금까지 작업한 내용을 살펴보는 명령은 git log 입니다. git log 명령은 커밋 ID와 커밋을 실행한 사용자, 커밋한 시간 정보, 커밋과정에서 입력한 작업내용을 표시합니다. -p 옵션을 사용하면 어떤파일을 어떻게 고쳤는지 나옵니다.

 

이렇게 본다면 초록색 글씨가 제가 파일에 입력한 내용이고 기본 정보들은 잘 나오는거 같은데 커밋 과정들은 이해하기 힘든 부분들이 있네요 이러한 정보들은 나중에 깃허브 저장소에서 파일을 올려 관리하면 조금더 분명하게 수정된 부분을 확인할수 있습니다.

 

이렇게 새로운 파일을 커밋하는것을 해보았습니다. 그럼 이제 파일을 수정하는 것을 해보겠습니다.

 

처음에 작성한 파일의 내용을 아래와 같이 조금 바꾸어 보겠습니다.

그리고 상태정보를 확인해보니 아래와 같이 수정함이라는 빨간 글씨로 상태가 생긴것을 확인할수 있습니다.

 

이 수정된 파일을 관리대상 즉 스테이지로 만들기 위해 git add 명령을 다시 실행해주고 상태를 확인하면 아래와 같이 수정함 이라는 글씨가 초록색으로 바뀌고 커밋할 변경사항에 추가된것을 확인할수 있습니다.

 

이 스테이지를 다시 git commit 명령을 통해 커밋해줍니다. 저는 -m 옵션으로 'modified' 라 메세지를 붙였습니다.

status로 결과를 확인하면 다음과 같이 잘 커밋된것을 확인할수 있습니다.

 

다음은 git log 로 확인해보면 다음과 같습니다. 아래부터 순서대로 변경된 과정을 볼수 있습니다.

 

 

 

깃 가지치기 (브랜치, branch)

이제 협업에서 가장 중요한 가지치기와 병합을 다루어 볼것입니다. 

 

깃 프로젝트에서 특정 목적으로 별도의 작업을 처리하는 과정은 기존 작업 내용의 사본을 만들어 개발용으로 사용하고 작업이 끝나면 다시 원본에 합치는 흐름으로 이루어 진다.

 

말이 어렵네요 예를들어 공동체 인원들이 더하기와 곱하기 이용한 자연수 3 만들기 라는 프로젝트를 진행했다 생각해보겠습니다.

 

그러면 한프로젝트의 똑같은 시작점에서 같은 목표를 향해 출발하여 여러가지 방법이 나올수 있습니다.

1+1+1 =3

1*3 = 3

1*2+1 =3

 

처럼 말이죠. 이떄 위의 세가지를 가지(branch) 라고 생각하면됩니다. 하나에서 파생되어 나온 여러 갈래

 

이때 빼기 라는 새로운 매커니즘 즉 새로운 커밋을 추가할수도 있고 사용하던 가지들을 병합할수도 있습니다.

 

 

 

기본적으로 git init명령을 통해 저장소를 생성하면 가지는 master가지가 만들어지고 커밋을 할때마다 가지가 자라납니다. 각 커밋은 ID로 구분할수 있습니다 위의 커밋 생성후 수정 예제로 살펴보면

commit e146cf머시기 로 되어있는 부분을 살펴보면 e146cf가 아이디입니다.

편의를 위해 여섯자리만 표기하겠습니다.

 

그렇다면두번째 커밋의 아이디는 a5d330이 될것 같습니다, 가장 최근에 수정된 현재 master 가지가 가리키는 커밋입니다.

그림으로본다면 다음과 같습니다.

 

만약 이상태에서 관리중인 작업과는 별도로 어떤 다른 실험을 해보기위해 사본을 만들어 커밋하고 싶다면 git branch 명령을 통해 다른 가지를 생성합니다. 새로 생성한 가지는 원래의 중요작업(master가지)에는 영향을 미치지 않고 독립적으로 수행할수 있습니다

 

예를들어 제가 작성한 파일 제일 마지막 부분에 파일을 작성한 날자를 기입한 수정본을 만들고 싶은데

원래에 작업에 영향을 끼치지 않게 하고싶다면 이때 새로운 가지 iss01을 생성하여 원래 작업과 분리 할수 있습니다.

 

새로운 가지를 만드는 명령은 git branch였으니 실행결과는 다음과 같습니다.

하지만 아직 현재 커밋이 master로 되어있죠! 가지만 생성하면 새로운 작업을 할수 있는것이 아니라 생성한 가지로 현재 브랜치를 이동해주어야 합니다. 이를 위해 git checkout 명령을 사용합니다. 사용예는 아래와 같습니다.

그러면 새로운 가지인 iss01로 이동되었고 현재 브랜치가 iss01로 되어있는것을 확인할수 있습니다.

 

이제 원하는대로 파일을 수정한후 새로운 가지에 커밋해보겠습니다.

test.txt

위와 같이 새로운 branch에 새로운 작업을 커밋하였습니다. git log로 확인하면 아래와 같습니다.

새로운 가지에서 커밋된것을 확인할수 있죠!

git branch -v 명령은 현재 존재하는 가지와 가지가 가리키고 있는 커밋을 출력합니다.

지금 이상태를 그림으로 표현하면 아래와 같습니다.

수정한 내용에 이상이 없어 병합하고 싶다면 명령어 git merge를 사용합니다.

병합시 현재 브랜치는 마스터로 돌아와야 한다는것을 잊으면 안됩니다!

 

위와 같이 병합후 확인해보면

 

위와 같이 변경된것을 확인할수 있습니다.

이제 필요없어진 가지인 iss01은  -d옵션으로 삭제 할수 있습니다.

 

그리고 -v 옵션을 통해 확인해보면 아래와 같이 깔끔해진 가지의 상태를 확인해볼수 있습니다.

 

이제 가지치기와 병합을 모두 해보았습니다.

 

이전 커밋으로 돌아가는 방법!

 

git reset 커밋아이디

git reset HEAD^ - 현재 브랜치가 가리키는 커밋의 바로 이전 커밋으로 이동

 

이전 커밋을 지금파일과 동기화 하는 방법

 

git checkout --파일경로

 

ex)

 

 

checkout의 경우 브랜치를 이동할때도 사용하지만

커밋의 내용을 파일의 내용과 동기화 할때도 사용합니다!

 

만약 해당 디렉터리 내에서 브랜치를 바꿀경우 파일은 자동적으로 브랜치에 맞는 커밋상태로 동기화 됩니다.

하지만 강제로 특정 커밋의 상태로 파일을 바꾸고 싶을때는 위와 같이 커밋을 변경하고 그 내용을 동기화합니다.

 

 

다음 포스팅에선 커밋들을 깃허브의 나만에 계정에 올리는것을 해보겠습니다 ㅎ

 

 

 

 

 

 

 

'Language > Python3' 카테고리의 다른 글

Python3 - todolist(text) demo  (0) 2021.05.14
Python3 - Todolist (test mode), use Database  (0) 2021.05.14
Python3 - Music playList  (0) 2021.05.12
Python3 - Git & Github(2)  (3) 2021.05.08
Python3 - intro  (0) 2021.05.07
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함