My Profile Photo

DongChanS's blog


수학과 학생의 개발일지


GIT 파헤치기

빗버켓 (https://bitbucket.org/)

: 여러개의 원격저장소를 쓰면 내 코드를 가져와서 수정해도 원래 원격저장소를 해치지 않으므로 좋음.

Repositories -> create repository -> 5명까지 프라이빗 저장소 공짜이므로 팀플할때 좋음.

개발자들의 컨벤션 : git commit -m “modify README.md” 이런식으로 ~~해라 같은 명령형식 쓰는게 관례임.

# git remote 명령어 알아야할것들 ($ git remote --help)

# 1.
git remote [-v | --verbose] # 어디에 로컬 자료들을 올릴 것인지?

$ git remote -v
origin  https://start6666@bitbucket.org/start6666/bitbucket_test.git (fetch)
origin  https://start6666@bitbucket.org/start6666/bitbucket_test.git (push)

# 2.
git remote add [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url> 
# 여태까지는 origin에만 넣어줬는데 이제 다른곳에도 넣어주고싶어.
# 매개변수 : 원격저장소의 별명(처음 만든 저장소는 origin이 별칭임) + 저장소의 주소

$ git remote add second https://github.com/start6666/git_pract.git
$ git remote -v
origin  https://start6666@bitbucket.org/start6666/bitbucket_test.git (fetch)
origin  https://start6666@bitbucket.org/start6666/bitbucket_test.git (push)
second  https://github.com/start6666/git_pract.git (fetch)
second  https://github.com/start6666/git_pract.git (push)

$ git push second master


# 3,4
git remote rename <old> <new> 
git remote remove <name>


SSAFY 컴퓨터와 내 컴퓨터의 싱크를 맞추는 방법

항상 생각해야 하는 것 : 원격 저장소의 코드가 가장 중요하다, 무결성을 확보하기

가상으로 home_computer 디렉토리를 만들어서 실습해보자.

  1. bitbucket에 있는 코드를 집으로 받아오기(동기화 : git clone 저장소 주소)

  2. 그래서 코드 디렉토리로 들어가서 git log를 하면 SSAFY 컴퓨터와 내 컴퓨터의 로그가 완전 동일함.

  3. 집컴퓨터 기준으로 코드를 수정하고, 애드/커밋/푸시를 해보자.

  4. 이제 다시 SSAFY컴퓨터로 왔을때는 집컴에서 업데이트된 코드가 들어가있지 않다.

    -> 이것을 받기 위해서는 pull(push의 반대개념)이라는 명령어를 쓴다.

    -> git pull origin master

  5. 가장 중요한 것

    1) 항상 작업 완료 후 원격에 업로드

    2) 내 컴퓨터와 원격을 비교해서 pull을 땡겨서 업데이트.

    3) 만약 이걸 하지 않고 내 코드를 따로 업데이트하면 conflict때문에 꼬인다고함.

    ​ -> 이럴 때 내가 작업한 코드만 남겨두고 원격저장소에서 clone해서 합치는 무식한 방법을 생각할 수 있지만, 다른 방법이 있다.

  6. branch

    커밋을 할 때 평행세계를 만들어서 관리를 함.

    checkout를 통해서 이런 branch들을 왔다갔다 할 수 있음 : complete를 해결가능함.

    근데 어려우니 일단 나중에..


Git을 통한 협업

branch라는 개념을 모를 때 협업을 어떻게 할 것인가?

협업상황에서는 fault rate가 높아지므로 아마 conflict문제가 생김.

​ 이런 문제 때문에 git에서는 프로젝트를 관리하는 대장이 꼭 필요함.


  1. 일단 repository를 만든다.

  2. 팀원을 초대한다. (setting -> collaborators -> 아이디 추가)

  3. 대장이 팀원에게 오더내리는 것을 github issue(게시판이라 생각)탭에서 할 수 있다.

    • 이슈 발급 (New issue 클릭) :​ 마크다운이 작동한다.
  4. 이슈가 잘 해결됬으면 Close issue를 통해서 닫을 수 있음, 물론 Closed issue를 볼 수 있음.

1

  1. 팀원이 코드를 수정해서 커밋하고 다시 대장은 반영된 저장소에서 pull하면됨. (git pull)

Conflict 문제

Git은 아주 스마트하므로, 동일하지 않은 파일을 독자적으로 작성하고 따로 커밋하면 그것도 잘 반영한다. 그러나, 동일한 파일을 독자적으로 수정하고 pull을 하면 pull이 되지 않는 모습을 확인할 수 있다.

2

심지어 만약 수정한 걸 add를 하고 다시 pull하면 conflict문제가 발생할 것이다.

예) 1. 원격 저장소의 내용

3

  1. 내 저장소의 내용은 (III. 프로젝트 역할 분배)로 다르게 저장해놓고 add한 다음에

    원격 저장소를 pull하면 merge conflict 문제가 발생한다.

4

  1. 그래서 이걸 VSCODE에서는 몇가지 선택지로 잘 병합할 수 있다.(Accept Incoming Change)

5

  1. 이 상태에서 git status를 하면 unmerged path라는 알림이 뜬다.

6

이걸 다시 add -> commit(메시지는 알기쉽게 꼭 merge conflict 적기!) -> push 하고 issue에서 그 상태를 알려주기.

  1. 다른 컴퓨터(대장)에서도 git pull origin master를 해서 merge conflict 오류가 있었다는 로그조차 일치시키는것이 필요하다.

그런데 이게 매우 불편하므로 branching을 하는것이 좋다.

협업상황에서는 github flow를 사용하는게 좋음. (git flow랑 다름, git flow보다 더 간편함.)

항상 진실은 remote - origin - master라고 생각하고 얘는 잘 건드리지 말자.

왜냐하면 master코드는 서버에서 계속 돌아가고 있기 때문이다.

작업을 낮은 branch에서 작업하다가 잘 되었다 싶으면 master branch를 건드려줌.

branching

원본 코드를 훼손하지 않은 상태에서 작업을 하기 위해서 branch가 필요하다.

상황) branch_test 폴더에 a.py와 b.py를 작성했으나 a.py에만 커밋이 되어있음.

즉, a.py는 master 가지에 있는 파일인것인데 b.py는 다른 branch에서 작성하고싶다.

  1. git branch

    => 지금 현재 존재하고 있는 세계들 (master)

  2. git branch [만들고자 하는 branch 이름]

    ex) git branch new_world => new_world branch를 생성함.

    => git branch를 누르면 현재 branch가 master에 있다는 것을 알 수 있음.

  3. git checkout [가고자 하는 branch 이름]

    ex) git checkout new_world

  4. 여기서 다시 add commit하면 git log에서 (HEAD -> new_world)가 확인된다.

7

다시 master branch로 돌아오면 b.py가 존재하지 않는다!

  1. 그러면 서로 다른 branch를 합치는 방법도 존재한다.

    git merge [합치고자 하는 branch 이름]

    (주의!! 인수하는 곳에서 불러와야함 : master에서 merge를 해야한다는 말씀.)

8

즉, 무언가를 작업할때는 새로운 branch를 만들고 거기서 임시로 작업하는 습관을 들이자.

그래도 git에 대해서 제대로 알고 싶다면?! 유다시티 강의링크1강의링크2를 참고하자.

결론

  1. 작업 시작 전
    1. 작업을 하기 위해서 현재 나의 리포지토리와 master branch를 항상 일치시켜라! ex) - 지욱님 이제 작업시작할게요, 지욱님 버전까지 마스터로 받아들일게요 라고 서로에게 명시를 해줘야함
    2. master branch로 이동한 다음에 pull을 통해서 origin master를 확인하라!
    3. 이전에 작업을 마쳤던 branch를 지워준다! ex) git branch -d donchan
  2. 작업 시작
    1. 다시 작업할 branch를 만든다.
    2. 작업 이후에 내 branch에 그대로 올린다. ex) git push origin dongchan (master branch에 커밋을 올리면 안됨!)
    3. 동시에 작업한 것들이 다 끝나면 우선 팀장이 compare & pull request버튼을 깃허브에서 클릭 ex) base:master <-> compare:dongchan -> this branch has no conflicts with the base branch 와 같은 메시지가 뜸.
    4. 팀원들도 pull request를 보내주고, 팀장이 Merge pull request를 클릭해서 여러 브랜치의 결과를 합쳐준다!

리눅스 키워드 복습

  1. 루트 디렉토리와 홈 디렉토리의 차이

    ​ 홈 디렉토리가 권한설정이 자유롭기 때문에 보통 여기를 기준으로 작업하자.

  2. 현재경로 : pwd

  3. 프린트 : echo

  4. 환경변수 저장

NAME="Dong Chan"
echo $NAME # 변수는 $ 표시를 붙여야 프린트할 수 있다.
  1. echo를 통해서 프린트한 것을 파일에 넣을 수도 있다.
# terminal 
echo 'hello' > a.txt
echo 'world' > a.txt
# a.txt
world

그러나 새로 써지기 때문에 추가하려면 »를 사용해야한다.

  1. ls -al : 숨김파일까지 볼 수 있다.
start666:~/workspace $ cd ..
start666:~ $ ls -al
total 92
drwxr-xr-x 17 ubuntu ubuntu 4096 Jan  7 05:38 ./
drwxr-xr-x 15 root   root   4096 Jan  7 05:38 ../
-rw-r--r--  1 ubuntu ubuntu  314 Aug 31  2017 .bash_aliases
-rw-r--r--  1 ubuntu ubuntu  220 Apr  9  2014 .bash_logout
-rw-r--r--  1 ubuntu ubuntu 1651 Aug 31  2017 .bashrc
drwxr-xr-x  4 ubuntu ubuntu 4096 Jan  7 05:38 .c9/
drwxr-xr-x  3 ubuntu ubuntu 4096 Aug 31  2017 .cache/
drwxr-xr-x  3 ubuntu ubuntu 4096 Aug 31  2017 .config/
drwxrwxr-x  3 ubuntu ubuntu 4096 Aug 31  2017 .gem/
-rw-r--r--  1 ubuntu ubuntu   52 Aug 31  2017 .gemrc
-rw-r--r--  1 ubuntu ubuntu  223 Jan  7 05:38 .gitconfig
-rw-r--r--  1 ubuntu ubuntu  494 Aug 31  2017 .gitignore
drwx------  2 ubuntu ubuntu 4096 Aug 31  2017 .gnupg/
-rw-r--r--  1 ubuntu ubuntu  494 Aug 31  2017 .hgignore
-rw-r--r--  1 ubuntu ubuntu   62 Jan  7 05:38 .hgrc
drwxr-xr-x  3 ubuntu ubuntu 4096 Aug 31  2017 .local/
-rw-------  1 ubuntu ubuntu   15 Aug 31  2017 .npmrc
drwxr-xr-x  7 ubuntu ubuntu 4096 Aug 31  2017 .nvm/
-rw-r--r--  1 ubuntu ubuntu 1258 Jan  7 05:38 .profile
-rw-r--r--  1 ubuntu ubuntu  860 Aug 31  2017 .profileE
drwxr-xr-x  2 ubuntu ubuntu 4096 Jan  7 05:38 .ssh/
drwxr-xr-x  3 ubuntu ubuntu 4096 Aug 31  2017 lib/
drwxrwxr-x  3 ubuntu ubuntu 4096 Jan  7 06:13 workspace/

bash : bornagain shell - 굉장히 기본적인 shell (윈도우에서도 지원)

왼쪽에 있는 이상한 문자들은 파일 권한에 해당하는 것이다.

  1. 환경변수 편집
c9 .bashrc/

-> shell script : 일종의 스크립트 언어로 작성된 파일이 나타남. 여기서 환경변수입력

