원격 저장소와 지역 저장소의 동기화 방법

|

원격 저장소와 지역 저장소의 동기화 방법

  • 하나의 원격 저장소를 중심으로 해서 두 개의 지역 저장소가 하나의 원격 저장소를 중심으로 작업을 동기화 하는 방법
  • 협업이 가능하게 하며, 작업환경이 바뀔 때에 대한 대비가 가능

  • 작업 영역에 git clone https://github.com/ID/gitfth.git git_home로 깃헙 내용 클론
  • 동일 프로젝트를 git clone https://github.com/ID/gitfth.git git_office로 내용 클론
  • 현재 home과 office가 똑같은 상태로 존재
  • home에서 vim f1.txt로 내용 추가(아무거나…)
  • git commit -am 3
    • git commit --amend로 커밋 메세지 변경 가능
    • push 하기 전에만 가능
  • git push로 변경내용을 깃헙에 푸시
  • office폴더로 가서, git pull로 원격 저장소의 내용을 동기화
  • vim f1.txt의 내용에 아무거나 추가
  • git commit -am 4로 커밋 후 git push
  • home 디렉터리로 와서, git pull로 작업 동기화

  • 이런 식으로 작업하게 되면 백업이 가능해짐
  • git pullgit push의 습관화가 중요함!

Github 원격 저장소 만들기

|

Github 원격 저장소 만들기

  • 우선 github에 회원가입 후 로그인, 다음으로 new repository로 github 저장소를 만듦
    • 만들 때 오픈 소스 목적이라면 public, 그렇지 않다면 private며 모두 무료
    • 다음으로 create repository를 누름
    • 주소는 https로 시작하게 하며, 그 옆에 나타나는게 해당 저장소의 주소가 됨
  • 저장소를 만들때는 원격저장소를 만들고
      1. 원격 저장소를 만들고 그걸 복제해서 로컬 저장소를 만든 후 로컬 저장소에서 작업
    • 2. 로컬 저장소에서 작업 해온 내용을 원격 저장소로 작업 내용을 업로드
  • 수업에선 이미 로컬저장소에서 작업한 내용을 원격저장소로 업로드 하는 것에 대해 다룸
  • mkdir gitfth로 폴더를 만들고, 해당 폴더로 이동하여 git init .로 초기화
  • 초기화 다음에 vim f1.txt로 파일 작성 후 내용을 a로 하여 저장
  • 만들어진 파일을 git add f1.txt, git commit -m 1로 첫 번째 커밋을 수행
  • git remote add origin https://github.com/ID/gitfth.git 수행
    • 현재 로컬 저장소에 origin으로 명칭될 https~ 주소를 갖는 원격 저장소에 연결시킴
  • git remote를 치면 origin이라는 원격 저장소가 생성되었으며, git remote -v로 상세 주소를 확인 할 수 있음
  • git은 여러개의 원격 저장소를 로컬 저장소로 저장 할 수 있음
  • git remote add friend https://github.com/ID/gitfth.git를 하고 git remote -v를 하면 friend 원격 저장소가 생긴 것도 확인 가능
    • 관습적으로 origin은 로컬 저장소와 연결되어있는, 주로 동기화 되는 원격 저장소로 지칭함 (branch의 master와 같은 맥락)
  • git remote remove friend로 필요 없는 저장소 지움
  • git push -u origin master
    • 로컬 저장소에서 원격 저장소로 작업내용을 보내는 것을 push라고 함
    • 로컬 저장소 작업내용을 origin 원격저장소의 master 브랜치로 보낸다는 의미
    • -u는 한 번만 쓰면 다음부터는 git push로 쉽게 업로드 할 수 있게 해주는 역할
    • 처음에 치면 user name(깃허브 홈페이지 아이디)와 비밀번호를 입력하게 됨
  • 깃헙 홈페이지에 가 보면 작업 내용이 원격저장소로 업로드 된 것을 볼 수 있음
  • vim f1.txt에 b 내용을 추가한 후 git commit -am 2로 커밋
  • git push로 작업내용을 업로드
  • 깃헙 홈페이지에 변경된 내용이 반영된 것을 확인 가능
  • mkdir ../gitfth2(새로운 작업환경)
  • 해당 폴더에서 git clone git remote add friend https://github.com/ID/gitfth.git 하여 원격저장소의 내용을 지역저장소로 불러옴
  • 이 상태에서 git remote -v해 보면 원격저장소와 지역저장소가 연결 되어 있는 것을 확인 할 수 있음

