Skip to content

moon201595/oss_git_example

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

501 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

오픈소스소프트웨어 강의 내용 정리 by 201595 문준혁

오픈소스 로고

전남대학교 인공지능학부 2025학년도 2학기 오픈소스소프트웨어(SAI0003-2) 강의 요약 및 학습 정리


♧ 강의 개요

교과목명: 오픈소스소프트웨어(SAI0003-2) 담당교수: 최광훈 강의시간: 화1목1 강의실: AI융합-301 학점: 3.0

♧ 수업 목표 및 역량

이 과목은 3가지 목표를 지향합니다:

  1. 오픈소스소프트웨어 개발 기초
    • 소스코드 버전 컨트롤
    • 패키지 관리
    • 프로젝트 빌드
  2. 애자일 기반 개발 방법론
    • 짝 프로그래밍
    • 테스트 주도 개발
    • 클라우드 기반 데브옵스
  3. 자기주도 학습 능력
    • 새로운 개발환경 적응
    • 협력적 소프트웨어 개발 주도
역량 세부 목표
컴퓨팅사고 함수형 프로그래밍 언어 스타일 익히기
융합 LLM/ChatGPT를 새로운 프로그래밍 학습에 활용
글로컬 Git/Github를 통한 협업 방식 학습
문제해결능력 오픈소스 소프트웨어 기본 개념과 도구 습득

♧ 수업 방법

플립러닝 방식으로 진행:

  • 사전 동영상 학습
  • 매 강의 시작 시 10분 퀴즈
  • 요약 강의 및 연습문제 풀이

♧ 평가 방법

  • 중간고사: 30%
  • 기말고사: 40%
  • 개별과제: 20%
  • 수업참여도: 10%

참고: 모든 시험은 지필고사로 진행되며, 개별과제는 주로 프로그래밍 과제입니다.

♧ 주요 교재

  • 주교재: 별도 교재 없이 강의 자료 사전 배포
  • 부교재: Haskell MOOC - Joel Kaasinen & John Lang
  • 참고자료: YouTube 강의



Week 1-2: 오픈소스소프트웨어 개요

♧ 오픈소스 소프트웨어 정의

오픈소스 소프트웨어란 소프트웨어 저작권 소유자가 모든 사람에게 소스 코드를 게시, 사용, 복사, 수정 및 배포할 권리를 부여한 소프트웨어.

♧ 상용 SW vs 오픈소스 SW 비교

주요 차이점

  • 라이선스 방식 - 상용 SW: 개별 이용허락 (EULA) - OSS: 일괄 사전 이용허락
  • 비용 - 상용 SW: 로열티 지급 필요 - OSS: 비용 부담무료
  • 소스코드 - 상용 SW: 바이너리만 제공 - OSS: 소스코드 공개
  • 수정 권한 - 상용 SW: 복제, 배포, 수정 불가 - OSS: 복제, 배포, 수정 허용
구분 상용 소프트웨어 오픈소스 소프트웨어
라이선스 개별 이용허락(EULA) 일괄 사전 이용허락
비용 로열티 지급 무료
소스코드 바이너리만 제공 소스코드 공개
수정권한 수정 불가 수정 허용

♧ 주요 기업의 오픈소스 프로젝트

글로벌 기업들의 OSS 기여:

♧ 오픈소스 라이선스 비교

주요 라이선스별 특징

라이선스 상용SW 연동 수정시 공개의무 특허보호
GPL 2.0
LGPL
MIT/BSD
Apache 2.0
MPL 1.0/1.1

라이선스 특징 상세

  1. GPL (GNU General Public License)
    • 강력한 카피레프트
    • GPL 코드와 링크된 소프트웨어는 전체가 GPL을 따라야 함
  2. LGPL (GNU Lesser General Public License)
    • 라이브러리 수준에서 링크 허용
    • 수정한 부분만 공개하면 됨
  3. MIT/BSD License
    • 매우 자유로운 라이선스
    • 상업적 이용 가능



Week 2-1: 버전 관리 개요

