소스 반영하는 법

 

1. remote add origin

원격저장소와 연결시킨다.

$ git remote add origin <원격저장소 주소>

로컬에서 원격 저장소의 이름과 경로를 등록한다.

모든 컴퓨터 자원들은 주소를 가지고 있기 때문에 목적지를 정확한 타겟팅을 해주어야 한다. 원격 저장소 주소 역시 마찬가지이다. origin은 저장소의 이름을 뜻한다. 실제로 원격 저장소를 활용할 때는 원격 저장소의 주소를 직접 입력하는 것이 아니라 

origin이라는 이름을 활용한다. 즉, 원격 저장소 이름과 주소가 매칭 되어있는 것이다. 깃허브(Github)에서 저장소를 만들고 등록하는 명령어가 바로 git remote add origin이다.

 

 

2. push

원격 저장소로 프로젝트를 push하면 깃허브에서 코드와 코드를 변경 했던 이력을 확인 할 수 있다.

$ git push -u origin <브랜치명>

원격 저장소의 로컬 소스를 실제로 반영한다.

 

최초에 push 작업을 하는 경우

$ git push -u origin main

위 코드의 main은 원격 저장소의 브랜치를 뜻한다. 즉, 같은 저장소 안에서도 다수의 브랜치를 병렬 작업 중인 소스를 관리 할 수 있으며 원격 저장소에도 동일하게 반영된다. push 뒤의 -u 옵션은 --set-upstream이라는 옵션을 축약해서 사용하는 것이다. 내가 위치한, 현재 작업하고 있는 브랜치와 origin 뒤의 원격 저장소에 있는 브랜치를 맵핑 해주는 역할을 한다.

 

나중에 push를 또다시 사용해야 할 때(수정하거나 변경되었거나 등) 전에 -u 옵션을 쓴 경우

$ git push

git push 명령어만으로도 원격 저장소에, 작업했던 브랜치에 push 작업을 수행 할 수 있다.

 

push 명령어가 바로 수행 안되는 이유

깃허브 원격 저장소의 경우에는 인증 받은 사용자, 인증 받은 Host(컴퓨터)만 push를 허용한다. 이전에는 다소 복잡한 방법으로 계정정보를 인증 했지만 현재는 git credential manager를 통해서 손쉽게 브라우저에 연동하여 로그인 정보를 가져올 수 있게 되었다. Windows는 깃을 설치하면 기본적으로 같이 설치 할 수 있는 옵션이 있는데 Mac은 수동으로 설치하여 따로 세팅해야한다.

 

 

협업하는 법

 

1. clone

원격 저장소에서 Local 환경(내 컴퓨터)에 가져와야한다.

$ git clone <원격저장소 주소>

 

깃허브 원격 저장소에 업로드 된 프로젝트를 가져오려면 저장소의 페이지에 들어가서 HTTPS에 나와있는 주소를 가져온다.

*깃으로 저장소가 되어있는 주소는 .git으로 끝나는 것이 특징이다. .git으로 끝나지 않으면 클론으로 불러올 수 없기 때문에 확인해보는 것이 좋다.

ZIP 파일을 다운 받아 쓰지 않는 이유는 Git Clone을 통해 프로젝트를 받으면 commit 이력이나 설정 정보들이 담긴 .git이라는 숨김폴더가 함께 포함되어 받아지지만 Download ZIP 파일로 프로젝트 파일을 받으면 .git 파일이 포함되지 않는다. 소스를 수정하는 것을 반영하기 위해 클론을 하는 것인데 단순히 파일만 받으면 수정을 반영 할 수 없기 때문에 협업에 적절하지 않다.

 

$ git clone https://github.com/[계정명]/[프로젝트명].git

명령어를 실행하면 프로젝트명의 폴더를 만들고 웹페이지에서 확인할 수 있었던 코드를 다운 받는다.

 

 

2. checkout

