오픈소스 101 기본교육 Git

bella·2022년 7월 13일
0

수단(도구) 보다 목적이 중요하다
목적: 협업을 잘 하기 위해서!

단순히 commit, push 하는 방법을 배우는 것이 아닌, 왜 이것이 필요한지, 어떤 상황에서 사용할 수 있는지 컨셉을 정하고 상황을 시뮬레이션하면서 진행되었다.
실제로 알고 있던 명령어도 상황을 예시로 진행하려고보니 막막한 부분이 있었고, 터미널만을 이용해서 git을 관리했던 적이 없다보니 낯선 명령어도 많았다. 여러번 해보면서 익혀야할 것 같다.


📍 기본실습

기본 과정에서는 Groom IDE를 이용해서 웹으로 터미널을 조작하며 실습이 진행됐다.

필수로 알고 있어야 한다고 말씀해주신 기본명령어들

ls: 폴더 내용을 확인
mv: 파일명 변경, 혹은 파일 이동
cd: (change directory)폴더 이동
pwd: (print working directory)현재 경로를 출력


🚩 오픈소스 프로젝트 pytorch에 개발참여를 한다는 컨셉으로 진행(샘플 디렉토리 이용)

🔥 오픈소스 기여 순서

  1. 개발환경 구축(구름 IDE 컨테이너 생성)
  2. fork (github 프로젝트 복사)
  3. clone (로컬에 소스 다운로드)
  4. 프로젝트 개발 현황 파악/분석 (Reading Skill)
  5. 소스 수정한 뒤 commit 히스토리 저장
  6. 수정내용 제출 (Pull-Request(PR))

4) Reading Skill
-> 오픈소스 Git 프로젝트 읽는법: 누가 제일 많이 개발에 참여했는지 확인하기
(협업하고 소통하기 위해서 확인해야 함, 누구한테 리뷰받고 조언을 얻을 수 있는지 판단)

git log --oneline | wc -l : 전체 커밋 갯수 한 줄 조회
git shortlog | -sn : 커밋 갯수 많은 사람부터 오름차순 조회
-> 커밋 갯수 많은 사람이 개발에 많이 참여한 사람

git log : 커밋 내역 조회
--oneline : 한 줄로 조회
| : 하이픈으로 구분 시 왼쪽 영역에 우선순위
wc : (word count) 전체 커밋 갯수 확인(수정된 횟수)
-l : (line)
-- 'mnist/' : 특정 폴더(mnist)내에서 조회
--after=2020-01-01
--before=2020-01-31
: 특정 날짜 내에서 조회
--reverse : 순서 반대로 조회
-p : 히스토리 내역 세부적으로 조회

git shortlog : 커밋 갯수 + 작성자 조회
-sn : (summary, number) 요약, 오름차순 조회

git show '커밋아이디' : 수정사항 확인
grep "diff --git" : ""를 포함하는 내용 조회
git diff : 수정된 내용 조회


👉 커밋 메세지 : 소스 수정의 '이유'를 작성하는 것

Fix : 잘못된 것을 고친 것
Improve : 원래는 잘 되던 것을 개선한 것(예: 10초 -> 5초)
Add : 없는 기능, 옵션 추가할 때
Implement : 설계를 구현하는 것(미리 commision된 부분을 구현)
Support : 윈도우에서만 가능하던 것 -> 리눅스에서도 가능하게(ARM => x86)


🔥 오픈소스 개발참여 준비

👉 Git 설정하기

git config --global user.name "본인이름" : 이름 등록
git config --global user.email "본인메일" : 메일 등록
git config --global core.editor nano
sudo apt install -y nano

git config --list : 등록된 정보 확인
(잘못 입력했을경우 다시 입력하면 덮어쓰기 됨)

👉 Branch 생성하기

git checkout -b '브랜치명' : 브랜치 생성 및 해당 브랜치로 이동
git branch -D '브랜치명' : 브랜치 삭제
rm '폴더명/': 폴더 삭제

👉 토큰 생성하기(push할때 ID/PW 대신 사용)

https://github.com/settings/tokens
1. Generate token 버튼 클릭
2. 토큰명 적기 (예:test)
3. workflow 체크하기
4. 하단 Generate token 버튼 클릭
5. 생성된 토큰 복사하기
6. git push origin '폴더명'
7. username 대신 토큰 붙여넣기
8. password는 그냥 enter 키
9. fork 프로젝트 github 사이트 들어가기
10. 수정한 브랜치 선택하기
11. contribute 버튼으로 PR

