본문 바로가기

알아두면좋은IT상식

[Git&Github] 깃이란 무엇인가 그리고 깃허브는 어떻게 쓰는건가? part 1

<공부전 나의 생각>**************************************************

대부분의 회사에서는 고유의 git.net 이라고 팀원들과 함께 작업하는 공간이 존재한다. 사실 나도 깃을 써보았지만, 1달간의 대회 혹은 개인 코테 문제 저장소로만 사용을 하였다. add commit push만 할줄 아는 유치원생 인것이다. 아마 곧 쓰게 될것 같아서 팀워크의 핵심 기술인 git 을 이참에 제대로 공부할려고 한다. 책은 파이썬 코드로 배우는 Git & GitHub를 쓸려고 한다. 학교 도서관에서 있기도 하고 내가 파이썬을 선호하기 때문에 선정한 책이다. 오늘 내로 이걸 마스터 하는게 목적이다.

Git이란 무엇이고 어떤 동작원리를 가지는지 파악해보자!

 

<임시 의문점(곧 검색 예정)>**********************************************************

 

<공부중 필기>**********************************************************

# Git의 정의

소프트웨어가 고도화된 서비스를 제공하기시작하면서 체계적인 유지보수와 협업 기반 개발 프로세스 중요도가 강조

--> Git이 중요하게된 이유

 

 

# Git은 소스코드와 같은 파일들의 이력관리를 돕는 버전 관리 시스템

-속도가 빠름, 분산형 구조를 채택(대형 프로젝트 관리에 적합)

-여러사람이 협업&공유할수있는 환경을 제공

-BUT 다른 버전관리 도구에 비해 직관성이 떨어진다.( git 다루는법 공부가 필요한 이유)

 

 

# Git 설치와 시작

구글에 git 검색하면 gitbash 다운로드 창이 뜬다.전부다 설치하고 Gitbash를 실행한뒤 아래문구를 입력하자

git

이걸 입력하면 장문의 글이 나오는데 이러면 성공적으로 설치가 완료 된것이다.

 

 

# Git은 알았는데 그럼 Github는 뭐야?

Git: 분산버전관리 시스템

Github: Git을 바탕으로 한 웹 기반 호스팅 플랫폼 --> Git 서비스를 웹에서 동작하게 하며 공동 프로젝트 관리가 가능하게 한다.

 

 

# Github 홈페이지 가입

이후에 github 를 구글에 검색후 페이지에 들어가서 계정을 생성한다. (여기까지는 큰 문제가 없을것이다. 평소에 하던 회원가입 그대로 하면 된다.)

 

참고로 개인의 깃허브 계정 주소는 https://github.com/아이디 디 형태 이다.

나같은 경우는 https://github.com/minwocee 가 될것이다.

 

 

# Github 계정 홈페이지에 원격저장소(Repository)생성하기

나의 github 홈페이지에서 repository 생성 버튼을 클릭한다.

Owner: 저장소 소유자 아이디

Description: 저장소 관련한 간단한 설명을 기록하는곳

Add a README.file: 체크하면 저장소 생성시 다른사람들이 저상소의 자세한 설명을 볼수 있는 파일을 생성해준다.

Add gitignore: gitignore은 불필요한 파일들의 이름을 적어두면, 저장소에 올라가지 않는 기능을 하는 파일이다.(쓰레기 파일들이 공유되지 않게 깔끔한 관리를 가능하게 해주는 기능, Git이 이그노어 파일 안의 명단에 존재하는 대상을 무시)

참고로 해당 원격저장소  주소는 https://github.com/아이디/저장소이름  형태 이다.

 

이때 알아두어야 하는것은 https://github.com/아이디/저장소이름.git 주소이다. --> 실제 Git 명령으로 원격 저장소에 접근할때 사용되는 실제주소!!!! (나중에 clone 할때 주로 쓰인다.)

 

 

# 로컬저장소(내 노트북 내부에 있음) 생성하기