브랜치를 설정 할 수 있다. main이라는 중심 줄기에서 새로운 가지를 뻗어나가 나만의 작업공간 혹은 특정 기능을 만드는 기능이다.

$ git checkout -b <브랜치명>
$ git checkout <브랜치명>

 

최초에 브랜치를 할당 받으면 main에서 시작하는데 새로운 기능을 만들거나 수정 할 때는 main이 아닌 복사본을 만들어서 작업 후, test를 끝마치고 main에 합쳐주는 것이 일반적인 협업 과정이다.

$ git checkout -b feature-1

-b 옵션은 브랜치명을 입력했을 때, 신규로 만들면서 바로 그 브랜치로 이동 할 수 있다.

 

feature-1에서 작업하고 commit 후, 변경사항을 main으로 반영한다.

$ git commit -m "<message>"

feature-1에서 새로운 버전을 찍은 후

 

main과 합치기 위해 main으로 이동한다.

$ git checkout main

 

 

3. merge

main과 합치는 merge 작업을 해준다. 

$ git merge <브랜치명>

 

만약 서로 다른 브랜치의 같은 곳에 위치한 코드가 다르다면 병합이 실패하게 된다. 동일한 곳에서 소스가 달라서 conflict가 발생했기 때문이다.

남길 코드를 선택하고 HEAD와 feature-1 부분을 포함하여 모두 지운 뒤, 다시 commit하면 된다.

 

'Back-End' 카테고리의 다른 글

Git의 구조와 로컬 Git 저장소 생성하는 방법  (0) 2023.05.02
Git & Github란?  (0) 2023.05.02

Self Study

5-1 Code05-08.py를 다음 조건처럼 좀 더 세분화해 보자.

95점 이상 : A+, 90점 이상 : A0, 85점 이상 : B+, 80점 이상 : B0,

75점 이상 : C+, 70점 이상 : C0, 65점 이상 : D+, 60점 이상 : D0, 60점 미만 : F

 

더보기

답 :

score = int(input("점수를 입력하세요 : ")) if score >= 95 : print("A+") elif score >= 90 : print("A") elif score >= 85 : print("B+") elif score >= 80 : print("B") elif score >= 70 : print("C+") elif score >= 75 : print("C") elif score >= 65 : print("D+") elif score >= 60 : print("D") else : print("F") print("학점입니다. ^^")

 

 

5-2 [프로그램 2]의 두 번째 기능처럼 두 숫자를 입력받고 두 숫자 사이의 합계를 구하는 프로그램을 만들어 보자. 단 1씩 증가하지 않고 증가하는 숫자도 입력받는다. 예를 들어 1, 100, 3을 입력하면 1+4+...+100의 합계를 구한다.

힌트1 range(시작값, 끝값+1, 증가값) 형식으로 사용한다.

 

더보기

답 :

## 변수 선언 부분 ##
select, answer, num1, num2, num3 = 0, 0, 0, 0, 0

## 메인 코드 부분 ##
num1 = int(input("*** 첫 번째 숫자를 입력하세요 : "))
num2 = int(input("*** 두 번째 숫자를 입력하세요 : "))
num3 = int(input("*** 더할 숫자를 입력하세요 : "))
for i in range(num1, num2 + 1, num3) :
    answer = answer + i
print("%d+%d+...+%d는 %d입니다." % (num1, num1+num3, num2, answer))

 

5-3 숫자를 하나 입력받고, 그 숫자가 소수인지를 체크하는 프로그램을 만들어 보자.

힌트 소수란 2부터 자기자신-1까지의 숫자로 나눠서 나누어 떨어지는 숫자가 하나도 없는 수를 말한다. 예를 들어 7의 경우 2, 3, 4, 5, 6으로 각각 나누어서 나누어 떨어지는 수가 하나도 없으므로 소수다.

 

더보기

답 :

## 변수 선언 부분 ##
num1 = 0

## 메인 코드 부분 ##
num1 = int(input("*** 숫자를 입력하세요 : "))
for i in range(2, num1) :
    if num1 % i == 0 :
        print("%d는 소수가 아닙니다." %num1)
        break
else :
    print("%d는 소수 입니다." %num1)

 

연습문제

1. 다음은 num이 100인 경우에 실행하는 if 문입니다. 문법이 옳은 코드를 고르세요.

① if num = 100 :

② if num is 100 :

③ if num equal 100 :

④ if num == 100 :

⑤ if num != 100 :

 

더보기

답 : 4, 5

해설 : if 문에는 관계 연산자가 들어가야한다.

 

2. 다음 코드가 출력하는 것을 고르세요.

num = 0
if num > 0 :
	print("케이스1", end = ' ')
else :
	print("케이스2", end = ' ')
print("케이스3", end = ' ')

① 케이스1

② 케이스2

③ 케이스3

④ 케이스1 케이스2

⑤ 케이스2 케이스3

⑥ 케이스1 케이스3

 

더보기

답 : 5

 

3. 다음은 입력한 수가 5의 배수인지 체크하는 코드입니다. 빈칸을 채우세요.

num = int(input("정수를 입력하세요 : "))

if [          ] :
	print("5의 배수가 아닙니다.")
else :
	print("5의 배수입니다.")

 

더보기

답 : num % 5 != 0

 

4. 다음은 장학생, 합격, 불합격으로 구분하는 중첩 if 문입니다. 이를 if ~elif 문으로 변경하세요.

score = int(input("점수를 입력하세요 : "))

if score >= 90 :
	print("장학생", end = ' ')
else :
	if score >= 60 :
    	print("합격", end = ' ')
    else :
    	print("불합격", end = ' ')
        
print("입니다. ^^")

 

더보기

답 :

score = int(input("점수를 입력하세요 : "))

if score >= 90 :
	print("장학생", end = ' ')
elif score >= 60 :
	print("합격", end = ' ')
else : 
	print("불합격", end = ' ')
        
print("입니다. ^^")

 

5. 다음 코드의 2~5행을 삼항 연산자로 변경한 것으로 옳은 것을 고르세요.

num = 5
if num % 2 == 0 :
	res = '짝수'
else :
	res = '홀수'
print(res)

① res = '홀수' if num % 2 == 0 else '짝수'

② res = if num % 2 == 0 '짝수' else '홀수'

③ res = '짝수' if num % 2 == 0 else '홀수'

④ res = if num % 2 == 0 '홀수' else '짝수'

 

더보기

답 : 3

 

6. 랜덤하게 1~20까지의 숫자를 20개 채운 후에, 뽑힌 숫자 목록을 추출하는 코드를 작성하세요.

실행 결과
생성된 리스트 [1, 17, 8, 13, 8, 19, 13, 1 11, 17, 11, 11, 4, 4, 4, 17, 17, 1, 4, 9]
숫자 1은(는) 뽑혔습니다.
숫자 4은(는) 뽑혔습니다.
숫자 8은(는) 뽑혔습니다.
숫자 9은(는) 뽑혔습니다.
숫자 11은(는) 뽑혔습니다.
숫자 13은(는) 뽑혔습니다.
숫자 17은(는) 뽑혔습니다.
숫자 19은(는) 뽑혔습니다.

 

더보기

답 :

import random

numbers = []
for num in range(0,21) :
    numbers.append(random.randrange(0,21))

print("생성된 리스트", numbers)

for num in numbers :
    print("숫자 %d는(은) 뽑혔습니다." %num)

 

7. 다음은 두 사람이 주사위를 던져서 높은 숫자가 나오면 이기는 게임입니다. 출력 결과는 A가 이기거나, B가 이기거나, 비기는 결과가 나와야 합니다. 코드를 작성하세요.

 

더보기

답 :

