본문 바로가기
  • Survival Plan
IT 이야기

Git 기본 경험하기

by IT/머신러닝 엔지니어의 독서/경제/육아 공부 리치윈드 - windFlex 2020. 3. 10.

git의 기초

 

git config --global user.name "이름"
git config --global user.email "깃허브 메일주소" // 매번 물어보는 귀찮음을 피하기 위해 설정.

mkdir ~/MyProject   // 로컬 디렉토리 만들고
cd ~/myproject      // 디렉토리로 들어가서
git init            // 깃 명령어를 사용할 수 있는 디렉토리로 만든다.
git status          // 현재 상태를 훑어보고
git add 화일명.확장자  // 깃 주목 리스트에 화일을 추가하고 or
git add .           // 이 명령은 현재 디렉토리의 모든 화일을 추가할 수 있다.
git commit -m "현재형으로 설명" // 커밋해서 스냅샷을 찍는다.

git remote add origin https://github.com/username/myproject.git // 로컬과 원격 저장소를 연결한다.
git remote -v // 연결상태를 확인한다.
git push origin master // 깃허브로 푸시한다



https://git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80




GIT CI (Travis)

http://gompangs.tistory.com/84

 

 

동작 원리를 보면 위와 같은데, 개발자들은 소스를 소스 저장소(git, svn)에 커밋을 하게 되면(1)

버전 관리 시스템에서는 해당 변경사항을 fetching을 하게 된다(2)

 

--

여기서부터 CI가 동작하는 부분인데, 

 

CI에서는 해당 변경사항이 생긴 빌드를 빌드하고(3)

테스트를 하며(4) -> 이건 CI 솔루션에 따라 진행이 될 수도, 안될수도 있는 부분

성공/실패 여부를 판단한다(5)

 

그리고 구성된 환경에 따라 개발자들에게 Slack, telegram 등의 오픈소스 메신저나 메일, SMS등의 여러 방법으로 인지할 수 있게 통지를 해준다.

 

사실상 이러한 단계가 자동화가 되지 않으면 서비스를 배포하고 테스트할때마다 많은 비용이 들게 된다.

 

누군가(QA) 는 해당 빌드에 대한 테스트를 해야 하고, 그에 대한 테스트 결과 및 빌드 결과를 리포팅을 해줘야 하기 때문이다.

 

[git 간략 테스트]

 

사실, git에 대한 내용은 쉽지 않다. 

git의 History와, 기존 SVN (Subversion), CVS 등와 차이점 및 Git의 버전관리 방식 등을 이야기 하면 매우 복잡해 진다. 

그러나, git을 전문적으로 개발하거나, 깊게 관여하지 않을 경우, 

git에 대한 개념과 단순 명령어를 이해한다면, 프로젝트 진행 및 git과 유관된 생태계를 이해하는데 큰 무리가 없다고 할 수 있겠다. 

 

================================

좀 더 간략하게 이해 해 본다면,  git은 아래와 같은 경우의 시스템 버전이라 할 수 있다. 

 

매일 파일을 변경하고, (modified)

퇴근 시점에는 변경한 파일을 복사하여 번호를 매기고 저장한다. (versioning, git commit )

저장된 번호를 폴더별로 관리하고, 필요에 따라서는 원격지에 백업한다. (git server들)

 

사실, 혼자서 개발한다면, “.git”폴더를 매일 원격지에 “날짜별로” 저장을 해 두어도 된다. 

그러나, 협업을 위해서라면 이것 또한 만만치 않게 된다. 

==============================================



Git을 시작하면서, Git의 저장 방식 (Snapshot 등) 및 원리들을 거론하는 것은 흥미를 떨어 뜨릴 수 있다. 

따라서, 간략한 사용법을 위주로 거론하고, 추가적인 관심이 있을 경우 심화학습을 하는 것이 선호된다. 



“ git 이라고 하면, 원격 저장소에 버전관리를 한다… “라고 생각하는 경우가 많으나, 

사실, git은 로컬PC에 저장 (local repository) 된 버전관리 이다. 

(즉, 버전에 대한 내용은 로컬PC에 저장되어 있다.)

 

다만, git을 사용할 때, 협업을 위해서, git server (git daemon)  / GitWeb, Git hub 등 원격 저장소 저장/공유하게 하는데, 이러한 연동을 하기 때문에 원격저장소로 생각되는 경우가 많으나, 원칙적으로 버전정보는 로컬에서 수행 된다. 

( 이런 관점에서, git은 다른 개발자의 특정버전 전체를 로컬PC로 내려 받아 작업을 시작한다. git clone … ) 

 

정리하면, git은 버전을 관리하는 (형상관리)시스템 이며, 그 버전 정보는 Local PC에 저장된다. 

Local PC에 저장되어 있는 버전정보로는 협업을 하기 어려우므로, GitHub와 같이 원격지 (인터넷)에 존재하는 저장소(repository)에 저장해 두고, 공유/협업을 한다. 

 

