M1 tensorflow Test Preview

개요

  • M1에서 Tensorflow 테스트를 진행해본다.
    • 현재 M1 시스템 환경은 아래와 같다. (2021-01-16)

주의: 텐서플로 공식 버전은 아님

라이브러리 설치

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/apple/tensorflow_macos/master/scripts/download_and_install.sh)"
Installation script for pre-release tensorflow_macos 0.1alpha1.  Please visit https://github.com/apple/tensorflow_macos 
for instructions and license information.

This script will download tensorflow_macos 0.1alpha1 and needed binary dependencies, then install them into a new 
or existing Python 3.8 virtual enviornoment.
Continue [y/N]? 
  • 위 질문이 나오면 y 입력한다.

Ch07_data_upload

공지

  • 구글 빅쿼리 책 Chapter 4장 학습
  • 참고 교재는 아래와 같다.

개요

  • 로컬에서 데이터를 업로드 해본다.

데이터 다운로드

  • 깃허브에서 데이터를 다운로드 받는다.
$ git clone https://github.com/onlybooks/bigquery.git
  • ch04 폴더로 이동한 뒤, 실제 압축된 파일의 내용을 페이지 단위로 확인해본다.
  • 먼저 ch04 폴더로 이동한다.
  • zlees 명령으로 데이터를 확인해본다.
$ cd bigquery/ch04
$ zless college_scorecard.csv.gz
  • 명령을 실행한 후 스페이스 이용하여 페이지 단위로 데이터 확인 후, 종료하려면 q키를 누른다.
  • zless는 .gz과 같은 파일을 풀지 않고 Preview 형식으로 볼 수 있도록 도와준다.

bq 명령줄 도구

  • bq에 대해 자세히 확인하려면 아래 싸이트에서 확인하기를 바란다.
  • bq 명령줄 도구는 빅쿼리 플랫폼상의 빅쿼리 서비스를 사용하기 위한 편리한 명령들 제공
$ bq --location=US mk ch04
Dataset 'biggquerysample:ch04' successfully created.

에러 상황 1.

  • 다음과 같은 에러 메시지가 발견이 되면 프로젝트를 세팅해줘야 한다.
$ bq --location=US mk ch04
BigQuery error in mk operation: Not found: Project biggquerysample2
  • 대개의 경우, project 세팅을 해줘야 한다.
$ gcloud config set project your_project_ID

데이터 로드

  • 이제 데이터를 빅쿼리 내부의 테이블로 로드하는 명령을 수행해보자.
$ bq --location=US load --source_format=CSV --autodetect ch04.college_scorecard ./college_scorecard.csv.gz
Upload complete.
Waiting on bqjob_r1c47395bddea55ee_00000176e0b2548e_1 ... (37s) Current status: DONE 

에러 상황

  • 필자는 에러 상황이 발생하지는 않았다.
  • 교재에서는 에러가 발생할 수도 있다고 하였다.
Could not parse 'NULL' as int for field HBCU (position 26) starting at location 11945910
  • 위 문제는 데이터 상에 NULL값이 발생해서 생긴 값이다.

Ch06_gcloud_projects

개요

  • MacOS m1, Big Sur에서 gcloud 환경 세팅을 해본다.
  • 목표는 gcloud를 설치 한 뒤, 신규 프로젝트를 설치하도록 한다.

gcloud projects list

  • 현재 active project를 실행하여 보여주는 명령어를 실행하여 확인한다.
    • 프로젝트는 각 계정마다 조금씩 다를 수 있다.
$ gcloud projects list
PROJECT_ID       NAME             PROJECT_NUMBER
biggquerysample  biggquerysample  826877287968

New gcloud projects

  • 이제 새로운 프로젝트를 만들어본다.
