brunch

You can make anything
by writing

C.S.Lewis

by Moai Oct 24. 2020

Git과 Github

백준 기초 문제를 풀면서 Git을 사용해보자


나는 컴퓨터공학과에 진학하고 프로그래밍을 좋아했지만 프로그래머가 되려고 하지 않았다. 그 당시 프로그래머가 되면 40대에 치킨집을 차려야 한다는 소문이 당연하게 여겨질 될 정도로 프로그래머의 대우가 좋지 않았다. 결국 대학교 4년 내내 관심도 없던 정보보안 전문가가 되기 위해 대학원 진학을 하게 되었다.

하지만 프로그래밍을 좋아했기 때문일까? 대학원 2년 동안 개발만 했다. 협업은 하지 않고 혼자서만 개발했고 누군가에게 배우기보단 스스로 알아보면서 프로그래밍을 했다. 이게 문제의 씨앗이 되었다.


회사 입사 후에도 사내 코딩 테스트 고급 단계?를 바로 통과해 버린 뒤 사내 강사로 활동했고 분석보단 개발 위주로 업무를 했다. 이때는 협업을 하긴 했지만 개발자가 아니었기 때문에 협업 툴을 사용하지 않았다.


당시 삼성에서 계열사 사고 대응 업무를 했는데 해커들이 프로그램으로 미친 듯이 찍어내는 악성코드를 수동으로 리버싱 하면서 분석하며 대응하는 것은 한계가 있다고 생각했다. 점차 포렌식에 대한 흥미를 잃고 내가 좋아하고 잘하는 개발을 하기 위해 보안 개발자가 되겠다고 다짐한 뒤 카카오로 이직을 했다.


대학교 졸업 후 5년 동안 개발을 했지만 개발도구는 사용한 적이 없었고 트렌드를 놓쳐버렸다. 클라우드, 협업 툴은 사용조차 하지 않았고 신입이 아닌 경력직이기 때문에 마음껏 물어볼 수도 없었고 눈치껏 배워야만 했다.


필수 협업 도구 중 오늘은 Git에 대해 글을 작성해보려고 한다.



프로그램을 개발하다 보면 중간중간 사용자를 위해 배포를 해야 하고 문제가 발견되면 버그를 수정해야 한다. 변경할 때마다 버전을 올리면서 관리하게 되는데 기능이 크게 변경할 경우 예상하지 못했던 문제가 발생할 수 있다. 사용자는 계속 내가 만든 프로그램을 사용해야 하므로 급하게 이전 버전으로 되돌린 후 다시 배포해야 한다.


결국 버전마다 코드 관리가 돼야 하고 문제를 빠르게 찾기 위해 어떤 부분이 변경되었는지 쉽게 확인할 수 있어야 한다. 가장 쉬운 방법은 버전이 바뀔 때마다 코드 파일을 압축한 뒤 변경내역을 기록하는 방법이다. 이럴 경우 컴퓨터 용량이 많이 필요하고 어느 부분을 변경했는지 확인하기 쉽지 않다.


Git을 이용하게 되면 버전마다 변경한 부분을 한눈에 확인할 수 있고 과거 버전으로 쉽게 되돌릴 수 있다.



또한 협업을 하게 되면 프로젝트를 만들고 업무를 분담한 뒤 테스트 때마다 작성한 코드를 모으고 합쳐야만 한다. 가장 쉬운 방법은 코드를 USB나 이메일로 받고 개발자를 부른 뒤 "네가 변경한 부분을 프로젝트에 합쳐봐"라고 지시하는 방법이다. 근데 이렇게 하게 되면 코드를 다 합치고 난 뒤 누가 무엇을 변경했는지 확인하기 어렵고 버전별로 구분하기도 쉽지 않다.


Git을 이용하면 클라우드에 코드를 올린 뒤 변경한 부분만 다운로드하여 대해 코드를 추가하거나 합치는 기능을 제공한다.



마지막으로 코드를 구현 중에 급하게 다른 기능을 추가해야 하는 경우가 발생할 수 있다. 그러면 지금 구현 중인 기능을 중단하고 급한 기능부터 추가해야 하는데 그럼 지금까지 하던 작업은 모두 날려야만 하는가?


이럴 때 Git을 이용하면 지금 하던 부분을 저장한 뒤 새로운 기능을 구현하고 기존에 구현한 기능을 다시 불러와 바로 구현할 수 있다.



백준 기초 문제를 풀면서 Git 사용법에 대해 배워보자! 구글에 백준 기초라 검색하면 아래 사이트가 맨 첫 번째로 뜰 것이다

https://www.acmicpc.net/workbook/view/2196


기초적인 사칙연산이나 기초 입출력 문제는 제외하고 그 외 괜찮은 문제들을 함께 풀어보자!

1924, 2839, 4344, 9654번 문제를 함께 풀어보겠다.


우선 Git을 설치하자. 아래 사이트에 접속한 뒤 현재 운영체제 버전에 맞는 Git을 설치하자.

https://git-scm.com/


Next를 계속 누르다가 아래 단계에서만 옵션을 변경 후 설치를 진행하자




설치가 완료되면 Visual Studio Code를 실행한다. 워킹 디렉터리를 설정한 후 터미널을 띄워주자. 단축키는 컨트롤 + `이다.


그리고 git init 명령어를 입력해보자. 숨김 폴더로 인해 보이지는 않지만 현재 프로젝트에 .git라는 폴더가 생성이 된다. 이제 우리는 Git에 의해 형상관리를 할 수 있게 된다. 지금은 비록 혼자 개발하지만 추후 협업을 위해 나의 정보를 Git에 저장해놓자.

git config --global user.name 내 이름

git config --global user.email 메일 주소



이제 백준 1924번 문제를 풀어보기 위해 main.py를 하나 만들고 아래처럼 코드를 작성해보자

1924번 문제는 1월 1일이 월요일일 때 M월 D일은 무슨 요일인지 맞추는 문제이다.


git status 명령어를 치면 main.py가 변경되었다고 알려준다. 변경된 파일들을 체크 한 뒤 버전을 변경한 내역을 Git에 저장해보자.


git add main.py

git commit -m "1924번 코드 작성"


이제 다른 문제를 풀기 위해 지금 작성한 코드를 1924라는 폴더를 만들고 옮기자


변경한 뒤 git status라고 입력하면 변경한 내역을 추적하게 되는데  이번엔 다음과 같이 입력해보자

git add -A


위와 같이 입력한 지금까지 변경한 내역을 모두 저장하겠다는 의미이다. 그리고 git status를 입력하면 다음과 같이 무엇이 변경되었는지 알려준다.


이제 해당 내역을 저장 한 뒤 기록한 내역을 확인해보자

git commit -m "백준 폴더를 문제 번호로 변경"

git log


백준에 제출하기 위해 코드를 살짝 변경하자


f = sys.stdin

#f = open('data.txt', 'r')


git add -A

git commit -m "백준 코드 제출"


이후 제출하고 나니 다시 과거 상태로 되돌리고 싶다. 이때는 reset 명령어를 이용하면 된다.

git log

git reset --hard 커밋 6자리 코드


이후 코드를 확인하면 내가 변경했던 부분이 돌아온 것을 확인할 수 있다.


reset 명령어를 입력하면 이젠에 작업했던 것이 날아간다는 사실을 확인했다. --hard 대신 --soft를 사용하면 commit 한 위치만 변경되고 변경한 코드는 그대로 살아있다.


잠시 다른 문제가 궁금해서 풀고 싶을 때는 어떻게 해야 할까? 지금까지 하던 작업은 저장해놓고 2839번 문제를 풀기 위해 현재 위치에서 새로운 작업환경을 만들어주자


git branch 2839

git checkout 2839

또는

git branch -b 2839


위처럼 입력하면 최초 작업환경(master)에서 2839로 환경이 변경되었다,.


이제 코드를 작성하기 위해 파일만 만들어놓고 주석만 달아놓자. 2839번 문제를 읽어보니 봉투가 5kg, 3kg이 있는데 최소한으로 봉투 개수를 만들어서 물건을 넣으라고 한다.


아 그런데 문제 풀려고 하다 보니 너무 어렵다. 조금 쉬운 9654번 문제부터 풀자. 그럼 지금 작업환경을 빠져나와서 9654로 변경해야 한다.


git chekout master

git branch 9654

git checkout 9654


이렇게 하면 다시 9654 작업환경으로 바뀌게 된다. 기존에 작업하던 2839번 폴더가 사라졌다. 이제 9654번 문제를 풀고 commit 해보자


이제 9654번은 다시 고칠 필요가 없으니 기존 작업환경(master)에 9654 작업환경을 합쳐놓아야겠다. 우선 checkout으로 최초 환경(master)으로 이동하고 merge 브랜치명 명령어로 작업환경을 합쳐버리자


git checkout master

git merge 9654


이것저것 작업했는데 못 따라오겠다. 무엇을 변경했는지 쉽지 않다. 역시 CLI는 가독성이 좋지 않다. 우리는 GUI 환경이니까 GUI로 확인하자. 구글에 소스트리를 검색한 뒤 설치하자

https://www.sourcetreeapp.com/


건너뛰기 -> 다음을 클릭해주면 된다. 처음에 사용자 이름과 이메일을 입력하라고 하는데 우리는 이미 설정했으므로 자동적으로 설정될 것이다.


SSH키를 불러올 것이냐고 물어보는데 패스하자

이후 상단 좌측의 Add 버튼을 클릭한 뒤 경로를 지정해주자

현재까지 작업한 내역을 한눈에 보여주는데 2839 같은 경우 그래프가 끊겨있다. 빨리 코드를 구현한 뒤 master와 합쳐줘야만 될 것 같다. 다시 작업환경(branch)을 2839번으로 이동하자. 좌측


2839번은 풀이하고 소스트리에서 좌측에 있는 master 브랜치를 더블클릭해서 현재 상태를 master로 변경 후 2839 작업한 것을 합쳐주자


이제 협업을 위해 현재 저장소를 github이라는 공용공간에 올려보자. 올리기에 앞서 github에 대해 잠시 설명하자면 git은 말 그대로 개발을 도와주는 형상관리 프로그램이다. 그런데 개발을 여러 명이서 한다면? 협업을 위해선 클라우드에 개발 코드를 올린 뒤 코드를 합쳐야 한다. github은 여러 명이서 개발을 할 때 도와주는 도구이다.


public으로 저장소를 설정할 경우 다른 사람들도 내 코드를 볼 수 있으며 내 프로젝트를 수정 후 변경사항을 반영해달라고 요청할 수도 있다. 말 그대로 개발을 사랑하는 사람들의 커뮤니티가 되는 것이다.


깃헙에 가입한 뒤 baekjoon이라는 저장소를 만들자



깃헙 저장소 주소를 복사한 뒤 내가 작업한 저장소를 연결해주자


소스트리 메뉴 중 저장소를 클릭 한 뒤 저장소 설정을 클릭하자


이후 메뉴의 push 버튼을 클릭하여 github에 업로드하자

helper가 뜨면 no helper을 설정해주고 로그인 정보를 입력해준다.


이제 깃헙 사이트에 접속 후 브랜치를 master로 변경해주면 업로드된 정보를 확인할 수 있다. 원래는 변경해줄 필요 없는데 얼마 전에 github에서 master는 주종관계를 의미한다고 하여 master를 main으로 변경해버렸다.



마지막으로 4344번 문제를 풀어본 뒤 cli 버전으로 push를 해보자. 4344문제는 반에서 성적이 평균 이상 인원의 비율을 구하는 문제이다.


소스트리에서 기존에 작업하던 브랜치는 모두 제거해주자

cli에서 작업하려면 git branch  -D 브랜치명을 입력해주면 된다.

이후 4344 브랜치를 생성해주자



이제 소스트리를 이용해서 커밋을 해보자




이제 현 branch를 master로 체크아웃한 뒤 또 병합해주면 된다.



이번엔 push를 cli버전으로 해보자


아래 명령어를 입력해 원격저장소명을 확인하자

git remote


그리고 나의 브랜치명을 확인하자.

git branch


먼저 원격 저장소에 변경된 정보가 있는지 확인하자. 있을 경우 pull 명령어를 통해 가져와야 한다.

git fetch

git pull 원격저장소명 브랜치명


아래 명령어로 깃헙에 현재 브랜치 정보를 올리자. vscode에서 github을 사용해도 되냐고 권한을 물어볼 텐데 승인해주면 된다.

git push 원격저장소명 브랜치명


추가적으로 원격에 있는 브랜치 정보를 가져오고 싶으면 다음 명령어로 하면 된다. 여기서는 패스하겠다.

git fetch

git branch -a

git checkout -b 만들려는브랜치명 origin/생성된브랜치명

원격의 브랜치명을 지울 때는 다음과 같이 입력하면 된다.

git push -d origin 브랜치명




마지막으로 다른 사용자가 만든 저장소에 작업한 뒤 수정 요청을 하는 작업을 해보자.

우선 변경하려는 깃헙 저장소에 이동한 뒤 fork버튼을 클릭한다.


그리고 위 프로젝트를 다운로드하기 위해 내 컴퓨터에 저장소 폴더를 하나 만든다.

git clone 새로 만든 주소

이후 코드 수정을 한 뒤 모든 작업은 위와 동일하게 해준다.


이제 내가 작업한 내용을 원 개발자에게 알려야 하는데 깃헙의 fork 된 저장소를 보면 pull request가 보일 것이다. pull request를 한 뒤 왜 내가 당신의 코드를 수정했는지를 작성한다. 이후 원 개발자가 수정한 내역이 맘에 들면 merge를 해줄 것이다.







매거진의 이전글 Python DFS
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari