모든 컴퓨터 자원들은 주소를 가지고 있기 때문에 목적지를 정확한 타겟팅을 해주어야 한다. 원격 저장소 주소 역시 마찬가지이다. 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하면 된다.
## 변수 선언 부분 ##
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 문입니다. 문법이 옳은 코드를 고르세요.
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) 위치로 다시 데려옵니다.