$ gcloud projects create bigquerysample2
Create in progress for [https://cloudresourcemanager.googleapis.com/v1/projects/your_project_name].
Waiting for [your_number_will_be_created] to finish...done.                                                                                        
Enabling service [cloudapis.googleapis.com] on project [bigquerysample2]...
Operation "your_number_will_be_created" finished successfully.
  • 이제 새로운 프로젝트가 생겼는지 다시 확인해본다.
$ gcloud projects list
PROJECT_ID       NAME             PROJECT_NUMBER
biggquerysample  biggquerysample  826877287968
bigquerysample2  bigquerysample2  641510072575

새로운 프로젝트 이동

  • 먼저 gcloud config list로 실행하면 아래와 같이 project=bigquerysample로 세팅이 되어 있는 것을 확인할 수 있다.
$ gcloud config list
[core]
account = yourname@gmail.com
disable_usage_reporting = False
project = biggquerysample

Your active configuration is: [default]
  • 기존 gcloudbiggquerysample에서 biggquerysample2로 이동해보자.
$ gcloud config set project biggquerysample2
$ gcloud config list
[core]
account = yourname@gmail.com
disable_usage_reporting = False
project = biggquerysample2

Your active configuration is: [default]

Reference

Warrick.(2020). Setup and Switch Between Google Cloud Projects in the SDK. Retrieved from https://medium.com/google-cloud/setup-and-switch-between-google-cloud-projects-in-the-sdk-885c5000624c

Ch05_gcloud_settings

개요

  • MacOS m1, Big Sur에서 gcloud 환경 세팅을 해본다.
  • 목표는 gcloud를 설치 한 뒤, 신규 프로젝트를 설치하도록 한다.

Cloud SDK 시작 전

  • MacOS에서는 Python이 필요하다.
  • 지원되는 버전은 Python3(권장, 3.5 ~ 3.8) 및 Python 2 (2.7.9) 이상이다.
  • 만약 Python이 설치되지 않았다면 추가로 설치를 진행해야 한다.

Cloud SDK 시작

  • 필요한 파일 및 설치 참고 자료는 공식홈페이지: 빠른 시작: Cloud SDK 시작하기 에서 확인한다.
  • 압축 파일을 풀고 해당 경로로 이동한다.
  • 이 때, 환경문제가 발생할 수 있으니, 가급적 .sh 스크립트를 실행한다.
  • 다음과 같이 실행한다.
$ cd google-cloud-sdk
$ ./install.sh
.
.
Do you want to help improve the Google Cloud SDK (y/N)? y
.
.
Modify profile to update your $PATH and enable shell command 
completion?

Do you want to continue (Y/n)? N

Cloud SDK 초기화

  1. 명령 프롬프트에서 다음 명령어를 실행하면 로그인 등을 진행해야 한다.
  • 먼저, GCP 프로젝트 폴더를 만들고, 해당 경로로 이동한다.
$ mkdir GCP
$ cd GCP
  • 이제 초기화를 진행한다.
$ gcloud init
  1. Google 사용자 계정을 사용하여 로그인 한다.
To continue, you must log in. Would you like to log in (Y/n)? Y
  1. 그러면, 구글 사용자 계정에 로그인하고 허용을 클릭한다.
  2. 터미널에서 본인으 프로제트를 선택하거나 또는 신규 프로젝트를 선택한다.
This account has a lot of projects! Listing them all can take a while.
 [1] Enter a project ID
 [2] Create a new project
 [3] List projects
Please enter your numeric choice:
  1. Google Compute Engine API를 사용 설정한 경우 gcloud init을 사용하여 기본 Compute Engine 영역을 선택할 수 있습니다.
Which compute zone would you like to use as project default?
 [1] [asia-east1-a]
 [2] [asia-east1-b]
 ...
 [14] Do not use default zone
 Please enter your numeric choice:
  • gcloud init은 설정 단계를 성공적으로 완료되었다.
gcloud has now been configured!
You can use [gcloud config] to change more gcloud settings.

Your active configuration is: [default]

gcloud 실행 완료

  • SDK 설치에 대한 정보를 보려면 gcloud 명령어를 실행해보자.
$ gcloud auth list
[core]
account = jhjung@dschloe.com
disable_usage_reporting = False
project = bigquerysample

Your active configuration is: [default]
  • 위 내용까지 잘 출력이 되면, 정상적으로 출력이 된 것이다.

참고자료

빠른 시작: Cloud SDK 시작하기: https://cloud.google.com/sdk/docs/quickstart

Kaggle Countplot with Text using Seaborn

강의 홍보

개요

캐글 데이터 연동

  • 캐글 데이터를 구글 드라이브에 업로드 한 뒤 구글 코랩과 연동한다.
  • Kaggle API를 통해 데이터를 불러올 수도 있지만, 수동으로 다운로드 받은 뒤 드라이브에 업로드 하였다.
# Mount Google Drive
from google.colab import drive # import drive from google colab

ROOT = "/content/drive"     # default location for the drive
print(ROOT)                 # print content of ROOT (Optional)
drive.mount(ROOT)           # we mount the google drive at /content/drive
/content/drive
Mounted at /content/drive
# import join used to join ROOT path and MY_GOOGLE_DRIVE_PATH
from os.path import join  

# path to your project on Google Drive
MY_GOOGLE_DRIVE_PATH = 'My Drive/Colab Notebooks/competition/kaggle/2020 Kaggle Machine Learning'

PROJECT_PATH = join(ROOT, MY_GOOGLE_DRIVE_PATH)
print(PROJECT_PATH)
/content/drive/My Drive/Colab Notebooks/competition/kaggle/2020 Kaggle Machine Learning
%cd "{PROJECT_PATH}"
/content/drive/My Drive/Colab Notebooks/competition/kaggle/2020 Kaggle Machine Learning

라이브러리 & 데이터 불러오기

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

pd.set_option('mode.chained_assignment', None)
survey = pd.read_csv('./data/kaggle_survey_2020_responses.csv')
question = survey.iloc[0,:].T
full_df = survey.iloc[1:,:]
full_df.shape
/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py:2718: DtypeWarning: Columns (0) have mixed types.Specify dtype option on import or set low_memory=False.
  interactivity=interactivity, compiler=compiler, result=result)