원격 저장소를 지역 저장소로 복제

|

원격 저장소를 지역 저장소로 복제

  • Github.com 에 대해 알아보고, 이를 이용해 이미 존재하고 있는 오픈소스의 원격 저장소 내용을 내 컴퓨터의 지역 저장소로 가져오는 방법에 대해 알아본다.
  • 이 과정에서 git의 소스코드와 이 소스코드의 첫번째 커밋의 내용도 알아본다.

  • 깃허브(github.com)에서는 소스코드 뿐만이 아니라 오픈소스의 소스코드 및 프로젝트 내용들을 살펴 볼 수 있음
    • 즉, 코드관리라는 하나의 서비스만으로 국한되는것이 아니라 전체 개발에 대한 영향력이 매우 큰 커뮤니티로 볼 수 있음
  • github 홈페이지에서 git 검색 하면 git/git으로 검색되는 페이지에 접속(https://github.com/git/git)
    • github에 올라가 있는 git의 원격 저장소의 내용을 확인 할 수 있음
    • 처음 보이는 화면은 프로젝트 소스코드를 온라인으로 볼 수 있는 창임
    • commits라는 의미는 해당 카운트만큼의 커밋으로 현재 버전까지 왔다는 것을 의미
    • branches 는 현재 그 숫자 갯수만큼의 브랜치로 프로젝트가 관리되고 있다는 의미
    • contributors는 프로젝트에 접근해서 소스코드를 수정 할 수 있는 권한을 가진 사람들
    • watch 및 star는 몇명이 현재 해당 프로젝트를 주의깊게 지켜보고 좋아하고 있는지를 의미
    • fork를 통해 해당 프로젝트를 자신만의 프로젝트로 새로 만들고 내용을 수정 할 수 있게 됨
      • fork의 숫자는 해당 프로젝트가 복제 당한 카운팅 수
      • 원래 original 소스코드를 수정하는것이 아닌, 그대로복사하여 자신의 새로운 버전을 갖을 수 있게 되는것
      • fork를 이용하기 위해선 로그인이 필요
      • 로그인 후 fork하면 주소가 git/git에서 자신의 id/git으로 바뀜
  • 프로젝트를 다운로드받기 위해 해당 프로젝트 홈페이지에서 Clone or Download의 주소를 복사
  • 다음으로 적당한 디렉터리로 이동(ex. ~/git)
  • git clone https://github.com/git/git.git gitsrc를 입력하면 지역저장소로 복사 됨(gitsrc 폴더로 복사 됨)
  • ls -al로 확인해보면 gitsrc폴더가 생성된 것을 확인 가능
    • 그 안에 존재하는 모든 파일들이 github의 소스코드들
  • cd gitsrcgit log로 확인해보면 많은 log들이 존재
  • git log --reverse를 하면 거꾸로 log가 출력되어 첫 번째 커밋을 볼 수 있음
    • e83c5163316f89bfbde7d9ab23ca2e25604af290번 커밋이 첫 번째 커밋
    • 리눅스를 만든 Linus Torvalds가 한 커밋으로, 리눅스 소스코드를 관리하기 위한것이 git이었음
  • git checkout e83c5163316f89bfbde7d9ab23ca2e25604af290 를 치면 해당 커밋id로 브랜치가 설정됨
  • git log를 하면 e83c5163316f89bfbde7d9ab23ca2e25604af290의 로그만 보임

190228 백준 알고리즘 문제풀기

|

[2504] 괄호의 값

문제

  • 4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다.
    • 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다.
    • 만일 X가 올바른 괄호열이면 ‘(X)’이나 ‘[X]’도 모두 올바른 괄호열이 된다.
    • X와 Y 모두 올바른 괄호열이라면 이들을 결합한 XY도 올바른 괄호열이 된다.
  • 예를 들어 ‘(()[[]])’나 ‘(())[][]’ 는 올바른 괄호열이지만 ‘([)]’ 나 ‘(()()[]’ 은 모두 올바른 괄호열이 아니다. 우리는 어떤 올바른 괄호열 X에 대하여 그 괄호열의 값(괄호값)을 아래와 같이 정의하고 값(X)로 표시한다.
    • ‘()’ 인 괄호열의 값은 2이다.
    • ‘[]’ 인 괄호열의 값은 3이다.
    • ‘(X)’ 의 괄호값은 2×값(X) 으로 계산된다.
    • ‘[X]’ 의 괄호값은 3×값(X) 으로 계산된다.
    • 올바른 괄호열 X와 Y가 결합된 XY의 괄호값은 값(XY)= 값(X)+값(Y) 로 계산된다.
  • 예를 들어 ‘(()[[]])([])’ 의 괄호값을 구해보자. ‘()[[]]’ 의 괄호값이 2 + 3×3=11 이므로 ‘(()[[ ]])’의 괄호값은 2×11=22 이다. 그리고 ‘([])’의 값은 2×3=6 이므로 전체 괄호열의 값은 22 + 6 = 28 이다.

  • Stack을 이용하여 문제를 푼다.
    • 괄호가 열릴 때 스택에 넣는다.(push)
      • t(temp)를 1로 선언 후 ‘(‘일때는 2, ‘[‘일때는 3을 곱한다.
      • 괄호가 열린다는 의미는 바로 안에 있는 괄호에 대한 값과 곱해짐을 의미하기 때문이다.
    • 괄호가 닫일 때 스택에서 뺀다.(pop)
      • 바로 전 인덱스의 괄호가 맞는 쌍일 경우 결과를 더해준다.
      • ’(‘일 경우 t/2를, ‘[‘일 경우 t/3을 수행한다.
    • 시간단축을 위해 w(wrong) 변수를 선언하고, 불가능한 경우 중간에 빠져나간다.(break)

정답

class Stack:
    def __init__(self):
        self.len = 0
        self.list = []

    def push(self, num):
        self.list.append(num)
        self.len += 1

    def pop(self):
        if self.size() == 0:
            return -1
        pop_result = self.list[self.len-1]
        del self.list[self.len-1]
        self.len -= 1
        return pop_result

    def size(self):
        return self.len

    def empty(self):
        return 1 if self.len == 0 else 0

    def top(self):
        return self.list[-1] if self.size() != 0 else -1

stack = Stack()
result = 0
t = 1
s = 0
w = False
ps = list(input())
for j in range(len(ps)):
    if ps[j] == '(':
        t *= 2
        stack.push('(')
    elif ps[j] == '[':
        t *= 3
        stack.push('[')
    elif ps[j] == ')':
        if ps[j-1] == '(':
            s += t
        if stack.empty():
            w = True
            break
        if stack.top() == '(':
            stack.pop()
        t /= 2
    else:
        if ps[j-1] == '[':
            s += t
        if stack.empty():
            w = True
            break
        if stack.top() == '[':
            stack.pop()
        t /= 3
if w or stack.empty() == 0:
    print(0)
else:
    print(int(s))

원격저장소/원격저장소의 기초

|

원격저장소(Remote repository)

  • 지역 저장소(local repository)와는 대비되는 개념
  • 자신의 컴퓨터에서 작업 후 커밋하면 저장되는 곳이 지역 저장소를 의미
  • 작업한 내용을 인터넷에 올려 백업하거나, 인터넷 저장소를 매개로 하여 타인과 협엽할 때 사용되는곳을 원격 저장소(Remote repository)라고 함
  • 소스코드를 백업하거나 타인과 협업을 한다는 중요한 의미를 갖고있음
    • 프로젝트가 커질 경우 굉장히 중요해짐
  • 혼자 프로젝트를 진행하는 경우 구지 사용하지 않아도 됨
    • 드랍박스나 구글 드라이브같은 클라우드 서비스를 이용하는것이 편리

원격저장소의 기초

  • 빈 디렉터리를 만들고, git init local(디렉터리 이름)으로 초기화
  • cd local로 해당 폴더로 이동 후, vim f1.txt에 a 내용을 넣은후 저장
  • git add f1.txt, git commit -m 1로 커밋
  • 지역저장소: 작업한 내용을 커밋하는 곳
  • 원격저장소: 지역저장소와 연결되어 동기화되는 저장소
    • 일반적으로 작업공간 외부의 클라우드같은 공간에 생성
    • 백업의 의미도 있음
  • 본 수업에선 한 컴퓨터에서 다른 디렉터리에 원격저장소를 만들고 커밋 및 동기화 예정
    • local 폴더를 원격저장소에 연결시켜 동기화
  • 부모 디렉터리로 돌아가서(local 상위 폴더) git init --bare remote로 remote 디렉터리 생성
    • --bare 옵션은 작업을 할 수 없고 저장소로서의 기능만 수행 할 수 있는 공간을 만드는 옵션
  • cd remote로 이동 후 ls로 파일목록을 확인 해 보면 .git 디렉터리 안에 들어가는 파일들의 목록까지 확인 가능
    • --bare는 즉, working directory가 없는 .git 디렉터리의 내용만 존재하는 저장소
    • 원격저장소는 보통 원격저장소라는 목적만 유지하기 위해 작업이 불가능하도록 --bare 옵션을 넣도록 함
  • cd local로 돌아와서, remote 원격 저장소에 local 지역 저장소를 연결하고 push
    • git remote add 현재 디렉터리 (ex. git remote add origin /home/git/git/remote) 입력
    • origin 경로로 경로를 작성하면 origin이 경로를 가리키는 역할을 하게 됨
    • git remote -v로 잘 연결되었나 확인
    • 저장소를 지우고 싶다면 git remote remove origin을 하면 됨
  • 저장소 master 브랜치에서 git push를 하면 연결시킨 원격저장소인 remote폴더로 동기화 됨(업로드)
    • git push를 치면 여러 메세지가 나옴
      • git push시 나오는 여러 메세지 중, git config --global push.default matching은 깃이 알아서 자동으로 처리하는 부분
      • git config --global push.default simple은 사용자가 명시적으로 어디에서 어디로 push를 하겟다고 지정한 것에 대해서만 push를 하겟다는 보수적인 옵션
      • git이 새 버전에선 matching 말고 simple 방식을 사용한다는 의미
    • git config --global push.default simple로 기본 push 방식을 matching에서 simple로 변경
    • Push 방식을 변경 후 git push를 하면 아까의 메세지는 사라짐
      • 출력되는 git push --set-upstream origin master에서 origin master는 현재 브랜치(master)가 push할 때 origin의 master 브랜치로 push한다는 의미
      • --set-upstream은 앞으로 master 브랜치에서 push하면 자동으로 origin의 master로 push하겟다는 의미
      • 즉, git push --set-upstream origin master은 명시적으로 연결을 세팅해주는 옵션
    • git push --set-upstream origin master를 하면, 잘 연결 된 것을 확인 할 수 있음
  • cd ../remote로 이동한 후 git log를 하면, local의 버전이 remote에 똑같은 내용이 들어가 있는 것을 볼 수 있음
  • 중요사항
    • local pc에 원격저장소를 만들 때는 git init --bare remote--bare옵션을 활용하여 저장목적만으로 작동하도록 설정
    • 원래 작업 디렉터리(working space)로 돌아와서 git remote add 현재 디렉터리로 지역 저장소를 원격 저장소에 연결
      • git remote -v로 잘 연결 되었나 확인
      • git remote remove origin을 하면 연결 해제
    • 작업 디렉터리에서 원하는 브랜치(ex. master)로 설정 후, git config --global push.default simple로 연결방식 정의
    • git push --set-upstream origin master로 명시적으로 연결을 세팅
    • 다음부턴 git push로 동기화

  • 수업 중 ‘My server’라는 수업과 ‘Github’라는 수업이 있음
    • My server: 직접 서버가 있어서 자신의 서버를 이용해서 원격 저장소를 운용하는 방법(어려움)
    • Github: 자신의 서버를 운용하는것이 아니라 github등에서 제공하는 온라인 서버를 이용해서 원격 저장소를 운용하는 방법(쉬움)