소스트리를 여기서는 쓰는데 나는 CLI에 익숙해지기 위해서 사용하지 않는다.

3가지 방법이 있다.

 

Clone: 원격저장소의 내용을 복제해서 로컬저장소 생성

소스트리에서 clone 버튼 누르면 입력창 3개가 뜨는데 위에서부터

-원격저장소 주소(https://github.com/아이디/저장소이름.git 이 해당됨)

-로컬저장소 내부경로(폴더 위치 절대경로)

-로컬저장소 이름(폴더이름)

Create: 오직 내 PC에만 로컬 저장소 생성(원격저장소랑 연결X)

Add: 이미 내 PC에 존재하는 로컬 저장소를 소스트리 인터페이스에 추가함(명단 등록)

 

아무튼 만약에 원격저장소에 readme 파일을 만들고 clone 해왔다면 로컬 저장소 폴더 내에 readme 파일과 .git(숨겨져 있음)이 존재한다. 여기서 .git 파일이 존재한다는것은 해당 폴더를 Git 저장소로 운영하고 있다는 증거이다!!!!!!

 

 

# 자주 쓰는 add commit push pull 이 어떤 기능을 하는가?

add: 로컬 저장소에서 내가 작업한 다음 수정된 상태를 기록, 워킹 디렉토리 --> 스테깅 에리어 이동하는 과정

@이 동작을스테이징 이라고도 부른다.

commit: 기록을 바탕으로 원격 저장소에 보내기전 임시 대기소 , 스테이징 에리어 --> 레포지토리 이동하는 과정

push: 로컬저장소 수정 사항을 원격 저장소에 반영한다. 

pull: 원격 저장소의 내용물을 로컬 저장소에 반영한다(push와 반대의 기능)

 

 

# Git의 3가지 핵심작업영역

Working Directory: 로컬에서 작업중인 파일이나 코드가 저장되는 공간(.git을 제외한 모든 파일)

Staging Area: 워킹 디렉터리에서 add하면 작업물이 여기에 도착함, 이력 기록(commit)을 곧 진행할 파일들이 위치하는 장소, .git 폴더 하위에 파일 형태로 존재(.git 내부의 index 파일이 stagging area)

Repository: 스테이징 에리어에서 commit 명령어를 입력하면 도착하는 영역, .git 폴더에 이력관리를 위한 모든 정보가 저장이 되어있는 상태

 

간단히 말해 로컬 저장소에서 원격 저장소로 작업물을 보내기전 하기 위해 스테이징(add), 커밋(push) 2 단계는 거쳐야 한다.  노리쇠전진 --> 조정간 단발 처럼

 

git add를 하면 스테이징 파일들의 정보가 이 index 파일에 기록된다.

이게 좀 헷갈릴수도 있다. 

 

.git을 제외한 파일들 --> working directory

.git 안의 index 파일 --> staging area

.git 폴더 자체 --> Repository (로컬 저장소, 원격 저장소도 있는데 Repository는 뭐냐 할수도 있는데 학술적으로 정확히는 .git 폴더 하나이다. 자주 혼용이 되므로 잘 알아두자)

 

 

# Git이 관리하는 3가지 파일 상태(status)

Modified: 관리 중인 파일 변경사항 감지했지만 아직 커밋은 하지 않음

Staged: 감지된 수정사항이 staging area로 이동한 상황

Untracked(commited): 파일의 수정사항에 대한 이력저장이 완료된 상태

 

+tracked: git 에서 상태를 추적하고 있다. untracked: git 에서 상태를 추적하고 있지가 않다.(관리대상X)

작업영역과 파일상태 그림

# Staging Area가 필요로 하는 이유(왜 staging후 commit 2단계를 거처야 하는가 번거롭게)

1. 일부 파일만 선택해서 커밋

어떤걸 보낼지 선별할수가 있다.

 

2. 충돌을 수정

merge(병합)하는 과정에서 일부 파일이 충돌(Conflict)하는 상황이 발생하기도 함, 이때 Staging Area에서 충돌한 부분만 고치고 커밋하는게 가능하다.

 

3. 커밋(맡긴 내용)을 수정

이미 committed 된걸 다시 staged(스테이지 에리어로 내림)해서 수정하고 다시 commited 할수 있다.

 

 

# CLI 명령으로 로컬 저장소 생성하기

저장소 개설을 위해 작업하고자 하는 배경디렉터리로 이동한다.

cd(change directory): 해당 경로의 디렉토리로 이동

cd 경로명

 

작업할 공간으로 이동후 폴더(디렉토리)를 생성한다.

mkdir(make directory): 새 디렉토리 만들기

mkdir 원하는폴더명

 

이후폴더가 정상적으로 생성되었는지 확인

ls(list directories): 현재 경로의 디렉터리를 출력(-al: all 이라는 옵션을 추가한거임)

ls -al

 

정상적으로 폴더가 만들어 졌다면 cd 명령어를 이용해 생성한 디렉터리로 이동한다.

이 공간은 git 로컬 저장소로 활용할것이다는걸 알려주기 위해 git init 명령어를 입력한다.

(항상 git관련 명령어는 git ~~~ 이렇게 사용이 된다.)

git init

이후 master 라는게 깃배시에서 보이면 잘 되는 것이다.

# 사용자 정보 설정

git을 활용할수 있는 로컬 저장소를 만들었다. 이제 어떤 사용자가 로컬 저장소를 쓰는지 사용자 정보를 설정해주어야 합니다. 저장소 속성 설정을 위해 git config 명령어를 사용합니다. 저장소 속성은 다양하지만 지금은 사용자 이름과 이메일 계정을 설정하도록 하겠습니다.

git config user.name "사용자아이디"
git config user.email "이메일계정"

별다른 출력문이 발생하지 않는다면 정상입니다. 잘 되었는지 확인 하기 위해서 git config --list 옵션을 사용하면 잘 뜨는걸 볼수 있습니다.

git config --list

git config --list 출력문

 

만약 유저네임, 이메일만 해당하는 행만 출력하고 싶다고 하면 

git config user.name
git config user.email

만 입력하시면 됩니다.

 

만약 설정한 정보를 삭제하고 싶다면? --unset 옵션을 사용하시면 됩니다.

git config --unset user.name
git config --unset user.email

 

@참고하면 좋은점(매번 로컬 저장소를 만들때마다 유저네임, 이메일 설정을 해야 하나요? 너무 귀찮네요...)@

--global 옵션을 사용하면 전역적으로 설정이 가능(저장소를 매번 생성할때마다 기본적으로 반영됨)

git config --global user.name "minwocee"
git config --global user.email "minwocee@naver.com"

 

또한 위의 저장소 정보가 어디에 저장되는것이냐 하면 .git 안의 config메모장 파일이 있습니다. 이 파일을 열어보시면 내가 변경한 사용자 정보에 맞게 설정이 되어 있다는것을 알수 있습니다.

config를 메모장으로 열었을 때 나온다!

이건 진짜로 몰라도 되지만 아까 우리는 git config --list 했을때 메모장에 나온 텍스트보다는 더 많다는 것을 볼수 있습니다. 이게 어떻게 된거냐? Git은 시스템 설정 항목, 글로벌(global) 설정 항목, 로컬(local)설정 항목 3가지를 따로 분리해서 관리 합니다. 지금 메모장에 있는 화면은 로컬 설정 항목에 해당합니다.

 

<지금까지 정리>

git init : git 저장소로 쓰겠다고 선언

git config (--unset, --global) user.name "사용자명" : 사용자명 정보 추가, 삭제, 전역화

git config (--unset, --global) user.email "사용자이메일" : 사용자이메일 정보 추가, 삭제, 전역화

git config --list : 사용자의 모든 속성정보 출력

git config user.name : 해당 유저명만 출력

(필요에 따라서 -, --가 옵션으로 붙는 경우가 있다)

 

 

# 첫번쨰 이력을 저장하자 (add, commit)

이제 폴더 내에 파이썬 파일을 하나 생성해서 add, commit 하는 과정을 거쳐보겠습니다. code . 명령어를 입력하시면 비쥬얼 스튜디오 환경에서 해당 폴더를 바로 열수 있습니다.

현재 디렉토리 위치를 vscode 에서 열게 된다.
hello.py 생성완료

이제 다시 배시쉘로 돌아오겠습니다. 

이전에 우리는 Git 작업환경 3가지 (add, commit 2개의 안전장치 설정단계)

-Working directory: 로컬에서만 작업함(add 명령어 치기 전)

-staging area: add(staging)를 통해 변동 이력이 준비됩

-repository: commit 후 곧 원격 저장소에 갈 예정

 

Git 파일상태 3가지

Modified: 파일의 수정된걸 감지만 함 조치를 하지는 않음(커밋되지 않은 변동사항, 수정됨)

staged: 수정사항이 staging area에 올라가있는상태(스테이징됨)

Untracked(commited): commit이 완료된 상태(변동사항을 감지하지 못함, 커밋됨)

 

이제 git status 라고 입력해서 저장소의 현상태를 확인해보도록 하겠습니다.

git status

이 명령어를 치면 아래의 정보가 출력 됩니다.

git status 결과

이제 한줄 한줄씩 해석을 해보도록 하겠습니다.

 

On branch master: 커밋 기록이 쌓이는 곳을 브랜치(brach)라고 합니다. 처음에 저장소를 생성하면 한 개의 필수적으로 생성되는 브랜치가 만들어 지는데, 이것을 마스터(master)브랜치 라고 합니다. 'On branch master'는 현재 마스터 브랜치에서 작업중입니다~ 라는 의미 입니다.

 

No commits yet: 현재 커밋된것이 없다는 의미 

 

Untracked files: 새로 추가한 파일은 아직 git과는 얼굴도 보지 않은 상태, 한번이라고 깃 저장소에 커밋이 되면 Git은 해당 파일을 추적하고 관리를 시작한다.(tracked 추적한다.) 그림을 잘 보면 붉은 글씨로 hello.py가 추적되지 않음(새로 파일 추가 했기 때문)을 알려주고 git add (스테이징)을 하면 추적(track)이 가능하다고 친절하게 툴팁 까지도 명시되어 있다.

 

아 그래서 git add . 하는게 현재 모든 수정,추가 사항들을 스테이징 한다는 의미 이구나

git add hello.py 하면 이거 하나만 스테이징 되는 원리 인거고

 

nothing add to commit ~~~: 커밋할게 없다고 말함 staging area에 아무것도 없기 때문

 

 

# git add 명령어를 통해서 스테이징을 해보자

git add hello.py

이후에 git status 명령어를 통해서 hello.py가 정상적으로 스테이징 되었는지 살펴봅시다.

add 한뒤 결과

changes to be committed: 현재 스테이징된(커밋단계만 남음)파일이 있음을 알려준다. hello.py가 초록색으로 보인다.

 

 

# 이력저장의 마지막단계 commit

이제 commit을 해보도록 하겠습니다.

 

git commit -m "커밋할메시지"

사실 git commit 만 해도 되기는 합니다. 근데 커밋메모를 작성할때 vim이라는 리눅스 문서편집 프로그램이 열리게 됩니다. 리눅스를 다루어본 경험이 있는 분들은 쓰실수 있지만 처음이신 분들은 -m 옵션을 통해서 인라인 형식으로 간편하게 커밋메시지를 남기는걸 추천 드립니다.

-m 옵션 적용

그냥 git commit 을 했을 때 방법을 알려드리겠습니다.

1. i키 눌러서 문서 편집모드로 전환

2. 원하는메시지 작성

3. Esc 눌러서 문서편집모드 나가기

4. :wq 3개를 순서대로 입력후 엔터키를 입력한다.(wq는 메시지 저장후 편집 종료하는 vim 단축키)

 

 

이후에 다시 git status 명령어를 통해 확인을 해보도록 하겠습니다.

수정된것이 없다고 함(Unmodified 상태)

nothing to commit, working tree clean: 커밋할 파일이 없다는 뜻(방금전에 커밋을 마쳤기 때문이다.)

 

이제 두번째 개인 파일을 생성해서 다시 복습해보도록 합니다. git status를 치면서 어떤 변화가 생기는지 파악해야 합니다.

 

외부침입 파일 감지
스테이징에 외부 파일 올림(커밋 대기중)
커밋후 더이상 커밋할게 없다는 메시지

@추가적인 꿀팁@

add 와 커밋을 동시에 하고 싶다면 아래의 명령어를 사용하세요

git commit -am "커밋메시지"

-a 옵션은 --all과 동일한 기능을 하며, 수정&삭제된(Tracked중인)파일에 대해서 스테이징과 커밋을 진행하는 명령어 입니다. 조심해야 하는게 Untracked(새로생성된 외부파일)에 대해서는 add, commit을 하지 않음으로 꼭 내가 수정&삭제만 한 파일에 대해서만 사용합시다. 사실 가장 확실한건 add commit을 나눠서 하는것입니다.

 

**커밋 메시지 컨벤션이 뭐에요?

단체에서 git을 사용할때 체계적인 관리를 위해서 커밋 메시지를 작성하는 규칙이 존재하기도 하는데 이를 커밋 메시지 컨벤션 이라고 합니다. 일종의 서식(지정해둔 글의 형식)이라고 생각하면 됩니다. 실무에서는 커밋 메시지 컨벤션에 맞춰서 작성해야 합니다. 지금은 혼자 작업하니깐 괜찮은겁니다~\

 

**여러줄로 나눠서 커밋 메시지를 작성하는법

git commit -am "첫행
두번째 행
세번째 행"

그냥 엔터 쳐도 OK이니 끝에 닫는 큰따옴표만 적고 Enter눌러주면 줄바꿈이 가능합니다!

 

<여기 까지의 정리>

git status : 저장소의 현재상태 확인

git add : 스테이징하기

git commit : 커밋하기(이력저장)

git commit -m "메시지 적기" : 인라인 형식으로 커밋 메시지 추가후 커밋

git commit -am "메시지적기" : add, commit 한번에 진행(새로 외부파일이 추가되면 사용하면 안됨, Untracked 파일은 제외)

 

 

# 저장소 상태와 커밋 내역(commit history)을 확인하자(status, log, show)

git status 명령어를 활용해서 저장소내의 파일의 상태를 확인할수 있었습니다. 이제 좀더 구체적으로 과거의 변동내역등을 확인하기 위한 명령어를 익히도록 하겠습니다.

 

우선 Working Directory에 약간의 변동을 주도록 하겠습니다.

touch test.txt

리눅스에서 touch 명령을 통해 아무것도 없는 빈 파일을 생성할수 있습니다. 현재 test.txt라는 빈 내용의 메모장 파일을 생성한것 입니다.

 

이후 git status명령어를 통해 저장소 내의 파일 상태를 출력해보겠습니다.

Untracked(추적되지 않음)파일이 생성 되었다느 메시지

이제 git status를 보는법을 이해하였으니 -s 옵션을 활용해서 간결하게 파일상태를 파악하는 명령어를 입력해보도록 하겠습니다. (--short를 -s로 쓴것임 같은 기능)

git status -s

git status -s 옵션 결과

앞에 아이콘별 특징

?? : Untracked 파일이다.

M: Modified(변동을 감지만함)

MM: 파일이 스테이징함 근데 이후에 또 수정한 상황을 의미 (add 해놓고 내가 코드 추가하는 행위)

A: 경로가 스테이징 된후 경로 내의 Untracked 파일 발생(간단히 말해 외부파일(신입생, 이때까지는 Untracked)이 첫 스테이징 되었을때 나타나는 기호)

txt 파일을 처음 만들고 스테이징 했을 때 A가 뜬다.

이제 다음 실습을 위해서 rm 명령어를 이용해 test.txt를 삭제합시다.

rm test.txt

 

git log 명령은 저장소에 기록된 커밋 히스토리(log)를 출력하는 명령입니다.

git log

git log 결과

가장 최근에 커밋된 기록은 (HEAD -> master)이라는 명칭이 오른쪽에 붙습니다.

노란색의 각 커밋 글씨는 커밋 항목 별 아이디를 의미한다

commit ~~~~: 커밋 고유 ID

Author: 제작자명, 제작자Email

Date: 커밋시각을 의미

그 아래는 커밋 메시지를 의미합니다.

 

만약 모든 로그를 보고싶지 않고, 최근에 작성된 3개의 로그만 보고싶다면 아래의 옵션을 추가해주시면 됩니다.

git log -원하는개수

 

만약 3개만 출력하고 싶다면 git log -3 을 입력하면 됩니다.

좀더 자세한 로그를 출력하고 싶다면 -p 혹은 --patch 옵션을 사용하시면 됩니다.

 

git log -p

볼거 다봤다 하시면 q 키보드 버튼을 누르면 quit 할수 있습니다.

 

이때 출력개수를 지정하는 옵션도 함께 써보도록 하겠습니다. 가장 최근에 커밋로그를 1개 불러오도록 하겠습니다.

 

git log -p -1

-표시된 빨간 글씨가 과거의 코드

+표시된 초록 글씨가 현재의 코드를 의미합니다.

(기본 정보 뿐만이 아니라 파일 내부의 코드 변동 내역도 보여주게 됩니다.)

 

또 --pretty=oneline 옵션을 사용하면 커밋이 한 줄로 정리되어 출력됩니다. 이쁘게요. 주로 커밋이 많을때 유용합니다.

git log --pretty=oneline

단순하고 깔끔하네요 커밋id, 메시지만 출력됨

비슷한 옵션으로는 --online 옵션만 사용하면 커밋 아이디를 일곱 번째 값 까지만 출력합니다. 더 간결하게 정리 됩니다.

git log --oneline

id가축소되었습니다. 더더 간결해지네요

 

--grapth 옵션은 로그를 그래프 형식으로 출력해주는 옵션입니다. --online 뒤에 적어주면 됩니다. 아직 까지는 커밋 기록이 별로 없어서 맨 앞에 * 하나만 붙는걸 볼수 있습니다. 하지만 다양한 작업이 진행되면 그래프의 형태가 더 명확하게 나타납니다.

 

@ 알아두면 좋은 용어정리@

저장소(repository)에는 이력 관리 영역들이 따로 따로 독립적으로 존재합니다. 이 관리 영역을 브랜치(Branch)라고 합니다. 커밋을 이어나간후 로그를 출력하면 마치 나뭇가지(영어로 브랜치입니다)같다 하여 붙여진 이름입니다. 저장소 한개에 1~N개의 브랜치를 만들어 사용할수 있습니다. 지금까지 우리는 1개으 브랜치만 활용해서 실습을 진행하였습니다. 

 

git init로 저장소를 생성하면 기본 브랜치(master branch)가 1개 만들어 집니다 master라는 이름은 나중에 변경 가능합니다 그냥 사람이름 아무거나 하면 홍길동 이라고 하는것과 똑같은 겁니다.

 

아무튼 master branch는 브랜치 이름이기도 하면서 최신 커밋을 가리키는 참조 개체를 뜻하기도 합니다. 이게 뭔 소리냐 커밋을 하면 마스터 라는 개체가 가장 최신 커밋을 가리키게 됩니다. (C언어의 포인터 처럼)

 

더 간결하게 요약하자면 

*master brach의 기능 2가지

1. 최초 생성된 브랜치를 뜻함

2. 가장 최근에 커밋된 항목을 가르킴(포인터라고 말한 이유가 이거임)

 

이렇게 알면 편합니다.

 

HEAD부터 계속하기

 

<공부 후기>*********************************************************

 

 

알게된점: