개발자입니다
[비트캠프] 11일차(3주차1일) - git(status, log, 로컬 저장소에서 리모트 연결), Hash 본문
[비트캠프] 11일차(3주차1일) - git(status, log, 로컬 저장소에서 리모트 연결), Hash
끈기JK 2022. 11. 21. 11:19실습
진행 과정 (host1만 설명(host2, 3 동일))
1) 폴더 생성 : C:\User\bitcamp\vm-projects 내 host1-vm 디렉토리 생성 및 이동 : mkdir host1-vm, cd host1-vm
2) host1-vm 폴더로 이동 : cd host1-vm
3) vagrant init 설정 : vagrant init "centos/7"
4) VSCode에서 Vagrantfile에 config.vm.hostname = "host1.bitcamp"로 수정 후 저장
5) 가상머신 가동 : vagrant up
6) 리눅스 접속 : vagrant ssh
7) 디렉토리 생성 및 이동 : mkdir git, cd git
8) git 설치 : sudo yum install git -y
9) git 폴더 clone : git clone https://github.com/eomjinyoung/bitcamp-study
10) bitcamp-study 폴더로 이동 : cd bitcamp-study
11) 현 위치, 폴더 내용물 확인, 이름 확인 : pwd, ls, hostname
Vagrant Project vs VirtualBox VM
Vagrant Project : 가상머신을 만들고 초기화시키는 설정 정보가 들어있는 프로젝트
VirtualBox VM : Vagrant 프로젝트에 따라 생성된 VM
*~ : home 폴더. C:\Users\bitcamp
*폴더 경로 쓸때 windows는 \, mac은 /로 다르나 강의때는 /로 통일함
*~/vm-projects/host1-vm 은 Vagrant Project(가상 머신을 만들고 초기화시키는 설정 정보가 들어있는 프로젝트)
*~/VirtualBox VMs 는 VirtualBox VM. Vagrant 프로젝트에 따라 생성된 VM
*프로젝트 폴더 삭제시 cmd에서 destroy 안되므로 VirtualBox에서 해당 VM 우클릭해서 삭제해야한다.
*vagrant destroy 후 해당 프로젝트 폴더는 window에서 삭제해야 한다.
CVS vs SVN vs Git
CVS(Concurrent Versions System, 또는 VCS(Version Control System))
- Server
서버에서 변경내역 관리 → 중앙집중방식 → 서버에 문제 발생시 변경 내역을 모두 잃는다. - Local
최신 버전의 파일을 가져온다 (checkout).
commit (checkin) → 파일을 통째로 서버에 전송 → 변경 내용 외의 기존 내용까지 전송하여 overhead 발생 → 네트웍 과다 사용
SVN(Subversion)
- Server
서버에서 변경내역 관리 → 중앙집중방식 → 서버에 문제 발생시 변경 내역을 모두 잃는다. - Local
최신 버전의 파일을 가져온다
commit (checkin) → 파일의 변경 부분만 서버에 전송 → CVS 방식보다 네트웤 overhead가 적다.
Git
- Server
저장소를 클라이언트 쪽에 분산 복제 → 서버에 문제 발생 → client 쪽에 분산 복제된 Repo.를 사용하여 원상태로 복원 가능 → 안정성이 높다 - Local
변경 → commit →서버에 업로드로컬 Repo.에 저장 → 다른 팀원과 공유할 필요가 있을때 서버에 push 한다 → 네트워크 overhead가 적다.
중앙집중식 버전 관리(CVS, SVN)
- 파일의 마지막 스냅샷을 받는다(checkout)
- 스냅샷 : 특정 시접의 파일 버전을 기록한 것
- 로컬은 한 개의 스냅샷만 유지한다.
- 만약 서버에 문제가 생기면 모든 변경 내력(history)을 잃는다.
- 로컬에 있는 스냅샷 중에서 최신 버전으로 복구한다.
분산 버전 관리 시스템(Git)
- 저장소 전부를 복제한다.
- 변경 내력(history)까지 모두 복제한다.
Git Local 저장소와 작업 디렉토리
~/git/bitcamp-study/
- .git
- 작업 디렉토리(working 디렉토리). .git 외 나머지 파일 및 폴더
- docs/
- .gitignore
- README.md
git help [명령], git [명령] --help
명령어에 대한 도움말을 볼 수 있다.
git help config
git config --help
git status
git status는 작업 파일의 상태를 나타낸다.
Git 의 파일 상태
Git은 다음 세가지 상태로 파일을 관리한다.
- Committed
- 로컬 데이터베이스(저장소; Repository)에 안전하게 저장되었다는 뜻이다.
- Modified
- 파일이 변경되었지만 아직 로컬 데이터베이스에 저장되지 않았다는 뜻이다.
- Staged
- 로컬 데이터베이스에 저장할 파일임을 표시했다는 뜻이다.
- 다음에 커밋을 수행할 때 Staged로 표시된 파일의 변경 내용이 저장될 것이다.
Git 프로젝트의 단계
Git 프로젝트는 다음 세 가지 단계로 관리된다.
- .git Directory
- 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳.
- 즉 변경 내력과 그 내용이 저장된다.
- 원격 저장소를 clone 할 때 생성됨.
- Working Directory
- 특정 버전을 체크아웃(checkout)하면, `.git` 디렉토리에 있는 압축된 데이터베이스에서 파일을 가져와서 작업 디렉토리를 만든다.
- Staging Area
- `.git` 디렉토리에 존재하는 단순한 파일이다.
- commit 할 파일의 정보(*스냅샷이라 부른다*)를 담고 있다.
- `git commit`을 실행하면 이 스냅샷에 기록된 파일을 저장소에 보관하는 것이다.
- 커밋을 한 후에는 Staging Area는 새 스냅샷을 준비한다.
- Staging Area는 *인덱스*라는 이름으로도 부르지만, *Staging Area* 가 표준 이름으로 사용되는 추세이다.
Git 파일의 상태 변화
다음은 Git 명령에 따른 파일의 상태 변화를 보여준다.
Working Directory | Staging Area | .git Directory(Repository)
[Untracked] [Unmodified] [Modified]|[ Staged ]|[ Committed ]
-----------------------------------|--------------|---------------------------
+------------------------------------->> : git add
+----------->> : git add
+------------->> : git commit
<<-----------------------+
+---------->> : 파일 편집
<<------------+ : 파일 삭제
git status --short
git status --short 명령어 왼쪽은 stagin Area, 오른쪽은 working directory의 상태를 나타낸다.
A : Add, M : Modify, ? : 최초 상태
[vagrant@host1 bitcamp-ncp]$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# .gitignore
# a.txt
nothing added to commit but untracked files present (use "git add" to track)
[vagrant@host1 bitcamp-ncp]$ git status --short
?? .gitignore
?? a.txt
git 저장 버전별 status
version 1. git add 하면 staging area가 A로 바뀐다.
[vagrant@host1 bitcamp-ncp]$ git status --short
?? .gitignore
?? a.txt
[vagrant@host1 bitcamp-ncp]$ git add .gitignore
[vagrant@host1 bitcamp-ncp]$ git status --short
A .gitignore
?? a.txt
[vagrant@host1 bitcamp-ncp]$ git commit -m "1"
[master (root-commit) 2b432db] 1
1 file changed, 217 insertions(+)
create mode 100644 .gitignore
[vagrant@host1 bitcamp-ncp]$ git status --short
?? a.txt
[vagrant@host1 bitcamp-ncp]$ nano b.txt
[vagrant@host1 bitcamp-ncp]$ git status --short
?? a.txt
?? b.txt
version 2. a.txt를 수정하면 working directory가 M으로 바뀐다.
[vagrant@host1 bitcamp-ncp]$ git add a.txt
[vagrant@host1 bitcamp-ncp]$ git status --short
A a.txt
?? b.txt
[vagrant@host1 bitcamp-ncp]$ git commit -m "2"
[master 5117279] 2
1 file changed, 2 insertions(+)
create mode 100644 a.txt
[vagrant@host1 bitcamp-ncp]$ git status --short
?? b.txt
[vagrant@host1 bitcamp-ncp]$ nano a.txt # a.txt 수정
[vagrant@host1 bitcamp-ncp]$ git status --short
M a.txt
?? b.txt
version 3. git add b.txt로 staged 하면 아래와 같이 A가 생긴다.
[vagrant@host1 bitcamp-ncp]$ git add b.txt
[vagrant@host1 bitcamp-ncp]$ git status --short
M a.txt
A b.txt
[vagrant@host1 bitcamp-ncp]$ git commit -m "3"
[master 238344b] 3
1 file changed, 1 insertion(+)
create mode 100644 b.txt
[vagrant@host1 bitcamp-ncp]$ git status --short
M a.txt
version 4.
[vagrant@host1 bitcamp-ncp]$ nano b.txt
[vagrant@host1 bitcamp-ncp]$ git add a.txt
[vagrant@host1 bitcamp-ncp]$ git status --short
M a.txt
M b.txt
[vagrant@host1 bitcamp-ncp]$ git commit -m "4"
[master 82582e7] 4
1 file changed, 1 insertion(+)
[vagrant@host1 bitcamp-ncp]$ git status --short
M b.txt
[vagrant@host1 bitcamp-ncp]$ git add b.txt
[vagrant@host1 bitcamp-ncp]$ git status --short
M b.txt
version 5.
[vagrant@host1 bitcamp-ncp]$ nano b.txt
[vagrant@host1 bitcamp-ncp]$ git status --short
MM b.txt
[vagrant@host1 bitcamp-ncp]$ git commit -m "5"
[master afce3ff] 5
1 file changed, 1 insertion(+)
[vagrant@host1 bitcamp-ncp]$ git status --short
M b.txt
version 6. staged된게 없으므로 modified 된 b.txt를 staged하라고 나온다.
[vagrant@host1 bitcamp-ncp]$ git commit -m "6"
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: b.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[vagrant@host1 bitcamp-ncp]$ git add b.txt
[vagrant@host1 bitcamp-ncp]$ git status --short
M b.txt
[vagrant@host1 bitcamp-ncp]$ git commit -m "6"
[master 0dfb218] 6
1 file changed, 1 insertion(+)
[vagrant@host1 bitcamp-ncp]$ git status --short
# 없음
이전 버전을 가져오라고 하면 버전 1, 2, 3 상태를 가져온다.
git log
git log
입력하면 아래와 같이 commit 뒤 해시태그가 나온다.
[vagrant@host1 bitcamp-ncp]$ git log
commit 0dfb218fa8c1797f99a8f4c2e489800e1e0371e2
Author: jongkwangyun <yjk0319@gmail.com>
Date: Mon Nov 21 06:35:34 2022 +0000
6
commit afce3fffd9b5cd447ff98c1be3061c74c3a6ecc4
Author: jongkwangyun <yjk0319@gmail.com>
Date: Mon Nov 21 06:31:58 2022 +0000
5
commit 82582e790e4113915d2e5a400ab581d9b493039f
Author: jongkwangyun <yjk0319@gmail.com>
Date: Mon Nov 21 06:25:39 2022 +0000
4
commit 238344b93dc044041c12804e6e70d20a4c38b6ad
Author: jongkwangyun <yjk0319@gmail.com>
Date: Mon Nov 21 06:21:16 2022 +0000
3
commit 51172792230d8ffc239f085a0efde5692fe59aef
Author: jongkwangyun <yjk0319@gmail.com>
Date: Mon Nov 21 06:16:28 2022 +0000
2
commit 2b432db0cde6f96b1e3a6e66d14171dde6935a1f
Author: jongkwangyun <yjk0319@gmail.com>
Date: Mon Nov 21 06:13:43 2022 +0000
1
git client 사용하기도 하지만 기본적인 명령은 CLI로 다룰 줄 알아야한다.
git log -p -2
입력시 축약된 형태로 최근 2개의 log 내역이 나온다.
[vagrant@host1 bitcamp-ncp]$ git log -p -2
commit 0dfb218fa8c1797f99a8f4c2e489800e1e0371e2
Author: jongkwangyun <yjk0319@gmail.com>
Date: Mon Nov 21 06:35:34 2022 +0000
6
diff --git a/b.txt b/b.txt
index 4f142ee..e0037f0 100644
--- a/b.txt
+++ b/b.txt
@@ -1,2 +1,3 @@
1111
2222
+3333
commit afce3fffd9b5cd447ff98c1be3061c74c3a6ecc4
Author: jongkwangyun <yjk0319@gmail.com>
Date: Mon Nov 21 06:31:58 2022 +0000
5
diff --git a/b.txt b/b.txt
index 5f2f16b..4f142ee 100644
--- a/b.txt
+++ b/b.txt
@@ -1 +1,2 @@
1111
+2222
git log --oneline
해시 값 앞 7자리, 수정 메시지가 나온다.
[vagrant@host1 bitcamp-ncp]$ git log --oneline
0dfb218 6
afce3ff 5
82582e7 4
238344b 3
5117279 2
2b432db 1
git log --oneline --graph --all
branch 나뉜 모양이 그림으로 나온다.
[vagrant@host2 bitcamp-ncp]$ git log --oneline --graph --all
* bb3c142 (HEAD -> main) 21
|\
| * d383a70 (origin/main, origin/HEAD) 18
| * ca6c123 17
* | 6173432 20
* | 175afdc 19
|/
* 6657d22 16
* 26668a6 15
* 6551e69 14
* 19271a2 13
* 4c879d2 12
* be9028c 11
git의 자세한 정보는 'git pro 2' 검색해서 pdf 참고
(참고) hash
commit hash 값
각 commit을 구분하기 위한 식별자
각 commit의 변경내용에 대해 hash 알고리즘(계산) 연산을 수행한 결과 값을 hash code라 한다. 데이터의 크기에 상관없이 256bit, 512bit, 1024bit 등의 정수 값이다.
hash 알고리즘
: 데이터를 입력받아 hash 값을 리턴하는 수학 공식. 1byte, 1GB, 1TB → 16바이트 로 변경되어 데이터가 변경될 때마다 값이 바뀐다. 그러나 다른 데이터 → 같은 해시 값을 가질 수 있다.
commit 한 이후에 변경 내용을 바꿀 수 없다.
예) 삽입한 해킹코드를 제거
예) 잘못을 감추기 위해 변경 안한 것처럼 만듦
데이터 비교
10MB 데이터 2개를 비교하려면 약 1천만번 비교 → 하지만 데이터의 크기가 커지면 비교 횟수도 많아짐 → 속도가 느려짐
해결책은 A 데이터를 계산식에 넣어서 데이터 식별 ID (16byte ~ 256byte)를 뽑아낸다.
B 데이터 또한 같이 처리해서 두 데이터를 비교한다. 그러면 최대 256번만 비교하면 된다. 그러나 식별 ID가 같을 가능성이 있다.
데이터 식별 ID가 데이터를 식별하는 지문과 같다고 해서 "디지털 지문"이라 한다. 방식은 MD4, MD5, SHA-1, SHA-256, SHA-512 등. '암호화 해시 함수' 검색하면 방식 확인 가능하다.
디지털 지문 사용 예
① 파일 공유 및 분산 다운로드
파일명은 다르지만, 같은 파일이면 데이터가 같다. 똑같은 파일을 누가 갖고 있는지 알아낼 수 있다.
② 파일 검증
원본의 서버 속도가 느려서 통신속도가 빠른 다른서버에서 파일을 받는다. 다운로드 받은 후 원본과 같은지 위변조는 없는지 궁금하면 Hash 값 비교하면 된다.
window에 내장된 hash함수 알고리즘이 있다.
명령 프롬프트에 다음과 같이 입력하면 SHA512 해시 값 추출 가능하다.
certutil -hashfile c:\Users\JDoe\Desktop\abc.exe SHA512
windows sha512 checksum 검색시 나오는 코드
tree : 폴더 구조 확인
명령어로 tree 설치하고 확인하면 현재 폴더 구조 확인 가능하다.
sudo yum install tree # tree 설치
[vagrant@host1 ~]$ tree
.
└── git
├── bitcamp-ncp
└── bitcamp-study
├── docs
│ ├── 1.\355\224\204\353\241\234\352\267\270\353\236\230\353\260\215_\354\244\200\353\271\204.pdf
│ ├── 2.\353\246\254\353\210\205\354\212\244.pdf
│ └── \354\203\201\354\204\270\354\273\244\353\246\254\355\201\230\353\237\274.xlsx
└── README.md
로컬 저장소 생성 후 Git과 연동하기
다음 순서로 진행한다.
1) Local git 저장소 만들기
2) .gitignore 파일 생성
3) 리모트 저장소 생성
4) git remote로 리모트 저장소 이름, 주소 설정(+branch명 변경)
5) push.default 설정
6) upstream branch 설정
1) Local git 저장소 만들기
- 저장소로 사용할 디렉토리 생성
~/git/bitcamp-ncp - git 저장소 디렉토리로 명렁어 지정한다.
아래 명령어를 입력하면 .git 폴더가 생성된다.
[vagrant@host1 bitcamp-ncp]$ git init
*저장소 안에 저장소 만들면 안된다.
2) .gitignore 파일 생성
git 저장소에 보관하지 않을 대상을 지정하는 파일
예) 도구를 실행할 때 마다 자동 생성하는 파일. .class, .exe, bin/, build/ 등
.gitignore 파일 생성 방법
- 기존 프로젝트 저장소에 설정된 파일을 가져와서 편집
- .gitignore 파일을 자동 생성해 주는 사이트를 이용
gitignore.io 접속 → 해당 사이트에서 ignore 할거 입력(Windows, macOS, Linux, Grandle, Java, VisualStudioCode, Eclipse) → 생성 후 결과 텍스트 복사 → nano 설치 후 nano .gitignore 에 붙여넣기 후 저장
nano 설치 : sudo yum install nano -y
회사 입사하면 .gitignore 파일을 복사해서 사용하면 된다.
unix에서 .으로 시작하면 히든 파일, 폴더이다.
VI 에디터 명령어
ESC 관련 명령어
ESC, A # 편집모드
ESC, :, w 엔터 # 저장
ESC, :, q 엔터 # 나가기
ESC, :, wq # 저장 후 종료
ESC, dd # 한 줄 삭제
cat 명령어
텍스트 파일의 내용을 화면에 출력
[vagrant@host1 bitcamp-ncp]$ cat .gitignore
# .gitignore
3) 리모트 저장소 생성
github.com - Repositories - New에서 추가한다.
4) git remote로 리모트 저장소 이름, 주소 설정
git remote 명령어로 리모트 저장소 이름을 설정하고 주소를 지정한다.
# 원격 저장소 이름은 origin이며 주소는 다음과 같이 설정
[vagrant@host1 bitcamp-ncp]$ git remote add origin https://github.com/jongkwangyun/bitcamp-ncp
[vagrant@host1 bitcamp-ncp]$ git remote # 리모트 저장소 이름 확인
origin
[vagrant@host1 bitcamp-ncp]$ git remote show origin # 리모트 저장소 중 origin의 정보 확인
* remote origin
Fetch URL: https://github.com/jongkwangyun/bitcamp-ncp
Push URL: https://github.com/jongkwangyun/bitcamp-ncp
HEAD branch: main
Remote branch:
main new (next fetch will store in remotes/origin)
로컬 저장소를 여러 리모트 저장소와 연결할 수 있다.
git remote -v 하면 다운받는 주소, 업로드 주소 확인 된다.
[vagrant@host1 bitcamp-ncp]$ git remote -v
origin https://github.com/jongkwangyun/bitcamp-ncp (fetch)
origin https://github.com/jongkwangyun/bitcamp-ncp (push)
위를 실행 후 pull을 한번 실행해야 한다.
[vagrant@host1 bitcamp-ncp]$ git pull origin main
이때 git branch 하면 master라 나온다.
우리는 main으로 사용할거라 로컬 저장소의 이름을 master → main으로 변경한다.
git branch # branch 이름 확인
git branch -m main # main으로 이름 변경
5) push.default 설정
git push 하면 push.default 설정하라고 나온다.
[vagrant@host1 bitcamp-ncp]$ git push
warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:
git config --global push.default matching
To squelch this message and adopt the new behavior now, use:
git config --global push.default simple
See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)
push 옵션을 확인하라는 경고이다. 2가지 차이점은
- simple : 현재 작업중인 branch만 push
- matching : local과 remote 브랜치명이 동일한 모든 브랜치를 push
여기서 [옵션]에 simple 을 주고 입력한다.
[vagrant@host1 bitcamp-ncp]$ git config --global push.default simple
git push하면 이번에는 upstream branch 설정하라고 나온다.
6) upstream branch 설정
최초 git push 할때는 upstream branch 설정 해야한다. upstream은 로컬과 저장된 리모트 저장소를 의미한다.
[vagrant@host1 bitcamp-ncp2]$ git push --set-upstream origin main
Username for 'https://github.com': jongkwangyun
Password for 'https://jongkwangyun@github.com':
Counting objects: 7, done.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 2.09 KiB | 0 bytes/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To https://github.com/jongkwangyun/bitcamp-ncp2
f35a755..26c8036 main -> main
Branch main set up to track remote branch main from origin.
이로써 로컬 저장소 생성 후 리모트 저장소와 연결하는 방법이 끝났다.
그냥 git clone해서 사용하는게 마음 편하다.
조언
*수업에 사용하는 것들을 이력서 뒷면에 붙여서 사용할 수 있다.
*개발로 입사했지만 적성 찾아서 QA, QM, 기술 문서, 기획·분석 등으로 갈 수 있다.
*기본은 학원에서 닦지만 필요한 것은 직접 찾아서 공부하라.
*40살 넘어서 PM 하려면 고객사에 학위를 제출한다. 이때 학위가 필요하다. 학사 학위 없으면 디지털 대학교 가라. 석사 없으면 빅데이터 등으로 학위 받아라.
과제
로컬 Git 저장소를 만들고 github.com의 개인 저장소와 연결하라
-작업내용 : host1 리눅스 VM에서 작업을 수행한다.
1) 다음의 경로에 로컬 깃 저장소를 생성한다.
~/git/bitcamp-ncp2/
2) 다음의 테스트 파일을 생성하고 로컬 저장소에 커밋한다.
~/git/bitcamp-ncp2/a.txt
a.txt 파일의 내용을 아무거나 입력한다.
3) github.com의 개인 계정에 bitcamp-ncp2 이름으로 저장소를 생성한다.
4) 로컬 깃 저장소와 원격 깃 저장소를 연결한다.
5) 로컬 깃 저장소의 내용을 원격 저장소에 push 한다.
→ 원격 저장소 주소를 첨부해서 과제 제출한다.
'네이버클라우드 AIaaS 개발자 양성과정 1기 > git, 리눅스' 카테고리의 다른 글
[git] 자주 사용하는 명령어 - commit, branch, checkout, merge, rebase, reset, revert (0) | 2023.03.30 |
---|---|
[비트캠프] 12일차(3주차2일) - 리눅스 명령어, git 명령어, git(충돌, 브랜치) (0) | 2022.11.22 |
[비트캠프] 10일차(2주차5일) - git, 리눅스 설치(VirtualBox, Vagrant, centOS) (0) | 2022.11.18 |
[비트캠프] 9일차(2주차4일) - 매직에꼴 특강, 필요 툴, git 개인 홈페이지 만들기, 매직에꼴 과제 제출법 (0) | 2022.11.17 |