아래의 첫 번째 코드는 파이썬 내장함수인 sum을 이용한 코드입니다. 내장함수를 사용하지 않은 코드(두 번째)도 첨부하였습니다.

import random

## 전역 변수 선언 부분 ##
diceA, diceB = [], []

## 메인 코드 부분 ##

for A in range(2):
    diceA.append(random.randrange(1, 7))
    
print("A의 주사위 숫자는 %s입니다." % diceA)

for B in range(2):
    diceB.append(random.randrange(1, 7))
    
print("B의 주사위 숫자는 %s입니다." % diceB)

if sum(diceA) > sum(diceB):
    print("A가 이겼네요.")
elif sum(diceA) < sum(diceB):
    print("B가 이겼네요.")
else:
    print("둘이 비겼네요.")

 

import random

## 전역 변수 선언 부분 ##
diceA1, diceA2, diceB1, diceB2 = 0, 0, 0, 0

## 메인 코드 부분 ##

diceA1 = random.randrange(1, 7)
diceA2 = random.randrange(1, 7)
print("A의 주사위 숫자는 %d %d입니다." % (diceA1, diceA2))
diceB1 = random.randrange(1, 7)
diceB2 = random.randrange(1, 7)
print("B의 주사위 숫자는 %d %d입니다." % (diceB1, diceB2))

if diceA1 + diceA2 > diceB1 + diceB2 :
    print("A가 이겼네요.")
elif diceA1 + diceA2 < diceB1 + diceB2 :
    print("B가 이겼네요.")
else:
    print("둘이 비겼네요.")

 

8. [응용예제 02]를 변경해서 거북이 3마리를 생성한 후 화면을 돌아다닐 때, 서로 만나면 크기가 랜덤하게 변경된 후, 계속 움직이는 프로그램을 작성합니다. 즉, 무한루프로 반복됩니다. 만약, 화면 밖으로 나가면 중앙(0, 0) 위치로 다시 데려옵니다.

힌트1 거북이의 크기는 1~9 값을 랜덤하게 추출한다.

힌트2 거북이의 속도를 올리려면 turtle.speed(10)을 사용하면 된다.

 

더보기

답 :

import turtle
import math
import random

## 전역 변수 선언 ##
t1, t2, t3 = [None] * 3
t1X, t1Y, t2X, t2Y, t3X, t3Y = [0] * 6
swidth, sheight, exitcount = 300, 300, 0 

## 메인 코드 부분 ##
if __name__ == "__main__" :
    turtle.title('거북이 만나기')
    turtle.setup(width = swidth + 50, height = sheight + 50)
    turtle.screensize(swidth, sheight)

    t1 = turtle.Turtle('turtle'); t1.color('red'); t1.penup()
    t2 = turtle.Turtle('turtle'); t2.color('green'); t2.penup()
    t3 = turtle.Turtle('turtle'); t3.color('blue'); t3.penup()

    t1.goto(-100, -100); t2.goto(0, 0); t3.goto(100, 100)
    t1.speed(10); t2.speed(10); t3.speed(10);
    
    while True :
        angle = random.randrange(0, 360)
        dist = random.randrange(1, 50)
        t1.left(angle); t1.forward(dist)
        angle = random.randrange(0, 360)
        dist = random.randrange(1, 50)
        t2.left(angle); t2.forward(dist)
        angle = random.randrange(0, 360)
        dist = random.randrange(1, 50)
        t3.left(angle); t3.forward(dist)

        t1X = t1.xcor(); t1Y = t1.ycor()
        t2X = t2.xcor(); t2Y = t2.ycor()
        t3X = t3.xcor(); t3Y = t3.ycor()

        if (-swidth / 2 <= t1X and t1X <= swidth / 2) and (-sheight / 2 <= t1Y and t1Y <= sheight / 2) and \
            (-swidth / 2 <= t2X and t2X <= swidth / 2) and (-sheight / 2 <= t2Y and t2Y <= sheight / 2) and \
            (-swidth / 2 <= t3X and t3X <= swidth / 2) and (-sheight / 2 <= t3Y and t3Y <= sheight / 2) :
            pass
        
        else :
            t1.penup(); t1.goto(0, 0)
            t2.penup(); t2.goto(0, 0)
            t3.penup(); t3.goto(0, 0)

        if math.sqrt(((t1X - t2X) * (t1X - t2X)) + ((t1Y - t2Y) * (t1Y -t2Y))) <= 20 or \
           math.sqrt(((t1X - t3X) * (t1X - t3X)) + ((t1Y - t3Y) * (t1Y -t3Y))) <= 20 or \
           math.sqrt(((t2X - t3X) * (t2X - t3X)) + ((t2Y - t3Y) * (t2Y -t3Y))) <= 20 :
            t1.turtlesize(random.randrange(1, 10)); t2.turtlesize(random.randrange(1, 10)); t3.turtlesize(random.randrange(1, 10))

    turtle.done()

 

 