(20036, 355)

데이터 전처리

  • 우선 IndiaUSA를 제외한 나라는 삭제하도록 한다.
  • 출력된 결과를 확인해보면 알겠지만, 행이 대폭 감소한 것을 확인할 수 있다.
full_df['Q3'].replace({'United States of America':'USA'}, inplace=True)
df1 = full_df[(full_df['Q3']=='India')|(full_df['Q3']=='USA')]
df1.reset_index(drop=True, inplace=True)
print(df1['Q3'].unique())
df1.shape
['USA' 'India']





(8088, 355)

1차 데이터 시각화

  • 이제 countplot()을 활용하여 시각화를 진행한다.
sns.countplot(x = 'Q4', hue = 'Q3', data = df1)
<matplotlib.axes._subplots.AxesSubplot at 0x7f3bbad50ac8>

png

matplotlib 03_2 Scatter Plot

강의 홍보

산점도 그래프

산점도는 두 수치형 변수의 분포를 비교하고 두 변수 사이에 상관 관계가 있는지 여부를 확인하는 데 사용됩니다. 데이터 내에 구별되는 군집/분할이 있으면 산점도에서도 명확해집니다.

(1) 라이브러리 불러오기

필요한 라이브러리를 불러옵니다.

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

(2) 데이터 생성

이번에는 seaborn 패키지 내 tips 데이터를 활용합니다.

(Mac) Python 기본 환경설정 및 주피터 노트북 설치

개요

  • M1 맥북을 구입 후, 환경 설정을 하다보며, 기록을 남기기로 하였다.
  • 환경변수에 대해 살짝 다루도록 한다.
  • Jupyter Notebook 설치를 진행해본다.
    • Note: 아나콘다가 아닌, Python 공식홈페이지에서 다운 받은 것을 전제로 한다.

설정 1. zsh to bash 환경으로 바꾸기

  • 필자는 zsh는 잘 쓰지 않았다.
  • 그런데, Mac은 Default로 bash 환경을 쓴다.
  • 써보지 않았기에, bash로 바꾸도록 한다. (쉽다!)
$ chsh -s /bin/bash
  • 위 설정을 진행한 후, 터미널을 종료한 뒤 다시 시작한다.
  • 만약, 현재 쉘 스크립트를 알고자 하면 아래와 같은 명령어를 입력하도록 한다.
