AIFFEL에서 배운 github를 요약해보자
버전 관리 : 한 시점의 진행과정을 저장 ( 되돌리기 가능 )
git --version
git : 소스코드의 버전을 기록하고 관리
github : 그 기록을 다른 사람들과 공유할 수 있는 웹사이트
local repository : 개인 컴퓨터의 폴더
remote repository : 다른 사람들과 원격으로 작업할 수 있는 github repositroy
1-1. local 변경사항을 remote repo에 보내기 위해서는 git이 내 github 정보를 알아야함
git config --global user.email [email 주소]
git config --global user.name [user name]
git config -l # config에 기록한 모든 정보 확인
--global에 관한 내용은 뒤에서 설명
1-2. git을 내 local repo에 생성
git init
. git 이라는 숨겨진 폴더가 생성되어 지정된 local repo의 변화 감지
local repo에 파일을 생성
# README.md 파일을 생성하고 그 안에 '# first-repository' 기입
echo "#first-repository" >> README.md
>> [파일 이름] : 출력 문구를 파일에 append
cat README.md
cat을 통해 README.md 에 작성된 내용 출력
local repo에 변화가 생겼으니 git이 감지했는지 확인
Untracked file : 추적되지 않은 파일들
변경 사항이 있지만, git에 등록을 시키지 않아 추적 불가
local repo에도 변화가 있는데 git이 추적하지 못한다는 것은 무슨 뜻일까?
work directory : 내가 작업하고 있는 폴더
staging area (Index) : 커밋하기 전, 추가 및 변경된 파일들을 저장하는 중간 저장소
head (local) repo : . git을 가지고 있는 폴더
+) working directory는 local의 일부
local repo에도 변화가 있는데 git이 추적하지 못한다는 것은 무슨 뜻일까?
-> local repo에는 보이지만, git으로 버전 관리를 하고 있지 않은 상태 ( 중간 저장 X )
즉, 버전 관리를 위해 우리는 파일을 git에 등록시켜야 한다.
git add README.md # README..md 파일을 staging
git status로 상태를 보면, 현재 git이 추적 중 임을 확인 가능
git rm --cached README.md
다시 Untracked 상태로 돌아간 것을 볼 수 있다.
파일도 Untracked 와 같이 몇 가지 상태가 있는데 정리헤보자
Untracked : working directory에는 있지만, git으로 버전 관리되지 않는 상태
Unmodified : 수정이 이뤄지고 있지 않는 상태
Modified : 파일이 추가된 상태에서 해당 파일이 수정
Staged : staged area에 올라간 상태commit을 통해 head repo에 올라가게 되면, 다시 Unmodified 상태로 돌아감
이제, stage area에 올라간 README 를 head repo로 올려보자
git commit -m '[커밋 설명]'
-m : 이 다음 부분을 메세지로 취급
커밋하고 하나의 파일이 변경되었음 알려줌
angel@JoBoB MINGW64 ~/JoBoB/Work/AIFFEL/practice1 (master)
$ git log
# commit 뒷부분은 commit의 고유번호
commit fe1dcc4fd1b8d0d8ad2c6a6e5c06e81fa5584779 (HEAD -> master)
# user.name <user.email> 로 구성
Author: JoBob1218 <angel981218@gmail.com>
Date: Thu Nov 9 19:12:49 2023 +0900
first-commit # commit 내용
실습을 위해 새로운 remote repo를 생성했다.
# [repo 별명]으로 remote repo 추가
git remote add [repo 별명] [repo 주소]
git push origin master
+) 클라우드 환경 변경
알립니다! ) 현재 제가 velog에 있는 실습 환경들은 모두 제 개인 git bash를 활용한 것이니 여기 기제된 내용은 LMS 실습 관련된 세팅만 해당함을 알립니다.
현재 우리는 user 정보는 --global을 사용해서 저장
/aiffel 외부에 데이터는 cloud jupyter를 닫으면 모두 삭제
--global에 저장하면 어디에 저장되는걸까? 더 나아가 git의 범위는 무엇일까?
git 범위 설정
- 지역 (local) : git 설정한 저장소 -> .git/config
- 전역 (global) : 현재 사용자의 모든 저장소 -> user/.gitconfig
- 시스템 (system) : 모든 사용자의 저장소 -> C:/programdata/Git/config
현재 내 컴퓨터에서는, git config --global 로 설정한 user 정보들이 여기에 들어있는 것이다.
마저 돌아와서, 현재 우리는 우리의 인증정보를 /aiffel 내부로 옮겨야 한다.
# config에 credential.helper 변수를 store로 ~aiffel/.git-credients에 저장
git config credential.helper 'store --file ~aiffel/.git-credients
# 정확히는, credential.helper = store --file ~/aiffel/.git-credients 로 들어간다.
이후 README를 변경하는 등 변화를 주어 git add, commit, push 과정을 통해 버전 업데이트를 해야 정상적으로 remote repo에 기록됨
우리 원하는 remote를 복제해서 가져와 보자
새로운 폴더를 생성하고 거기로 이동해서 복제하면,
git clone [복제할 remote 주소]
복제가 완료되어 새로운 local repo에 복제되어 들어왔다.
복습 차원에서, 새롭게 내용을 추가하고 다시 push 해보자
cd second-repository
echo '#second-commit' >> README.md
git add README.md
git commit -m 'clone 후 push'
git push origin master
현재 상태는
second-repo는 지금 practice2가 commit한 V2가 최신이다.
→ 우리는 practice1의 데이터 최신화를 위해 remote의 데이터를 받아와야 한다.
# origin으로 등록된 second-repo의 master branch의 데이터를 받아온다.
git pull origin master
README를 출력해보면, 우리가 practice2에서 push한 내용들이 들어와 있다.
다른 사람의 remote repo를 수정하거나 추가 내용을 넣어야하는 경우, 해당 repo를 내 remote repo에 복제하는 기능
fork와 clone 차이
fork : 다른 사람의 remote repo를 내 remote repo로 복제
clone : remote repo를 내 local repo로 복제
순서
상대 repo fork → clone → 수정 → ~ push → pull request → 상대가 merge 허락
fork : 상대 remote repo를 내 remote repo로 복제
clone : 내 remote repo를 local repo로 복제
수정 : local에서 내용을 업데이트
push : 업데이트한 내용을 index → head repo → 내 remote repo까지 올림
pull request : 상대의 remote repo에 자신의 업데이트 내용을 pull 해줄 것을 요청
merge : 상대가 pr (pull request)를 보고 merge 여부 결정
추가공부 내용
그림으로 보는 git
git 정리 블로그