*주의사항 : 제가 직접 푼 것이므로 틀린 부분이 있을 수 있습니다. 오타나 틀린 부분 지적 환영!

 

Local

우리가 사용하고 있는 각각의 컴퓨터. 즉, 자기 자신을 가리킨다.

 

Working Directory(폴더)

현재 작업 중인 프로젝트가 위치한 디렉토리

 

Staging

commit 할 파일의 예비 저장소

commit이란 소스가 변경되거나 새로 작성되면 local 저장소에 저장하는 액션을 말한다. 한 건의 commit으로 발생된 변경사항을 버전이라고 한다.

 

Local Repository

각 컴퓨터의 git이 관리하는 로컬 저장소

Working Directory로부터 commit한 내용들이 버전으로 저장되는 곳이다. commit이 된 순간의 파일과 내용들을 가지고 있기 때문에 언제든지 commit 했던 지점으로 돌아갈 수 있다.(복원 가능)

 

remote

 

Remote Repository - Github

github 등 외부에 위치한 원격 저장소

여러 명이 함께 소스를 수정하고 개발하기 위해 외부 저장소로 보낸다.

 

 

 

로컬 Git 저장소 생성

1. git 영역으로 초기화 수행

$ git init

깃(Git)에서 폴더 안에 있는 파일들에 대해 이력을 관리하기 위해서 init 명령을 통해 초기화 해야한다. 초기화가 되면 .git이라는 숨김 폴더가 생성되고 해당 폴더에 대한 모든 데이터가 저장된다.

*현재 깃을 초기화 하려는 경로가 내 프로젝트가 위치한 곳이 맞는지 확인. 위치가 올바르지 않은 경우, 불필요하거나 보안상 민감한 파일들이 깃의 관리영역에 포함 될 수 있다.

 

 

2. .gitignore 파일 추가

신분증이나 신용카드 번호 등 민감한 개인정보를 구글 드라이브나 Dropbox에 저장하는 것은 매우 위험한 행위이다. 시스템적으로 보안조치가 강하게 걸려있다고 하더라도 근본적으로 민감 정보는 외부 저장소에 저장하지 않는 것이 좋다.

소스 또한 마찬가지이다. 데이터베이스 계정이나 클라우드 시크릿 키, 각종 민감 정보는 저장소에 반영되어서는 안된다.

깃으로 초기화 된 폴더에 .gitegnore라는 파일을 만들고 깃에서 무시해야할 파일의 이름을 작성하면 폴더 내 해당 파일은 더이상 깃에 의해 탐지되지 않는다.

깃에서 일반적으로 무시하는 파일은 보안상 민감 정보, 각종 설정 파일, compile 언어들의 빌드 산출물, 개발용 데이터베이스 등 이다.

 

 

3. 파일 확인

$ git status

현재 어떤 파일들이 추적되고 있는지, 특히 Staging area에 어떤 파일들이 들어있는지 확인하는 명령어이다.

 

 

