오픈소스 컨트리뷰션 아카데미에서 진행된 Git/Github 기본 실습 강의를 정리한 내용입니다.
오픈소스 기여 과정 개괄
- 개발 환경 구축(컨테이너)
- fork하여 프로젝트 복사
- clone하여 소스 다운로드
- 프로젝트 개발 현황 파악/분석 → Reading Skills 필요
- history를 파악하는 것이 중요! → Reading Skills
- 소스 수정 → commit하여 히스토리 저장
- 수정 내용 제출 → PR!
Container
- 개발 환경 구축을 간단하게 도와줌
- 독립된 리눅스 환경 구성
- 개발 환경을 간단하게 구성
- ex) pytorch, tensorflow
- Dockerfile → image → Container
Git?
- 이력 관리(수단), 협업(목적)
Push
- 나의 프로젝트에 commit을 업로드할 때 사용
Commit
- 소스 파일의 변화를 기록 가능
log
메시지를 함께 작성- 메시지를 잘 작성하는 것이 중요!
- 소스 수정의 이유 작성 →
구체적인 단어
로 표현- 협업 하기 때문에!
- 설명할 수 있는 이유를 고민!
- 오답을 피하는 방향으로
Fix : 잘못된 것을 고친 것
Improve : 원래도 작동하던 것을 더 좋게 개선한 것
-> ex) 10초 -> 5초로 개선
Add : 없는 기능, 옵션 추가할 때 사용
-> 굳이 써야되는 지 꼭 확인 후 사용
Implement : 미리 상의된 내용을 구현한 경우
-> 보통 누가 개발할 지 미리 상의돼 있음
Support : 윈도우에서만 되던 것을 리눅스에서도 가능하게
Correct typo : 수정
→ 팀 프로젝트에 내가 만든 commit을 최종 제출할 때 PR!
PR
- github에서 tokens를 받아서 해당 ID 활용
Rebase
- Base? 내가 fork해올 당시의 기준 commit
- 최신 commit들을 반영해서 base를 변경하는 작업이 바로 Rebase!
Fork
- 프로젝트 복사
- 바로 main rep를 수정할 권한은 없기 때문에 repo를 복사해오고 싶을 때 활용
- 후에 PR에 활용
linux 기본 명령어
- 폴더, 파일 다루기
ls : 폴더 안을 확인
mv : 파일/폴더명 변경, 파일 이동
cd : change directory
pwd : print working directory
clear : bash log 삭제
:q : 빠져나올 수 있음
- 터미널 글씨 키우고 줄이기
ctrl +
ctrl -
git status
- git으로 관리되고 있는지 확인
root@goorm:/workspace/pytorch/examples(master)# git status
Reading Skill
commit log를 확인하는 것이 중요!
- Add, Implement, Support가 많은 프로젝트?
- 개발 중이구나
- Refactor, Improve, Fix가 많은 프로젝트?
- 유지 보수 단계구나
git shortlog -sn | nl
- 해당 오픈 소스에서 “누가 제일 개발을 많이 하는지 확인 가능”
- github의 insights 비교해서 장점?
- 특정 폴더를 기준으로 랭킹 비교 가능
git shortlog -sn -—after=2018-01-01 —- mnist/
git log --oneline | wc -l
- commit(수정) 횟수 파악 가능
git log --oneline -- mnist/
- 특정 폴더의 log 확인
git log --oneline --after=2020-06-01 --before=2020-06-30 -- mnist/
- 특정 시점 이후, 이전 + 특정 폴더
git log --oneline --after=2020-06-01 --before=2020-06-30 | wc -l
- 2020년 6월 한달간 소스 수정내역 개수
- 만약 merge를 포함 시키고 싶지 않다면
--no-merges
사용!
git log --oneline --after=2020-06-01 --before=2020-06-30 --no-merges | wc -l
- 2020년 6월 한달 → merge를 포함 시키지 않고 확인
git log --oneline --no-merges
- merge 내역은 확인하고 싶지 않을 때
git log -p
: 자세하게 출력- base commits ?
- clone해서 받아온 상태의 commit 단계
- clone 시 commit이 504개면 base commits도 504개
- 후에 base commit을 수정 가능
git show
- stage 단계의 commit 확인
git show 6c8e2ba | grep “diff --git” | wc -l
- 해당 commit이 수정한 file 수 확인
git log --oneline --reverse
- log를 역순(예전 commit 부터 확인)으로 출력
git log --oneline --reverse | head -1
- 가장 처음 log 확인
git log --oneline --reverse -n 1
- 왜 가장 최근 log가 출력?
-n 1
이--reverse
보다 우선 순위가 높기 때문에
- 왜 가장 최근 log가 출력?
Authroization
git config --global --unset credential.helper
git config --system --unset credential.helper
- GitHub ID/PW 캐싱데이터 삭제 (삭제시 문제없음)
- 다른(사람) GitHub 계정과의 충돌방지
git config --global user.email "본인메일적으세요"
git config --global user.name "본인이름적으세요"
- GitHub 계정 이메일 주소 및 본인영문이름
- 차후 소스코드 파일수정 내역(commit) 저자(author)정보
git config --list
- config 확인 가능
Branch
- 프로젝트 운영자 vs
프로젝트 참여자
- 우리는 프로젝트 참여자 관점을 이해하는 것이 중요
- Branch를 만드는 시점? → 작업을 시작할 때!
- 적절한 Branch 명칭 설정이 중요
- tag는 운영자의 관점
git checkout -b branch-name
- branch 생성
git checkout branch-name
- branch 전환’
git branch -D fix-mnist
- Branch 마다 환경이 다르기 때문에 원본 파일을 훼손하지 않고 다양한 실험 가능
Status
git status
- 현재 상황 파악
git diff
- 수정 사항 확인하기
Stash
- 수정 내용 잠시 저장(stash) 해두기
- commit할 단계는 아직 아닌 경우
git stash
git stash pop
- 여러개 저장??
Checkout
히스토리 창고(.git 폴더)에서 뭔가를 가져오고 싶을 때
- git checkout branch → 저장된 branch 상태로 전환
git checkout -- mnist/main.py
- 변경된 파일을 다시 원래 상태로 되돌림
- 아직 add 되기 전 상태
Reset
- add 단계에서 되돌리기
git reset
- commit 단계에서 되돌리기
git reset --hard HEAD~1
- HEAD~1 : 가장 최신 커밋 1개 삭제
라이센스 서명
-s
: signed-off 메시지- 라이센스 서명 절차
commit -s -m "message"
Add import requests
Signed-off-by: woodywarhol9 <woodywarhol9@gmail.com>
-> 라이센스 서명 절차
- CLA 절차 → 최신 방식
Commit 수정
- 기존 commit에서 수정이 필요한 경우?
- 새로운 commit 등록 → 쓸모 없어지는 commit 존재
- → 혼란을 야기할 수 있음
--amend
: 가장 최신 commit을 수정할 수 있음- how to?
- 파일 수정
- git add로 준비
git commit --amend
- 이때, commit 메시지 수정 가능
- 예전 commit을 수정하려면 다른 기능과 조합 필요
- how to?
- tag 관리
- 특정 commit에 tagging하는 역할
- tag를 설정하면 commit ID 대신 tag로 조회 가능