❓ git을 통해서 파일을 다루는 방법이 왜 필요한가?

  • commit 생성하기 전, 내가 수정한 사항을 체크하고 싶을 때 'git diff'로 조회가능
  • 수정한 파일을 복구하고 싶을 때 'git checkout -- 폴더명'를 입력하면 복구 가능

checkout : 히스토리 창고(.git)에서 가져온다는 뜻 (도서관 책을 대출받을 때 사용하는 의미와 비슷하다), 단순히 브랜치 이동하는 명령어가 아님

git commit --amend : 최신 commit에 흡수
소스 수정 -> git add -> commit 생성 -> 놓친 수정사항 발견 -> 기존의 commit을 수정하려면?
-> --amend 옵션으로 최신 commit을 수정할 수 있다.



📍 고급실습(rebase/blame)

고급실습에서는 git bash를 이용해 터미널 환경을 구축한 뒤 실습을 진행했다.

👉 rebase가 필요한 상황

여러명이 협업할 때 base commit이 변경될 수 있음 -> base commit이 다를경우 충돌이 발생할 수 있음 -> rebase를 통해 base commit을 최신화 가능

🔥 rebase 사용방법

  1. 오픈소스 프로젝트에 commit 추가된 상황
  2. 추가된 최신 commit 들을 로컬로 가져온다
    git fetch upstream master (pull = fetch + merge)
    fetch만 하면 .git 히스토리 창고에만 저장
  3. 'upstream/master' 브랜치가 자동 생성됨
  4. 현재 Base를 최신으로 갱신한다
    git rebase upstream/master

👉 2개 commit 있었던 과거로 rewind한 뒤 파일 3개 추가하기

  1. git rebase -i --root (i: interactive, root: 최초커밋부터 조회)
  2. 두번째 commit 위치에 pick -> edit 으로 수정
  3. touch hello_1.c && git add hello_1.c && git commit -m 'test: add hello_1.c'
  4. git rebase --continue : 되돌렸던 로그 복원

👉 위에서 추가한 3개의 커밋 1개로 합치기(최초 1개 커밋만 남기기)
1. git rebase -i --root (i: interactive, root: 최초커밋부터 조회)
2. 세 번째 파일 commit 위치에 pick -> edit 으로 수정
3. git reset --soft HEAD~1 : 최신 커밋 삭제, 내용은 보존
4. git commit --amend : 최신커밋 덮어쓰기 (수정파일에 3번째 파일 추가됨, 커밋메세지 수정)
5. git rebase --continue : 되돌렸던 로그 복원
6. (1~5)반복해서 두 번째 커밋, 첫 번째 커밋과 합치기
7. git status로 상태 확인

reset --soft HEAD~1 : --hard와는 다르게 commit 정보만 삭제하고 파일 변경분은 남겨둔다.
git rebase --abort : rebase 작업을 취소하고 원래 상태로 되돌아감
git reset --hard origin/master : 히스토리 전체 원상 복구 하는 방법

❓ blame 기능을 사용하는 이유

  1. 특정 소스 라인을 수정해야하는 상황
    760번째 라인이 문제가 있다고 판단 => 760번째 라인을 만든 commit을 찾아내서 이해한 다음 => Bug fix commit 생성해서 수정한 뒤 제출
  2. 소스 분석 / 리딩
  3. 클래스, 함수 추가 => 역추적

👉 충돌상황 해결하는 방법 실습

  1. git remote add upstream '클론할 프로젝트 주소' : 포크한 본래 프로젝트 주소 추가하기
  2. git fetch upstream master : 새로 추가된 사항 가져오기
  3. git rebase upstream/master : 새로 추가된 사항으로 rebase 진행
  4. git status : 충돌 상황 확인하기
  5. git diff : 수정사항 확인
  6. nano README.md : 에디터 이용해서 충돌 부분 수동으로 수정 및 정리하기
  7. git add README.md : 수정 파일 올리기
  8. git rebase --continue : rebase 돌아가기
  9. git push origin master -f : 마스터로 변경사항 강제 푸쉬

기본 ppt / 고급 ppt
profile
기록하며 공부하기

0개의 댓글