4. Staging Area 생성

나의 프로젝트 중 버전관리에 반영할 파일 지정한다. 버전관리에 반영된 파일의 영역이 Staging Area가 된다.

$ git add .
$ git add "<파일명>"

$ git add. 현재 위치에 있는 모든 파일들을 add 한다. *commit 되면 안되는 파일이 있는지 반드시 확인

$ git add "<파일명>" 특정 파일만 add 한다.

 

원치 않는 파일을 add 했을 경우

$ git rm/reset

 

 

5. commit 작업

Staging area에 있는 것들을 로컬 저장소에 변동 기록(버전)으로 관리 할 수 있도록 남기기 위해 commit을 실행한다.

$ git commit -m "<message>"

메세지를 입력하지 않으면 에러가 발생한다. 이 프로젝트, 혹은 수정 사항에 대해 문제가 생겼을 때 빠르게 대응 할 수 있도록 commit에 대한 정보를 기록한다.

 

 

6. branch(필수x)

$ git branch -M main

최신 버전의 깃에서는 기본 branch 이름이 main으로 정해져 있다.

branch란 동일한 저장소 내에 소스에 대해 서로 영향을 받지 않는 독립적인 공간이다. 여러 개발자들이 동시에 소스가 덮어씌워질 염려 없이 다양한 작업을 할 수 있도록 한다.

보통 크게 3가지 (혹은 이상)의 branch로 프로젝트가 관리된다.

 

  • main / master

즉시 운영 배포할 수 있는 버전. 사용자가 지금 이용 중인 코드이다.

모든 작업상이 합쳐지는 곳이기 때문에 토이프로젝트 등 가벼운 코드가 아니라면 main에서 작업하는 것은 위험 할 수 있다. 깃에서 최초로 init 명령어로 초기화 했을 때 생성되는 기본 branch 명이다.

인종차별/주종관계를 드러내는 용어를 수정하는 문화가 프로그래밍 전반에 확산되면서 master가 아닌 main을 사용하게 되었다.

main -> master
master slave -> primary
blacklist whitelist -> blocklist allowlist

 

  • stagging

상용에 반영하기 전 테스트 버전

 

  • feature

새로운 기능 추가 개발. 서로 꼬이지 않도록 병렬 작업 한다.

 

 

 

'Back-End' 카테고리의 다른 글

Github 소스 반영 및 협업  (0) 2023.05.03
Git & Github란?  (0) 2023.05.02
Git & Github의 등장

개발을 진행하다 보면 HTML, CSS, Python, Java 등 수많은 파일들을 맞닥뜨리게 된다.

파일을 수정하거나 다수의 공동 작업을 하면 파일이 복잡해지고 누가 작업한지 알 수 없게 된다. 웹 서비스는 다양한 파일이 유기적으로 결합된 서비스이다. 우리가 사용하는 파일 시스템으로는 안정적이고 일관성 있는 관리가 쉽지 않다.

 

 

SCM(Source Code Management)

저장소와 저장된 소스의 변경 사항과 작업자를 추적 가능

현재 소스 코드 관리(SCM)가 활용되는 대표적인 도구는 깃 & 깃허브(Git & GitHub)이다.

 

 

Git

소스 이력 추적을 위한 버전 관리 시스템

수정된 내용을 반영하면 버전별로 누가 반영했는지 관리해주는 SCM의 구현체이다.

 

Github

git 프로젝트를 관리하는 저장소 제공

현재 수많은 서비스들이 Github 저장소에 업로드 되어있으며, 오픈소스 프로젝트를 자유롭게 수정해서 재배포 할 수 있다.

 

 

'Back-End' 카테고리의 다른 글

Github 소스 반영 및 협업  (0) 2023.05.03
Git의 구조와 로컬 Git 저장소 생성하는 방법  (0) 2023.05.02

+ Recent posts