ㅇ git은 파일의 버전의 히스토리와 각 버전별 소스 상태를 저장 (commit 기준)를 저장하고 있는 것이라 볼 수 있으며, 

ㅇ git hub는 이러한 버전/소스 정보들을 원격지에 저장/공유하는 저장소/포탈사이트 이다.

   ( 로컬PC에 저장된 git정보는 공유가 불가능하므로, 원격지에 저장하여 공유, 버전 파생…)

 

간혹, google을 검색하다 보면, github 사이트에 소스가 통째로 올라가 있는것을 발견하곤 하는데, git을 이용하여 특정 버전의 소스가 올라가 있기 때문이다. 

 

  git clone <github url> 

 

을 통하여 해당 버전 전체를 Download 받을 수 있다. 

Linux 환경에서 오픈소스를 설치하여 사용하게 되는 경우, git clone으로 다운 받아서 진행하는 경우가 다수 발생하는데, 

사실, git clone은 다운받아서 사용하라는 의미 보다는, 

현재 버전을 기점으로 새로운 branch로 개발하여 오픈소스에 기여하라는 의도가 담겨 있다. 



※ 주의 :  github에 버전이 통째로 올라가면 의도치 않은 파일이 인터넷에 공유 될 수도 있다.  

※ Git Hub 무료 버전은, Public 공유가 default 이며, Private 저장소 사용은 유료이다. 

※ 최근 GitHub가 MS에 인수됨에 따라, Private 저장소에 대한 신뢰도 등의 이슈로 git hub에서 다른 저장소로 이탈하는 사용자들이 다수 발생하고 있다고 한다.

 

이러한 이유로, 사설 저장소를 자체 구축하려는 움직임이 많아지고 있으며, 

오픈소스 사설 저장소 구축이 가능한 GitLab의 사용하는 사례가 증가하고 있다. 

상용 SW로, Atlatian 사의 BitBucket 등이 있다. 

 

따라서 아래와 같은 관심을 가져볼 만 한 사항이다. 

 

ㅇ 수행하는 프로젝트의 소스코드의 버전은 어떻게 관리되고 있을까?

   . 단순한 프로젝트의 경우, 수동 관리 (버전별 디렉토리 이름으로 수동 보관)하는 경우도

     나쁘지 않으나, 규모가 크다면 버전관린 툴을 고민해 볼 필요도 있다. 

ㅇ 혹시, Git / GitHub로 관리되고 있다면, 공유 문제는 없는지 점검

ㅇ 별도 사설 저장소 (Private Repository) 에 관리된다면, 해당 저장소가 무엇인지? 어디에 있는지 ? 공유 범위는 어떻게 되는지… 등 점검 필요.

 

※ 당사는 T-DE에서 BitBucket을 사용하고 있다. 다만, BitBucket의 접근 경로의 범위가 어떠한지는 다시 한번 점검이 필요하다. . ^^;;;



자..!!  그럼, Git 명령어를 한번 살펴 보도록 하자. 



우선 Local PC에서 버전관리 (Git)에 대하여 간략히 알아 보고, 

원격 저장소





git init  ⇒ 버전 관리를 하는 git 의 저장소를 생성/초기화 한다. 

    ⇒ 버전 관리 대상으로 가서, git init 실행하면,   “ .git “ 이라는 디렉터리가 생성 된다. 

    ⇒ “ .git “ 내부에 버전 관리하는 내용이 저장되어 있다. 

 

생성된 “.git” 디렉터리 내부에 들어가 보면,

 



자 이제 Test 파일을 하나 만들어 봅시다. (파일명: f1.txt)

내용은 간략하게 “test 001” 이라는 내용을 써넣었습니다. 

 

처음으로 Git 명령어를 사용해 보겠습니다. 

사용할 명령어는 Status를 확인하는,

git status

입니다. 

 

위 이미지에서 보면, git status 명령어를 사용했을 때, 

“ Untracked files”  f1.txt  

라는 문구를 확인 할 수 있습니다. 

이것은, 현재 디렉터리 범위에서 git이 버전관리를 하는데, f1.txt는 관리하고 있지 않는다는 것입니다.  (시야에는 들어오나 관리 대상은 아니다…)

 (※ git의 버전관리 대상은 2가지 상태가 있습니다. ) 

   -  Tracked : 버전 관리중, 변경사항 체크, 복원 등 

   -  Untracked : 버전 관리하는 범위내(working directory)에는 있지만, 관리자 대상은 아님




그럼 (버전)관리 대상으로 포함을 시켜야 겠지요?

 

git add f1.txt

그리고 git status 로 다시 확인하면, f1.txt 파일에 신규 관리대상으로 추가된것을 알 수 있습니다. 

대상으로 추가할 때, 아래와 같이 wildcard를 사용한 범위로 추가가 가능하다. 

git add *.*

좀 더 정확하게는, 범위 or 디렉터리 단위로 추가해야 하나, 불필요한 파일 때문에, 

낱개 파일 추가가 있는것으로 이해할 수 있다. 

 

또다른 방법으로, 매번 git add를 하지 않고, commit 의 -a (--all) 옵션을 사용하는 방법이 있다. 

 ( git commit -a :  git add를 별도로 하지 않고 모든 수정/삭제/변경된 파일을 commit 한다.)

 

전체가 commit 대상이 되는 경우, 제외할 대상을 별도로 선택하는 방법을 취하기도 한다. 

(※  “ .gitignore “ 이름으로 파일을 하나 만들고, 제외할 패턴을 등록하면 된다.)

 아래는  .gitignore 의 예제이다.  “ *.[oa] “ 는 확장자가 o 또는 a 인 파일은 제외 한다는 의미.

$ cat .gitignore
*.[oa]
*~



잠깐….

본격적으로 버전 관리를 하기에 앞서, 사용자 정보를 등록해야 한다. (1회 만 하면 된다.)

아래와 같이, user.name과 email 정보를 입력한다. 

(누가 해당 버전을 생성하였는지 알기 위한 사용자 정보이다. )

(생략할 경우, 해당 client PC에서 정보를 읽어서 자동 설정을 하지만, 정보를 직접 입력하도록 하자.)




본격적으로 버전관리 Git을 사용해 보자. 

현재까지는 버전관리 대상만 지정했을 뿐, 버전이 파생 되지 않았다. 

파일을 변경하여도, 파일은 변경되었으나, 새로운 버전이 만들어지지는 않은 상태이다. 

(※ 버전이라 함은, 변경된 내용이 어느정도 마무리 되어 commit를 실행한 상태로 보면 된다.)



git commit를 통해서, 버전을 등록하자.

- git commit -m ‘version 0.1’

 

입력 유형은 git commit -m ‘해당 버전에 대한 메세지’ 를 입력한다. 

아래 실행 결과 이미지를 참조하면, version 0.1에 대해 신규 버전 등록 (commit) 되었음을 확인 할 수 있다.



또한, 

- git log

명령어를 통하여, commit 한 히스토리를 확인할 수 있으며, 

등록된 user.name , email 정보로 q신규 버전이 등록 (commit)되었음을 확인 할 수 있다. 

(버전의 흐름은 master이다. 버전 관리의 흐름에 따라 별도 branch를 생성할 수 있다. )



[ 버전 변경 - commit ]

 

이번에는, 기존 f1.txt를 내용을 변경해 본다. ( “test 002”라는 내용을 추가 하였다. )

 

그리고 나서, git status로 상태를 확인해 보자.

 

“modified : f1.txt” 라는 상태가 되었다. 

현재 이 상태는 아직 신규 버전이 등록된 상태는 아니며, commit이 되어야만 신규 버전이 등록된다. 

 

유의할 점은,

신규 버전을 등록하기 전에 “git add”명령어도 다시 대상을 지정해 주어야 한다. 

(그렇지 않으면, 기존 대상에서 변경 사항 없음 - no changes - 를 표기하게 된다. )

 

따라서 다음과 같이, 3개의 명령어를 입력해 보자

 - git add f1.txt

 - git commit -m ‘version 0.2’

 - git log

 

 

변경된 f1.txt를 version 0.2로 등록하고, 등록(commit) 버전 이력을 확인하였다. 

 

[변경 사항 확인]

 - git log [버전 commit hash]

 - git diff [버전 commit hash 1] [ 버전 commit hash 2]

 

git log 옵션 중에서 -p를 사용하면, 버전의 변경내용을 확인 할 수 있다. 

 

git diff 명령어를 사용하면, modified 상태에서 마지막 commit 상태와의 소스코드의 차이를 확인할 수 있다. ( 오늘 하루 종일 작업 했는데,,, 뭐가 수정된거지?? 마지막으로 commit하기 전에 확인해 보자…!! )

 

※ 또한, 지정된 버전간 차이를 확인하기 위해서는, 아래 명령어를 사용할 수 있다.)

git diff <version 1 commit hash> <version 2 commit hash> 



[과거 버전 원복]

 

ㅇ git reset <version commit hash>

ㅇ git revert  < version commit hash>







===========================

Git 자체도 버전관리로 수 많은 commit 로 구성되어 있다. 

[원리]

ㅇ git 명령어를 수행했을 경우, .git 디렉토리에는 어떤 변화가 있는가?









echo "# test001" >> README.md

git init

git add README.md

git commit -m "first commit"

git remote add origin https://github.com/username/test001.git

git push -u origin master



================================================

사용자를 미리 지정하려면,

git remote add origin https://username@github.com/username/test001.git

 

사용자 이름, 이메일 정보 수정

git config --global user.name “username”

git config --global user.email “user-email@mailserver.com



two factor 인증을 걸어놓으면, 

windows에서 “git push -u origin master “를 실행할 때, 

Credential Error가 발생함.. ㅜ_ㅜ (2FA를 Disable 해주면 동작한다.)





댓글0