♧ 왜 버전 관리 시스템이 필요한 이유

버전 관리 없이 작업하면:

  • 단순 백업 복사본 생성 (파일명_v1.doc, 파일명_v2.doc)
  • 파일명에 버전 번호나 날짜 추가
  • 공유 폴더에서 동시 편집으로 인한 충돌

문제점: 파일 충돌, 변경 이력 추적 어려움

♧ VCS (Version Control System)의 핵심 기능

  1. 체크인/체크아웃: 파일 수정 이력 관리
  2. 브랜치: 별도 개발 라인 생성
  3. 머지: 브랜치 간 변경사항 통합
  4. 충돌 해결: 동시 수정 시 충돌 처리
  5. 태깅: 특정 버전에 라벨 부여 (Release 1.0)

♧ VCS 종류 비교

중앙집중식 VCS

  • 특징: 하나의 중앙 저장소
  • 예시: CVS, SVN
  • 장점: 단순한 구조, 관리 용이
  • 단점: 중앙 서버 의존성, 오프라인 작업 제한

분산형 VCS

  • 특징: 개별 로컬 저장소 보유
  • 예시: Git, Mercurial, Darcs
  • 장점: 오프라인 작업 가능, 빠른 속도
  • 추가 기능: fork, pull request

♧ VCS 워크플로우 예시

Joe와 Sue의 협업 시나리오:

  1. Joe와 Sue가 동일한 파일 r3를 체크아웃
  2. Joe: -Eggs, +Cheese 수정
  3. Sue: -Eggs, +Hot Dog 수정
  4. Joe가 먼저 커밋하여 r4 생성
  5. Sue는 충돌로 인해 커밋 불가 ⚠️

충돌 해결 방법:

  • Sue의 변경사항을 Joe의 r4에 재적용
  • Joe의 변경사항을 Sue의 것으로 덮어쓰기

충돌 해결 개념도

♧ 태깅 (Tagging)

특정 리비전에 라벨을 부여하여 쉽게 참조할 수 있게 함

  • 예시: r4Release 1.0
  • 중요한 버전이나 마일스톤에 의미있는 이름 부여

♧ 실제 사례: Windows 개발

Microsoft Windows Media Player 11과 Internet Explorer 7 통합:

  • Forward Integration (FI): 브랜치에서 메인으로 통합
  • Reverse Integration (RI): 메인에서 브랜치로 역통합

FI와 RI 개념도




Week 2-2: Git

♧ Git 개발 배경

개발자: Linus Torvalds (Linux 커널 창시자) 목적: Linux 커널 공동 개발을 위한 도구 특징: 분산 버전 관리 시스템

♧ Git의 4가지 영역

  1. Workspace (작업 디렉토리)
    • 실제로 작업 중인 파일들
  2. Index/Stage (스테이징 영역)
    • 다음 커밋에 포함될 파일들
  3. Local Repository (로컬 저장소)
    • 로컬에 커밋된 파일들
  4. Remote Repository (원격 저장소)
    • GitHub 등 원격 서버에 푸시된 파일들

Git의 4가지 영역 개념도

♧ 주요 Git 명령어

저장소 초기화 및 복제

git init # 로컬 저장소 초기화
git clone <repository-url> # 원격 저장소 복제

파일 추가 및 커밋

git add <filename> # 특정 파일을 스테이징
git add . # 모든 변경 파일을 스테이징
git commit -m "메시지" # 커밋 생성
git commit -a # 수정된 모든 파일 자동 add + commit

원격 저장소 연동

git remote add origin <url> # 원격 저장소 추가
git push origin main # 로컬 → 원격 업로드
git fetch origin # 원격 → 로컬 다운로드 (병합 X)
git pull origin main # fetch + merge 동시 실행

상태 및 이력 확인

git status # 현재 상태 확인
git log # 커밋 히스토리 확인
git diff # 변경사항 비교
git diff HEAD # 워크스페이스와 최신 커밋 비교

♧ Git 워크플로우 상세

단계별 데이터 흐름:

  1. git clone - 원격 저장소를 로컬로 복제
  2. git add - 워크스페이스에서 스테이징 영역으로
  3. git commit - 스테이징 영역에서 로컬 저장소로
  4. git push - 로컬 저장소에서 원격 저장소로
  5. git fetch - 원격 저장소에서 로컬 저장소로 (병합 X)
  6. git merge - 가져온 변경사항을 현재 브랜치에 병합
  7. git pull - fetch + merge를 한 번에 실행

Git의 4가지 워크플로우 개념도




Week 2-3: GitHub, Fork, Pull Request

♧ GitHub란?

GitHub은 Git 기반의 소셜 코딩을 위한 소스코드 호스팅 서비스입니다.

주요 기능:

  • Fork, Pull Request, Code Review 기능
  • Issue 추적 및 프로젝트 관리
  • 협업을 위한 소셜 네트워킹

♧ Fork & Pull Request 워크플로우

협업 과정 (6단계)

  1. Fork: 원본 저장소를 내 계정으로 복사
  2. Clone: Fork한 저장소를 로컬로 가져오기
  3. Branch: 새로운 기능을 위한 브랜치 생성
  4. Commit: 로컬에서 변경사항 커밋
  5. Push: Fork한 저장소에 변경사항 업로드
  6. Pull Request: 원본 저장소에 변경사항 제안

Fork & Pull Request 개념도

실제 협업 시나리오

1.Fork한 저장소 클론

git clone https://github.com/내아이디/oss_git_example.git

2.원본 저장소를 upstream으로 추가

git remote add upstream https://github.com/kwanghoon/oss_git_example.git

3.최신 변경사항 가져오기

git fetch upstream

4.충돌 해결 후 리베이스

git rebase upstream/main

5.내 Fork에 푸시

git push origin main

♧ 코드 리뷰 문화

Pull Request의 장점:

  • 코드 품질 향상: 동료 검토를 통한 버그 발견
  • 지식 공유: 팀원 간 기술 및 도메인 지식 공유
  • 표준화: 일관된 코딩 스타일 유지

리뷰 방법:

  • 라인별 댓글을 통한 구체적 피드백
  • 전체적인 설계 및 아키텍처 검토
  • 테스트 코드 및 문서화 확인

♧ 실습 예제: oss_git_example

과제: https://github.com/kwanghoon/oss_git_example을 fork하여 본인의 원격 저장소를 만들고, 이를 로컬로 가져와 수정한 다음 다시 올린 후 kwanghoon의 저장소에 pull request

협업 후 동기화 방법

다른 개발자들의 변경사항을 내 저장소에 반영:

1. git remote add pb https://github.com/kwanghoon/oss_git_examples
2. git fetch pb
3. git diff pb/master # 충돌 확인
4. git rebase pb/master
5. git commit -a -m "merge 3rd party contributions"
6. git push origin master



Week 2-4: Git Advanced Topics

♧ Rebase vs Merge

Merge 방식

A---B---C topic
/
D---E---F---G main
  • 브랜치들을 통합하며 머지 커밋(G) 생성
  • 기존 커밋 이력 완전 보존
  • 복잡한 그래프 형태의 히스토리

Rebase 방식

A---B---C topic
/
D---E---F main
  ↓ git rebase main

    A'--B'--C' topic
           /
D---E---F main
  • 커밋들을 재배치하여 선형 이력 생성
  • 깔끔하고 읽기 쉬운 프로젝트 히스토리
  • 주의: 공유된 커밋은 리베이스 금지!

♧ 고급 Git 명령어

인터랙티브 리베이스

git rebase -i HEAD~3 # 최근 3개 커밋 수정

pick → edit, squash, drop 등으로 변경 가능

특정 파일 변경 이력 추적

git blame filename.c # 각 줄의 최종 수정자 확인
git log -p filename.c # 특정 파일의 상세 변경 이력

변경사항 임시 보관

git stash # 현재 변경사항 임시 저장
git stash list # 저장된 stash 목록 확인
git stash pop # 가장 최근 stash 적용 및 삭제