$ echo $SHELL
/bin/bash

설정 2. 파이썬 환경설정

  • 먼저 아래 코드를 실행한다.
$ cd ~
$ ls -a
.			.ipython		.zshrc
..			.local			Applications
.CFUserTextEncoding	.matplotlib		Desktop
.DS_Store		.python_history		Documents
.Rhistory		.r			Downloads
.Trash			.rstudio-desktop	Library
.bash_history		.ssh			Movies
.bash_profile		.viminfo		Music
.bash_profile.swp	.zprofile		Myblog
.bash_sessions		.zprofile.swp		OneDrive
.config			.zsh_history		Pictures
.gitconfig		.zsh_sessions		Public
  • 위 파일 중에서 특히 관심을 가져야하는 파일은 두가지다

Hugo Blog 옮기기

개요

  • 새로운 맥을 구입하면서 생긴 여러 에러를 해결하면서 기록으로 남겼다.

선수 학습

  • 본 포스트는 기존 hugo 깃허브 블로그를 운영중인 독자들을 위한 글이다.
  • 만약 깃허브 블로그를 처음 만드시는 분은 공식 홈페이지를 참조하기를 바란다.

기존 블로그 활용

  • 필자는 blog라는 깃허브 repo가 존재하였음
  • 따라서, blog 레포를 내려 받았다.
$ git clone https://github.com/yourname/your_repo.git

상황 1. submodule에 대한 충분하지 못한 이해

  • 필자가 실수한 것이 있다.
  • github에서 submodule은 영어 단어 그대로, 서브 모듈이다. 즉, 한개의 메인 프로젝트가 존재하지만, 다른 프로젝트는 공통으로 사용할 모듈이라는 뜻이다.
  • 다시 정리하자면,
    • 필자에게 메인 프로젝트는 blog 레포에 글을 남기는 것이다.
    • 필자가 필요한 것은 깃허브 블로그에 필요한 mainroad라는 테마(theme) 모듈과, 배포를 위한 public 모듈이다.
  • public은 필자의 깃허브 주소와 연동되어 있는 모듈이라고 생각하면 쉽다.
    • 즉, public과 필자의 깃허브 주소 레포와 하나로 연결되어 있기 때문에, 자동으로 배포가 되는 시스템이다.
  • 여하튼, 필자가 실수한 것은 바로, 저 public에 대한 서브모듈을 생각하지 못했고, 이 에러가 가장 치명적이었다.

해결방안

  • 어떻게 해결할까? Note: 순서를 꼭 잘 지키도록 한다
  • 우선, 깃허브를 내려받으면, 기존 publicthemes/your_theme는 삭제한다.
    • 이유: 캐시가 남아 있는데, 위 두개 삭제를 하지 않으면 에러의 무한루프에 빠진다.
    • 아래 코드는 에러의 한 예다.
blog % git commit -m "updated"
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
        modified:   themes/mainroad (modified content, untracked content)

no changes added to commit
  • 위 에러가 발생이 되면, 안된다. 즉, 무언가 제대로 삭제가 되지 않았다는 뜻이며, 폴더가 없음에도 위와 같은 에러가 발생이 되면 그 때는 아래 명령어를 추가하도록 한다.
$ git rm -r --cached themes/mainroad
  • 이 때, 중요한 것은, 삭제 후, git push 까지 진행해야 한다.
$ rm -rf public
$ rm -rf themes/your_theme
$ git add .
$ git commit -m "your commit msg"
$ git push origin master(or main)
  • 이제부터가 중요하다. 순서를 지키도록 한다.
  • 먼저, theme부터 submodule을 진행한 후, 마지막으로 public에 대한 submodule을 설정한다.
    • 코드로 보면 다음과 같다.
$ git submodule add https://github.com/developer_name/your_theme.git themes/your_theme
$ git submodule add -b master git@github.com:your_name/your_name.github.io.git public
  • 이렇게 함으로써 blog 레포안에 있는 public 디렉토리는 your_name.github.io 주소와 연동이 끝나게 되는 것이다.

