오픈소스 컨트리뷰션 아카데미에서 진행된 Git/Github 기본 실습 강의를 정리한 내용입니다.


오픈소스 기여 과정 개괄

  1. 개발 환경 구축(컨테이너)
  2. fork하여 프로젝트 복사
  3. clone하여 소스 다운로드
  4. 프로젝트 개발 현황 파악/분석 → Reading Skills 필요
    1. history파악하는 것이 중요! → Reading Skills
  5. 소스 수정 → commit하여 히스토리 저장
  6. 수정 내용 제출 → 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!
 

git branch와 git merge

Git을 사용하여 버전을 관리할 때 브랜치를 만들고 병합(Merge)하는 방법에 대해서 알아봅시다.

dev-yakuza.posstree.com

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 보다 우선 순위가 높기 때문에

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
  • 여러개 저장??
 

git stash - Saving Changes | Atlassian Git Tutorial

Git stash temporarily shelves or stashes changes made to your working copy so you can work on something else, and come back and re-apply them later on.

www.atlassian.com

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 절차 → 최신 방식
 

[TFLite] Add int16x8 support for RELU_N1_TO_1 and PRELU operators by johan-gras · Pull Request #52913 · tensorflow/tensorflow

Hello, This PR adds int16x8 support for RELU_N1_TO_1 and PRELU operators. Thanks, Johan.

github.com

Commit 수정

  • 기존 commit에서 수정이 필요한 경우?
    • 새로운 commit 등록 → 쓸모 없어지는 commit 존재
    • → 혼란을 야기할 수 있음
  • --amend : 가장 최신 commit을 수정할 수 있음
    • how to?
      1. 파일 수정
      2. git add로 준비
      3. git commit --amend
        • 이때, commit 메시지 수정 가능
    • 예전 commit을 수정하려면 다른 기능과 조합 필요
  • tag 관리
    • 특정 commit에 tagging하는 역할
    • tag를 설정하면 commit ID 대신 tag로 조회 가능