2017년 12월 6일 수요일

pyCharm에서 github 쓰기

문제: 개발 프로그램의 관리를 위하여 github을 사용하자. (pycharm, github기준)

작성일: 17.12.06 

업데이트: 23.02.01

 
Git: 파일 버전관리 시스템
 - 장점: 이전 상태로 돌리거나, 문제의 원인을 추적하고, 파일이 분실되어도 복구가능.
 - 단점: 익숙해지기까지 시간이 걸리고 귀찮음.

참고하면 좋은 사이트:
 - http://learnbranch.urigit.com/  애니메이션 기반으로 설명 잘해줌.
 - backlogtool.com 개념이해


구성
 - 작업폴더: 현재 프로젝트가 저장된 위치(실제 코드가 존재하는 작업공간)
 - localRepository: 현재 PC의 저장소(작업 폴더와는 다른 별도의 저장공간)
 - remoteRepository: NAS/GitHub/BitBucket 처럼 백업본을 저장할 원격 서버의 저장소

(참고: GitHub는 student email이 있으면 private저장소가 무료, BitBucket은 그냥 private저장소가 무료)

사용 예
상황1 - 이미 있는 프로젝트(PC) --> github에 올리기
<참고: https://recall2300.github.io/2016-12-26/pycharmxgit/command-line/>
  o 1. local git repository를 만들기
    - VCS -> Create Git Repository (위치는 임의에 가능하나, 현재 작업공간에 주로 만듬)
        완료되면 좌측 파일리스트 내 파일들이 빨간색으로 변함
        (색의 의미: https://www.jetbrains.com/help/pycharm/file-status-highlights.html#views)
        (빨간색파일: 파일은 존재하나 git관리대상 아님)
    - git관리가 필요한 파일을 체크하기
        파일 우클릭 > git > add
    - Git (VCS가 Git으로 바뀜) > commit > name, email 입력 후, commit

 o 2. Remote Repos. 만들기 및 연결
   - Git (VCS가 Git으로 바뀜) -> Github -> Share Project on GitHub
    -- Repository name: github에 만들어질 repo. 이름 입력(default도 괜찮음).
    -- Private를 원하는 경우 클릭 => Share 클릭.
(X) 만약 처 
음 VCS을 사용하는 경우라면 현 사용자에 대한 정보(email, name)를 입력해야 함.
ctrl+K로 commit changes 다이얼로그를 열고, 우측 Git/Author에 name<email>을 입력한 후, commit을 하면 됨.

이후 코딩을 하기 전에 할 일
 - 내가 로컬에서 작성한 코드와 원격에 저장된 코드와 차이가 있을 수 있기에(아마도 로컬에서 무언가 업데이트가 되었거나 협업코드라면 원격이 업데이트 상태일 수 있음)
 - 이를 동일하게 유지시켜주자.
 - VCS -> commit: 현재 로컬코드를 로컬 저장소로 업데이트.
  -- 팝업창에서 업데이트가 불필요한 폴더는 빼주고, 바뀐 코드는 확인 후, Commit.
  -- commit을 통해 여러 코드를 업데이트할 경우, message는 하나만 올라감.
 - VCS -> git -> Push: 로컬 저장소 내용을 원격 저장소로 업데이트.
 
코딩 작업을 하고나서 할 일.
 - VCS -> commit: 현재 파일들에 대한 스냅샷을 local repos에 기록(변화된 부분만 저장).
 - push: commit을 통한 변경정보를 remote repos에 업데이트한다. (localRep -> remoteRep)

상황2 - github에 있는 내용 가져와서 시작하기 
 - 1. pyCharm에서 New Project로 아무 프로젝트나 만들기
 - 2. VCS -> Get from Version Control
   - 2.1 만약 공개 repository에서 받는다면, 왼쪽 Repository URL을 입력하여 클론
   - 2.2 만약 개인 repository에서 받는다면, 왼쪽 GitHub선택하여 로그인 후, 원하는 repository를 선택하여 클론 
   - a. 만약 로그인이 안되면, Use Token으로 해볼 것: 
   - b. github사이트에서 setting -> Developer settings -> Personal access tokens -> Generate new token -> 필요할 권한 선택(repo, gist선택)
   - c. 혹은 이미 발행한 토큰이 있다면, github사이트에서 setting -> Developer settings -> Personal access tokens -> 발행한 토큰 선택 -> Regenerate token
   - d. 발행받은 토큰을 입력
 - 3. (불필요)혹시나 VCS -> Update Project 해봄
 
 

상황3 - Remote 서버(BitBucket/git저장소), Local PC1(소스트리 사용)에서 작업
- 0. 서버 repos 설정: BitBucket 로그인 후, repos 생성.
- 1. 서버-Local PC 연결: + -> Remote -> Bitbucket/ID -> Clone -> Local Folder/이름 설정. 이 때, Local Folder는 비어있어야 함.
- 2. PC1에서 작업시작-> src1.txt 생성
- 3. 작업 내용 기록하기: commit하기 스테이지에 올린 후, 우측하단 commit (locally saved).
- 4. 작업 내용 서버에 업데이트하기: push하기(좌 상단에 있음)


이후 코딩 시작전에 할 일.
 - clone or checkout: project 복사해오기(혹은 만들기)
 - pull: 서버의 변경사항만 가져오기 (remoteRep --> localRep & workFolder)
 


 - branch: commit에 대한 참조에 naming을 한 것. branch간 이동은 git checkout [브랜치명]으로 함.
 - checkout [브랜치명]: branch간 이동.
 - merge [브랜치명1] [브랜치명2]: 브랜치1을 2쪽으로 통합함.
 - rebase [브랜치명]: 현재 작업을 브랜치명쪽으로 옮김.
 - reset [브랜치명/HEAD~#]: 이전 커밋으로 돌리되 마치 안한 것 처럼 기록을 지움.
 - revert [브랜치명/HEAD~#]: 이전 커밋으로 돌리되 새로 커밋을 만들고 undo를 기록함.

Git repository cloud service
gitHub - 공개는 무료, 비공개는 유료(대학교 이메일 ID로 등록시 모두 무료)
bitbucket - 비공개도 무료
gitlab -
(참고: https://stackshare.io/stackups/gitbucket-vs-github-vs-gitlab)

Client tools
git kraken (linux/windows, free for non-commercial use)
Atlassian SourceTree (windows/mac, free)
Pycharm VCS - http://ngee.tistory.com/818 사용법

Error 모음
 - CRLF will be replaced by LF in ~
  -- windows코드와 linux코드를 혼용해서 사용하는 경우 발생.
  --

액션-시작
 - git init: git 저장소 생성.
 - git clone username@host:URL: 원격 저장소에서 복제.
 => local repo에 working directory, index(stage), HEAD가 준비됨.
 => working directory는 실제 파일
 => index(stage)는 변경내용을 임시로 기록.
 => HEAD는 최종 확정본(변경내용을 최종 기록 by commit).

액션-파일 추가/변경
 - git add <파일>: 파일을 git관리대상(index)에 추가.
 - git commit -m "msg": 변경사항을 local repo.에 업데이트함(HEAD에 반영).

 - git push origin <branch-name>: 변경사항을 origin이라는 remote repo.에 <branch-name>이라는 branch를 만들어서 업데이트함.
 => 이때 원격에는 원 코드 origin과 변경된 코드 branch가 같이 존재함.
 => 만약 동일한 branch에 update시, 서버와 내용이 다르다면(서버에서 clone한 시간 이후 서버 변경 내용이 존재시) push 취소 후, merge 시도 함.
 - git remote add origin <remote address>: origin이 clone한 것이 아니라면 주소를 추가해야함.

액션-branch갈아타기
 - git checkout -b <branch-name>: 가지 만들고 갈아타기
 - git checkout -d <branch-name>: 가지 지우기
 - git checkout master: 가지 갈아타기

액션-파일 갱신/병합

 - git pull: fetch(remote repo.->local repo.로 받아옮) + merge(코드 병합)

 - remote: remote repo.를 관리(추가, 삭제)
 
액션-되돌리기
 - git checkout -- <파일이름>: 변경내용 되돌리기

액션-특정 디렉토리를 git관리에서 제외

 - pycharm의 좌측 프로젝트 트리구조에서 해당 폴더 우클릭 -> git -> add to .gitignore -> git/info/exclude

 
즉. 작업 전 pull, 작업 후 working하는 것 확인 후, commit/push를 하는 것이 바람직함.