주의점

  • 필자의 경우, themes/my_theme안에 shortcodecss 코드 등을 추가하였다. 따라서, 이 코드 등도 당연히 추가가 되어야 한다.
    • 이 때에는 복사 붙여넣기로 대체 하도록 한다.

상황 2. ssh keygen의 필요성

  • 필자는 새로운 맥에어 m1을 구입하였기 때문에, SSH Key값을 만들어야 한다.
  • 검색을 통해서 쉽게 구할 수 있기 때문에, 자세한 내용은 메뉴얼을 참고한다. +
  • 코드로 구현하면 아래와 같다.
$ cd ~/.ssh
$ ssh-keygen -t ed25519 -C "your_email@example.com"
> Generating public/private ed25519 key pair.
> Enter a file in which to save the key (/Users/you/.ssh/id_ed25519): [Press enter]
> Enter passphrase (empty for no passphrase): [Type a passphrase]
> Enter same passphrase again: [Type passphrase again]
$ cat ~/.ssh/id_ras.pub
  • 이때, 출력값 전체(이메일 포함)하여 복사 한후, 깃허브 계정에서 [Settings]-[SSH and GPG Keys]-[New SSH Key]를 클릭하며 붙여 넣기 한 후 저장한다.
  • 그런데, 하나 주의해야 하는 것은, 이대로 끝내면, 블로그를 업데이트 할 때마다, 계속 비밀버호를 입력하라고 한다. 매우 귀찮기 때문에, 아래와 같은 코드를 실행한다.
$ ssh-add ~/.ssh/id_rsa
$ eval $(ssh-agent)

상황 3. 버전 문제

  • 모두에게 해당 사항이 안될 수도 있다.
    • 현재 필자가 겪는 에러이다.
$ WARN 2020/10/12 13:40:31 Failed to get translated string for language "en" and ID "authorbox_name": template: :1:9: executing "" at <.Count>: can't evaluate field Count in type string

블로그 옮기기 성공

  • 이 글을 보고 있다면, m1에서 처음 작성하여 성공적으로 올린 글을 보게 되는 것이다.
  • 즉, 필자는 성공하였다.
    • hugo의 가장 큰 어려움은 사실 한글자료가 많지 않다.
    • 이 글을 보는 hugo 사용자에게 작은 도움이 되기를 바란다.

Git 명령어 중급편

개요

  • 커밋을 하기 전에 확인해야 할 기본적인 명령어 등을 확인해본다.
  • tracked 상태의 파일을 untracked 상태로 변경하는데, 스테이지에 등록하는 것과 반대 과정이라고 보면 된다.
  • stage 상태에 있는 것을 unstage 상태로 변경하려면 삭제(rm)나 리셋(reset) 명령어를 사용한다.

파일 등록 취소

  • rm 명령어로 삭제 하려면, 기억해야 하는 것은 스테이지 영역에서만 등록된 파일을 삭제하려면 --cached 옵션을 함께 사용한다.
$ git rm --cached main.py
rm 'main.py'
  • 캐시 목록에서 파일이 삭제가 된 이후에 git status를 실행해본다.
$ git status 
On branch master
Changes to be committed:
    (use "git reset HEAD <file>..." to unstage)
        deleted: main.py
Untracked files:
    (use "git add <file>..." to update what will be committed)
        main.py <-- 스테이지 삭제
nothing added to commit but untracked files present (use "git add" to track)
  • 사실 이 때 부터가 조금 중요하다.
  • deleted: main.py의 뜻은 삭제 또는 변화된 것으로 간주하기 때문에, 이 때에는 리셋 후 정리하라는 명령어이다.
$ git reset HEAD main.py ---> 리셋 시도
  • 그리고 다시 status 명령어를 실행하면 정상적으로 커밋이 정리가 된다.
$ git status --> 상태 확인
On branch master
nothing to commit, working tree clean

파일 이름 변경

  • 파일 이름 변경시에는 git mv old_file_name new_file_name와 같이 작업하면 된다.
    • 단, 이 때 주의해야 하는 것은 파일의 경로다.
$ git mv folder/main.py folder/test.py
  • 이와 같은 형태로 수정을 해줘야 한다.
  • 만약, fatal: not under version control, source=folder/main.py, destination=folder/test.py와 같은 에러가 발생을 한다면, 이 때는 새로 추가된 파일을 git add를 하지 않은 untracked 상태인 것을 재 확인한다.