alias gs="git status"
alias gcm="git commit -m"
alias gp="git push"
alias gl="git log"
alias p3="python3"

-> source ./bashrc

  1. 환경변수 편집
c9 .bashrc/

-> shell script : 일종의 스크립트 언어로 작성된 파일이 나타남. 여기서 환경변수입력

alias gs="git status"
alias gcm="git commit -m"
alias gp="git push"
alias gl="git log"
alias p3="python3"

-> source ./bashrc

그외 명령어들

  • man : help문서를 볼 수 있다.
  • rm : 파일제거 -> 매우 강력한 방법이니 cat로 확인해보고 지우자.
    • 디렉토리는 제거할 수 없다.
    • 디렉토리를 제거하기 위해서 rm -r을 사용함 (재귀적으로 remove를 쓰는것.)
    • rm -rf에서 f는 force를 의미하며 그냥 귀찮으니 강제로 해줘 같은 뜻이다.
  • touch : 파일생성
  • mkdir : 디렉토리 생성
  • tree : 디렉토리를 트리형식으로 보여줌.
start666:~/workspace (master) $ mkdir templates
start666:~/workspace (master) $ ls templates/
start666:~/workspace (master) $ cd templates/
start666:~/workspace/templates (master) $ touch index.html
start666:~/workspace/templates (master) $ touch show.html
start666:~/workspace/templates (master) $ tree
.
├── index.html
└── show.html
mv (이동할 폴더) (이동할 위치) : 파일을 이동함.

mv (지금 파일 이름) (바꿀 파일 이름) : 파일이름을 바꿈

cp (카피할 대상) (카피할 곳) : 파일을 카피한다.

cp -r (폴더) (카피할 곳) : 폴더를 복사한다.

*(asterisk) : 이걸로 해당하는 모든 파일을 옮길 수 있다.

(ex : *.html -> html로 끝나는 모든 파일이 가져와짐.)


플라스크 복습

C9서버의 역할 : 유저가 요청을 보내면 유저에게 응답을 반환해주는것

  • port : 파일이나 정보를 주고받는 통로
  • ​ ex) 443포트 : https (안전한 포트)
  • ​ 80포트 : 일반적인 http 전송
  • 우리가 만든 Flask 서버가 C9서버 안에 있는데 걔는 응답을 8080포트로 무언가를 보내면 80번 포트(외부)로 연결해준다 -> 어플리케이션을 외부와 연결하는 역할을 한다.

나머지는 배웠던 내용이라 따로 적지는 않겠습니다


나중에 생각할 것들

윈도우 실행 -> check 입력 : check라는 환경변수를 확인함-> windows batch(스크립트파일)들을 넣음 + 파이썬 코드 -> 메커나이즈 : 자동로그인, 출석체크

FLASK : 마이크로 프레임워크, 쟝고에 비해서 훨씬 많은 코드가 필요할 수 있음.


평소에 만들고자했었던 서비스, 불편한점을 시정할 수 있는 MVP(minimul viable product)

예전에는 waterfall model(document에 기능들 전부 짜놓고 제작)을 통해서 오랫동안 소프트웨어를 개발했는데, 요즘은 에자일방법론같은 방식을 통해서 서비스를 구현함 : 일단 구현하고 피드백을 받아보면서 점진적으로 프로젝트 발전시킴.

비즈니스 이론 - 고객들은 자기가 뭘 원하는지 모른다 : 만들어놓고 이게 잘 되는지 평가받는게 중요함.


Vue.js , React.js, Angular.js(큰 회사에서 선호)

React : 자유도가 커서 원하는걸 만들 수 있음, 100명이 같은 기능을 짜면 100명이 다 다름. (플라스크에 가까움)

Angular : 프레임워크가 만들어놓은 convention만 잘 지키면 그럴듯하게 만들 수 있음.(쟝고에 가까움)

Vue.js는 자바스크립트만 알면 어느정도 할 수 있다고 함.

comments powered by Disqus