♧ Git Flow 브랜치 전략

표준 브랜치 구조:

  • main/master: 배포 가능한 안정 버전
  • develop: 개발 진행 중인 브랜치
  • feature/기능명: 새로운 기능 개발 브랜치
  • release/버전: 배포 준비 브랜치
  • hotfix/버그명: 긴급 수정 브랜치

브랜치 전략 워크플로우

main ──●────●────●────●──
╲ ╱ ╱
develop ───●──●──●──●──●───
╱ ╲
feature/A ●─●─●─● ╲
╱
feature/B ●─●─●

♧ Git 고급 문제 해결

커밋 메시지 수정

git commit --amend # 직전 커밋 메시지 수정 git rebase -i HEAD~3 # 여러 커밋 메시지 수정

실수로 커밋한 파일 제거

git reset --soft HEAD1 # 커밋 취소, 변경사항 보존 git reset --hard HEAD1 # 커밋 및 변경사항 완전 삭제 (주의)

커밋 되돌리기 vs 재설정

  • git reset: 커밋 히스토리 자체를 변경 (위험)
  • git revert: 이전 커밋을 취소하는 새로운 커밋 생성 (안전)

자주 묻는 질문들과 간단한 답변

  1. Git과 Github의 차이는?
    • Git은 각 컴퓨터(local)에 설치되어 소스코드관리가 가능한 프로그램
    • Github는 remote 저장소가 있는 외부서버를 지칭
  2. Commit과 Pushd의 차이는?
    • commit은 local 작업폴더에 history를 쌓는 것이어서 외부망을 사용하지 않음
    • push는 remote 저장소에 history를 쌓는 것이어서 외부망이 필요함
  3. Fetch와 Pull의 차이는?
    • fetch는 가져와서 임시폴더(.git)에 저장
    • pull은 바로 현재 branch에 merge 작업을 동반함
    • Remote 저장소로부터 최신 commit 정보들을 가져오는 것은 매한가지
  4. Rebase와 Merge의 차이는?
    • rebase는 합치기 전에 되감기(rewinding)를 함
    • merge는 되감기를 안하고 합침
    • 두 branch의 차이점(commits)를 합치는 것은 매한가지



Week 3: Markdown

♧ Markdown이란?

Markdown은 존 그루버(John Gruber)와 아론 스워츠(Aaron Swartz)가 2004년에 개발한 경량 마크업 언어입니다.

주요 특징:

  • 일반 텍스트 에디터로 작성 가능
  • GitHub README 파일에서 널리 사용
  • HTML로 쉽게 변환 가능
  • 배우기 쉽고 사용하기 편함

♧ Markdown 주요 문법

제목 (Headers)

# H1 제목 (가장 큰 제목)

## H2 제목 (두 번째 크기)

### H3 제목 (세 번째 크기)

#### H4 제목 (네 번째 크기)

강조 (Emphasis)

  • 이탤릭체: *이탤릭체*
  • 볼드체: **볼드체**
  • 볼드 이탤릭: ***볼드 이탤릭***
  • 취소선: ~~취소선~~

목록 (Lists)

  • 순서 없는 목록 (- 항목)
  • 순서 있는 목록 (1. 항목)
- 항목 1
- 항목 2
    - 하위 항목 2-1
    - 하위 항목 2-2
- 항목 3

링크 및 이미지

  • 링크: [텍스트](https://example.com)
  • 이미지: ![대체 텍스트](https://example.com/image.png)

인용문 (Blockquotes)

> 이것은 인용문입니다.
> 여러 줄에 걸쳐 작성할 수 있습니다.

> 중첩 인용문도 가능합니다.

코드 블록

# 여러 줄 코드 블록은 backtick 3개로 감쌉니다.
git status
git log

표 (Tables)

항목 가격 수량
사과 1000원 10개
바나나 1500원 5개
오렌지 2000원 8개

Editors

  • VSCode
    • Edit and preview(Ctrl + Shift + V)
  • StackEdit

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Ruby 100.0%