2020년 3월 8일 일요일

깃허브(github) 개념 및 사용법 정리

이 글은 협업을 통한 개발 시 많이 사용되는 깃허브(github) 명령어 기록 겸 사용법 간단히 정리한다. github는 2018년 6월 마이크로소프트에 8조원(75억 달러)으로 인수된 개발자 협업 및 형상관리(configuration management) 플랫폼이다. 톰, 크리스, 피제이 개발자 3명이 2007년부터 개발을 시작해 전세계에 서비스되었다(상세).


깃허브 가입 및 설치
깃허브는 명령행 인터페이스 프로그램과 깃허브 웹사이트를 통해 형상 관리를 지원한다.

깃허브 사용을 위해 다음 링크 클릭해 가입하고, 깃허브 프로그램을 설치한다.
깃허브 형상관리 개념
형상관리는 소프트웨어나 문서의 변경사항을 체계적으로 추적 관리하는 것이다. 깃은 형상관리 플랫폼이다. 다음 그림은 새 소스파일을 생성해 깃(git) 저장소에 저장하고 협업하는 과정을 보여준다. git은 크게 4개 git 관리 파일 DB를 가진다. git은 각 DB들을 갱신하며 파일 형상을 관리한다.
  • workspace: 컴퓨터 로컬 작업 폴더
  • staging: 컴퓨터 로컬 폴더 내 파일 인덱스 DB
  • local repository: 컴퓨터 로컬 폴더 내 파일 저장소
  • remote repository: 협업용 원격 깃 저장소
git process(Diego C Martin)

깃 프로세스는 다음과 같다. 이 과정에서 파일이 추가, 변경, 삭제된 이력과 내용은 모두 깃허브에 기록된다. 이를 통해, 파일 내용을 특정 버전으로 되돌리거나(roll back), 다른 사람이 만든 파일과 병합(merge)하는 형상관리가 가능해진다. 앞의 그림은 이 과정을 잘 보여준다.
  1. 로컬 폴더 생성: 프로젝트 파일이 저장될 폴더를 생성한다.
  2. 깃 저장소 생성: 온라인 협업 작업을 위한 원격 작업할 깃 저장소를 생성한다.
  3. 로컬과 깃 저장소 연동: 원격 협업 작업을 위해 깃 저장소 연동 정보를 생성한다. 
  4. 파일 생성 및 깃 저장소 추가(add): 파일 작업 후 해당 파일을 로컬 폴더 인덱스에 추가한다.
  5. 파일 커밋(commit)/푸시(push): 작업한 파일들을 커밋해 깃 저장소에 추가하고, 실제 파일 내용을 푸시하여 깃 저장소에 저장한다.
  6. 로컬 폴더 파일 갱신(PULL): 다른 사람들이 푸시한 깃 저장소 최신 버전 파일들을 로컬 폴더에 다운로드 받아 동기화한다.
깃은 형상관리를 위해, 로컬 폴더에 .git 이란 이름의 캐쉬 폴더를 관리한다. push하였을 때, 이 폴더에 있는 파일이 stage에 있는 파일로 취급되어, 리모트 서버에 업로드된다. 같은 이름의 파일이 서로 다르다면, 병합을 진행하는 데, 이 경우, 충돌이 발생된다면, 에러가 나므로, 사용에 주의해야 한다. 

주요 사용 명령 예시
주로 다음과 같은 명령을 사용하게 된다.
git status 
git add *.*
git commit -m 'update version'
git push origin main
git pull origin main

git은 소스코드를 push할때 리모트에 같은 소스의 수정본이 있다면, merge를 하려 시도하다가 충돌(conflict)이 발생할 수 있다(참고). 만약, 임시로 로컬에 생성되는 파일이나 폴더라면, 다음과 같이 .gitignore 파일을 만들어 merge를 피할 수 있다. 
.gitignore
input/
output/

머지를 무조건 취소하려면 다음 명령을 입력한다.
git merge --abort
git reset --merge
git rm -r --cached .

이런 저런 시도를 해도 깃이 꼬일 경우, 작업한 파일만 백업해 놓은 후, git clone, git init로 초기화해서 다시 시작하는 것이 편하다.
git clone 
git init

저장소 생성, 파일 형상관리 절차
깃허브 로긴 후 개발 프로젝트 폴더에 해당하는 저장소(repository)를 생성한다.
  • Repository 생성. README 생성 옵션은 체크하지 않음
  • 로컬에 개발 폴더 생성
  • 로컬 개발 폴더 내에 source.py 파일 생성 및 내용 입력
  • git init 로 로컬 폴더 git 설정
  • git add source.py 로 파일 인덱스를 추가함
  • git commit -m "source.py" 로 파일 정보를 github에 저장
  • git status 로 상태 확인
  • 저장소 주소를 다음과 같이 이름과 연결. 주소와 이름은 적절히 수정할 것.
git remote add remoteName https://github.com/username/repositoryName
  • git push remoteName master 로 현재 커밋 파일을 저장소에 저장
git push 시 아이디 및 암호 입력 화면
git push 화면
다시 source.py를 수정하하면, 다음 과정을 다시 거쳐야 한다.
  • git add source.py
  • git commit -m "source.py"
git 저장소가 달라졌으면, 로컬을 동기화하기 위해 다시 git pull origin master 수행해야 한다.
만약, 로컬 작업 저장소 파일들을 git 저장소 파일들로 덮어쓸려면 다음 명령을 수행한다.
  • git fetch --all
  • git reset --hard origin/master
브랜치 생성 및 사용
브랜치는 일정 기간 동안만 유지되는 개발 시 사용한다. 브랜치 사용법은 다음과 같다.
  • git branch 로 브랜치 목록 보기
  • git branch sub1 브랜치 만들기
  • git checkout sub1 로컬 저장소의 브랜치 전환
  • git branch
  • git add source.py
  • git commit -m "source.py"
  • git push remoteName sub1
  • git checkout sub1
  • git pull
브랜치 병합은 다음과 같다. 
  • git checkout master 로컬 저장소 브랜치 전환
  • git merge sub1 병합
  • git push remoteName master 저장
브랜치 삭제는 다음과 같다. 
  • git branch -d sub1 
  • git branch
Rollback 하기
현재 파일을 수정하다, 깃 저장소에 최신 파일로 되돌리고 싶을 때 다음 명령어를 사용한다.
  • git reset --hard {commit번호} : 특정 커밋으로 되돌리고, 이후 버전은 히스토리에서 삭제됨
  • git reverse {commit번호}: 특정 커밋으로 되돌리고, 이후 버전 이력은 히스토리에 남아 있음
  • git checkout . : 로컬 작업 폴더에서 수정한 모든 파일을 git add 이전의 현재 버전으로 되돌림
오픈소스 기여하기
특정 오픈소스에 기여하는 방법은 다음과 같다. 

1. 해당 오픈소스 github의 fork 메뉴를 클릭한다. 
2. fork 된 프로젝트는 나의 github 저장소에 복사된다. 
3. 해당 github를 clone한다. 
4. 로컬에서 작업한 후, add, commit, push 한다. 
5. fork 된 github에 PR (pull request) 메뉴를 클릭하여, 원 개발자가 fork된 프로젝트의 수정 소스를 병합하도록 요청한다. 이때 수정 내용을 자세히 기술해 놓는다. 

다음은 이를 보여주는 순서도이다. 
상세한 메뉴얼은 다음을 참고한다. 
    깃허브 에러 대처 방법
    git 진행 시 에러는 다음과 같이 해결한다.
    • Updates were rejected because the remote contains work that you do not have locally: 저장소 생성 시 README를 체크하지 말거나, git pull 로 해결. 예) git pull origin master
    • Updates were rejected because the tip of your current branch is behind: git pull 할 때 --allow-unrelated-histories 옵션을 추가.
    git 에러 화면 예시

    깃 주요 명령어 요약
    앞에서 사용한 깃 주요 명령어는 다음과 같다. 
    git init : git 생성
    git clone git_URL : 깃 저장소에서 파일들 다운로드
    git checkout branch_name : 브랜치 선택
    git checkout -t remote_path/branch_name : 원격 브랜치 선택
    git branch branch_name : 브랜치 생성
    git branch -r : 원격 브랜치 목록보기
    git branch -a : 로컬 브랜치 목록보기
    git branch -m branch_name change_branch_name : 브랜치 이름 바꾸기
    git branch -d branch_name : 브랜치 삭제
    git push remote_name - delete branch_name : 원격 브랜치 삭제하기 
    git add file_path : 수정한 코드 선택
    git commit -m “commit_description” : 선택한 코드 설명 입력 ( git commit -m “내용”)
    git push romote_name branch_name : add 후 commit 코드 git server에 전송 (git push origin master)
    git pull : git서버에서 파일 다운로드 후 merge
    git fetch : git서버에서 최신 파일 다운로드
    git reset --hard HEAD^ : commit한 이전 파일 취소
    git reset --merge : merge 취소
    git reset --hard HEAD && git pull : git 파일 강제 모두 다운로드
    git config --global user.name “user_name ” : git 계정 Name 변경
    git config --global user.email “user_email” : git 계정 Mail 변경

    레퍼런스

    댓글 없음:

    댓글 쓰기