git commit의 의미

  • commit은 크게 HEAD와 스테이지를 결합하여 새로운 객체를 만드는 것과 유사하다. 즉, 변경된 파일의 차이를 깃 저장소에 기록하는 것을 말한다.
  • 그런데, 변경된 파일을 구별하려면 별도의 메시지를 같이 작성해야 하는데, 이를 커밋 메시지라고 해야 한다.
  • 조금 더 쉽게 설명하면 아래와 같다.
    • 제안서 작업을 하기 위해 워드파일을 만들 때, 다음과 같이 저장하는 경우가 종종 있다.
    • 예) 제안서_1201.docx, 제안서_1202.docx
    • 두 문서 사이에는 당연히 차이가 발생한다.
  • 이 때 문서명과 서로 다름을 표시해주는 역할을 해주는 것이 메시지라고 보면 된다.
    • 따라서, 커밋 메시지는 반드시 작성해야 한다.
  • 이제 커밋 메시지를 남긴다.
$ git commit -m "message"

git commit후의 수정

  • git commit이 실행한 뒤에는 git status를 실행해보면 다음과 같다.
$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean
  • 이 상태가 되면 git push를 하면 된다.

파일 수정

  • 그런데, git push 이후에 수정할 것이 생겼다고 가정해보자.
  • 파일을 수정하면 modified 상태로 돌아가게 된다.
    • 그런데, 수정하는 과정에서 파일을 잘못 수정할 수도 있다.
  • 깃을 이용하면 수정한 파일을 커밋 전 마지막내용으로 쉽게 되돌릴 수 있다. 즉 이전 커밋으로 되돌리는 명령어는 다음과 같다.
  • 다만, 이 때에는 커밋 이후에 작업한 수정 내역은 모두 삭제가 된다.
$ git checkout -- 수정파일 이름
  • 수정한 파일은 다시 등록해야 한다.
    • 반복되는 내용이기에 생략한다.
$ git add 수정파일이름
$ git status
$ git commit -m "00 file updated"

git commit 취소

  • 이번에는 파일 수정이 아니라, 커밋을 취소하는 방법이다.
  • 그런데, 이 때에도 주의해야 하는 것은 취소한 해당파일들을 stage로 보낼 것인지, 아니면 unstage로 보낼 것인지를 결정해야 한다.
  • 시나리오는 다음과 같다.
  • 새로운 test.py을 만들어 1차 커밋을 한 뒤, 파일을 재 수정하여 2차 커밋을 진행한 상태이다. (물론, git add 포함)

방법 1. stage로 돌려보내기

  • commit취소 후, 해당 파일들은 staged 상태로 워킹 디렉터리에 보존하는 방법이다.
$ git reset --soft HEAD^
$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   test.py
  • 여전히 modified 된 상태이며 여전히 워킹 디렉터리 상태에 있음을 확인할 수 있다.
  • 이 때에는 git add만 해준다.

방법 2. unstage로 돌려보내기

  • 방법1과 동일하지만 종착지가 다른 경우이다.
$ git reset --mixed HEAD^
$ git reset HEAD^
$ git reset HEAD~2 // 마지막 2개의 commit을 취소
  • 필자는 git reset –mixed HEAD^를 사용했다.
$ git reset --mixed HEAD^
Unstaged changes after reset:
M       kaggle/test.py
$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   test.py

no changes added to commit (use "git add" and/or "git commit -a")
  • 첫번째 했을 때와 조금 다른 결과값을 나오는데, 아직까지는 현재는 modified 이고 워킹 디렉터리에 보존되는 것을 확인할 수 있다.

방법 3. unstage로 돌려보내고 워킹 디렉터리에서 삭제

  • 방법1과 방법2는 파일들을 삭제하지는 않지만, 다음 명령어를 이용하면 워킹 디렉터리에서 삭제하는 것이다.
$ git reset --hard HEAD^
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean
  • 이 때에는 modified 상태가 없다.
  • 또한, 기존에 작업했던 소스코드들이 아예 사라지는 것을 확인할 수 있다.

요약

  • 기본편과 마찬가지로 stagedunstaged의 개념은 여전히 중요하다.
  • git commit취소하는 방법은 크게 3가지가 있지만, 방법 3을 사용하게 되면 기존 코드가 삭제되는 경향이 있으니 주의한다.

Reference

Git 명령어 기본편

개요

  • 깃 명령어의 기본적인 명령어를 실행하는 것을 목표로 한다.
  • 깃 설치 및 깃허브 설치는 기존 게시글을 확인해본다.

Git 환경설정

  • git 명령어를 입력 시, 제대로 실행되지 않았다면 환경변수를 추가한다.
    • 윈도우에서 제어판을 실행한 후 시스템 > 고급 시스템 설정 > 고급 > 환경 변수를 작성한다.
  • 시스템 변수 항목에서 Path를 더블클릭하도록 한다.
  • 환경 변수 편집 창에 C:\Program Files\Git\cmd 경로를 추가한다.
    • 영상을 통해서 한번 보도록 한다.

Git 기본문법

  • git의 명령어의 기본 문법은 아래와 같다.
$ git 명령어 또는 옵션
  • 이 때, 옵션은 짧은 옵션(-)과 긴 옵션(–)으로 구분한다.

Git Version

  • 다음과 같이 작성한다.
$ git --version
git version 2.28.0
  • 깃 명령어를 여러개 묶어서 사용도 가능하다. 이 때에는 세미콜론(;)으로 구분한다. (예)
$ git --version; git status
(출력 생략)

Git 환경설정

  • git을 설치한다고 해서 바로 github와 함께 쓸 수 있는 것은 아니다.
  • 이 때 config 명령어를 사용한다.

글로벌 사용자

  • 로컬 사용자 등록도 다음과 같은 명령어를 통해 생성이 가능하다.
  • 먼저 cd 명령어를 통해서 깃의 저장소가 있는 폴더로 옮긴 뒤 git config 명령어를 실행한다.
$ cd 저장소 폴더
$ git config user.name "사용자이름"
$ git config user.email "이메일주소"
  • 깃에서 사용자를 구분하는 데 쓰는 “사용자 이름"과 “이메일 주소” 중 이메일 주소는 깃이 개발자를 구별하는 고유의 키 값으로 사용한다.
  • 이 때에는 해당 저장소에서만 사용이 가능한 것이지, 로컬 환경 내 다른 저장소는 해당이 되지 않는다.
    • 즉, 혼자서만 사용이 가능하다면 매우 불편하다.
  • 혼자서 사용하기 좋은 글로벌 옵션을 추를 한다.
    • 즉, 글로별 옵션을 권장한다.
$ git config --global user.name "사용자이름"
$ git config --global user.email "이메일주소"

환경 설정 파일

  • 환경 설정 파일은 보통 .git/config 파일 형태로 저장되어 있다.
  • 몇몇 명령어를 입력하여 보자.
    • Note: 각 개개인마다 기본 환경이 다를 수 있으니, 참조 바란다.
$ ls .git
COMMIT_EDITMSG  HEAD            config          hooks           info            modules         packed-refs
FETCH_HEAD      ORIG_HEAD       description     index           logs            objects         refs
  • 만약 config 파일을 찾았다면 다음과 같이 코드를 작성한다.
    • 마찬가지로, 결과물은 설정에 따라 다를 수 있다.
$ cat .git/config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = true
[user]
        name = 사용자이름
        email = 이메일주소
  • 만약 파일을 수정하고 싶다면, 편집기를 활용해서 수정하도록 한다.
    • code, vim, emacs, etc 등 다양한 편집기가 있다.
$ code .git/config
  • pycharm 사용자의 경우 다음과 같이 사용하면 파일이 열리기도 한다.
$ open .git/config

깃 개념

  • 우선 폴더 생성 후에는 초기화 명령어를 입력한다.
$ git init 경로명
  • 초기화 명령어를 입력 시, 경로명을 입력하지 않으면, 현재 폴더에서 초기화된다.
$ git init .
Initialized empty Git repository in 경로

git add의 뜻

  • 깃의 동작을 이해햐려면 먼저 워킹 디렉터리 또는 트리라고 한다.
  • 우선 두가지만 기억하면 된다.
    • untracked 상태: 실제 작업파일 및 폴더가 있는데, 이 공간을 자동으로 추적하지 않는다. 즉, 새로 만든 파일은 모두 untracked 상태인 것이다.
    • tracked 상태: Git이 추적을 할 수 있도록 git add 명령어를 사용한다.
  • 깃은 요청받은 파일들만 추적 관리한다.

git add의 뜻, stage & unstage

  • 추적 상태가 된 뒤에는 임시 영역에 해당되는 스테이지 공간으로 들어간다.
  • 즉, git add가 끝나면 커밋을 하기 전 단계인 임시 영역으로 들어가게 된다.
  • 이 때 구분점은 stage 상태와 unstage 상태와 구분된다.
    • 그러나, 실질적으로는 대개의 경우 tracked 부분과 untracked 부분의 영역은 크게 차이가 없다.
  • 그런데, 예외가 있는데, 스테이지 영역에 있는 파일과 워킹 디렉터리 안에 있는 파일 내용에 차이가 있을 경우 unstage 상태가 된다.
    • 즉, 파일이 수정할 경우 임시적으로 스테이지 목록에서 제거가 된 것이기 때문에 해당 파일만 git add로 추가하면 된다.
  • 이 쯤에서 git 라이프 싸이클을 그림으로 확인해본다.

git add의 뜻, modified & unmodified

  • 코드를 변경한다는 뜻은 파일을 수정한다는 뜻이다.
  • 그런데, 파일이 수정되면, 스테이지에서는 수정한 파일과 원본 파일을 구분하기 위해 수정함(modified)와 수정하지 않음(unmodified) 상태로 표현한다.
  • modified의 의미는 깃이 실제로 기록한 파일이며, 실질적으로 버전을 의미한다.
    • 이 때, 깃 commit을 하면 이 변경 내역은 영구적으로 기록된다.
    • 만약, 파일 수정을 하게 되면 이는 재 등록을 의미한다. 따라서 재 등록을 하려면 git add를 작성해야 한다.
  • unmodified의 뜻은 수정하지 않았음을 의미한다.

요약

  • 다양한 의견이 오갔기 때문에 한번 더 설명하면 아래와 같다. 즉, 스테이지를 기준으로 삼자.
  • modified는 unstage 상태를 말하며, 이 때에는 해당 파일을 git add 하라는 뜻이다.
  • 우리가 습관적으로 git add 한다는 뜻에는 이와 같이 다양한 logic이 내부적으로 돌아가고 있다는 뜻이기도 하다.

git status

  • 이러한 변화의 상태들을 확인하는 가장 좋은 방법은 git status를 의미한다.
  • 필자의 예를 들면 아래와 같다.
$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
  (commit or discard the untracked or modified content in submodules)
        modified:   content/Settings/git_basic.md

no changes added to commit (use "git add" and/or "git commit -a")
  • 여기에서 눈여겨 봐야 하는 것은 modified 영역이다.
    • 이 영역은 현재 필자가 작업중인 파일이다. 즉, unstage 영역이기 때문에, 이 때, git add를 진행해야 함을 의미한다.

.gitignore

  • 데이터 분석가들에게, 가장 어려운 부분은 데이터셋을 깃허브로 올리는가 하는 부분이다.
    • 아쉽지만, 간단한 샘플 데이터를 제외하면, 올리지 않는 것이 좋다. (용량 제한)
  • 이 때, .gitignore 파일에 불필요한 파일이나, 또는 숨기고 싶은 파일, 데이터셋의 경로등을 나열해서 적어둔다.
    • 여기에 파일 목록이 등록이 되면, 해당 파일은 tracked 되지 않는다.
  • 파일을 등록하는 방법은 직접 파일명을 작성하는 방법을 사용하거나, 또는 정규표현식을 사용하기도 한다.

Reference

이호진(2020). Git 교과서. 서울: 길벗. Retreieved from https://thebook.io/080212/