Git과 Github의 기초를 배워보자!
Intro
현재 깃허브 블로그를 이렇게 만들어서 운영을 하고는 있지만 사실 일종의 편법(?)으로 나는 깃을 사용하지 않고 오로지 깃허브 웹UI를 통해서 수박 겉핥기 식으로 블로깅을 하고 있었다.
덕분에 블로그를 만들고 포스팅하기까지의 단계를 많이 줄여서 빠르게 깃허브 블로깅의 세계로 진입할 수 있었지만, 깃허브만을 통해서는 디렉토리 이름 변경이 불가능하거나 파일 복사를 할 수 없는 등 사용할 수록 여러가지 문제에 부딪히게 되었다.
게다가 개발공부를 하며 팀 프로젝트를 시작하고나니 각자 작업한 결과물들을 다시 하나의 파일로 만들기 위한 번거로움이나, 중간에 수정/삭제한 부분들을 계속해서 서로에게 말로 업데이트하고 어디가 수정되었는지 매번 찾아봐야하는 불편함이 생겼기 때문에 하루라도 빨리 깃을 공부해야겠다는 생각이 들었다.
사용 자료
인터넷의 여러 강의들을 찾아보면서 가급적이면 지금 바로 실습까지 해볼 수 있을 정도의 수업으로 시작을 하는 것이 좋겠다고 판단했다. 일단 유튜브만 봐도 굉장히 다양한 강의 영상들이 올라와있는데, 나는 GUI 서비스만을 사용하는 방법보다는 커맨드 사용법에 익숙해질 수 있는 수업을 원했고 너무 많은 개념을 이해하기 보다는 지금 당장 사용해볼 수 있도록 도와줄 영상을 찾았다.
결론적으로 개념은 생활코딩의 Git1 수업으로 짚었고, 실습은 얄팍한 코딩사전 채널에서 아래의 유튜브 영상들을 기반으로 공부를 진행했다.
개념
그래서 깃이 뭔데?
깃은 컴퓨터 파일의 변경사항 관리를 돕는 프로그램으로, 다음 세 가지 목적을 가지고 있다:
- 버전관리
- 백업
- 협업
버전관리는 파일의 내용이 어떻게 달라졌는지 때마다 저장하고 확인할 수 있도록 해주고, 백업은 파일을 변경하더라도 언제든지 이전 작업상태로 돌아갈 수 있도록 해주며, 협업에서는 여러 사람이 같이 파일 작업을 하더라도 누가 언제 어떤 파일을 어떻게 변경했는지 알 수 있도록 해준다.
그럼 깃허브는 뭐야?
깃이 개인의 컴퓨터 안에서 파일들을 관리할 수 있도록 해준다면, 깃허브는 작업파일들을 웹에 보관할 수 있게 해주는 외부저장소이자 다른 사람들과 파일공유를 쉽게 할 수 있도록 깃을 사용해서 제공되는 서비스다.
깃을 왜 배워야하는가?
만약 내가 혼자서만 일을 하고, 작은 규모의 프로젝트만을 진행한다면 깃을 사용했을 때 조금 편해질 수는 있어도 깃을 배우려는 노력을 들일 필요는 없을 것이다. 버전관리야 파일을 여러개 만들어서 “최종.jpg, 최최종.jpg, 최최최종.jpg, 진짜최종.jpg, 리얼최최최최수종.jpg” 이렇게 저장해도 되고, 백업이야 파일을 구글드라이브 같은 곳에 올려놓기만 해도 될테니까.
그러나 문제는 작업 파일이 수천, 수만개가 되는 순간이 찾아오게 된다면 작업물을 관리하는 일이 기하급수적으로 어려워질 것이고, 여기에 다른 사람과 협업까지 해야한다면 누군가가 보내준 파일이 언제 마지막으로 작업된 것인지 그리고 내가 작업한 내용과 어떻게 다른지 등을 매번 파일을 들여다보며 비교해야하는 “지옥”에 도달하게 될 수 있다.
개발을 시작한 이상 곧 지옥에서 헤메게 될 날이 다가올텐데 (벌써 발을 들여놓았을지도…), 이미 현업에서도 “지옥에서 온 정보 관리자”라는 깃을 배워놓아야 더 원활한 협업능력을 기르고 효율적으로 일할 수 있을 것이다.
Git 기초작업
Git 커맨드의 기본형식
git 명령어 -option # 기본형식
- 깃의 모든 명령어: https://git-scm.com/docs
Git 저장소 생성
git init #현재 디렉토리에서 깃으로 파일관리 시작
git config --global user.name "이름"
git config --global user.email "이메일주소" #사용자 이름과 이메일 설정
현재 버전 저장 (백업)
git status #현재 파일관리 상태 확인
git add -A #모든 파일을 백업에 포함할 파일로 선택
git commit -m "작업수행내용" #백업 커밋
과거 버전으로 돌아가기
git logs #현재까지의 버전 저장내역 확인
git reset 6자리버전코드 --hard #선택한 버전으로 되돌리기 (이후 작업내역은 완전 삭제)
git revert 6자리버전코드 #선택한 버전의 작업내용을 취소 (그 전 작업상태로 복원)
브랜치 관리
- 기존의 파일 및 작업 방식은 그대로 유지한 상태로 다른 방식의 작업을 진행하고 싶을 때 브랜치를 생성해서 관리한다
git branch 브랜치명 #별도 작업내역 브랜치 생성
git checkout 브랜치명 #작업을 진행할 브랜치 선택
git merge 브랜치명 #입력한 브랜치명의 브랜치를 현재 브랜치로 병합
git rebase 브랜치명 #여러개의 브랜치를 모두 현재 브랜치 하나로 재배치
git log --graph --all --decorate #로그에서 브랜치를 시각화하여 확인
git branch -D 브랜치명 #해당 브랜치 삭제
Github을 통한 협업
Github 저장소 연결
- 먼저 깃허브에서 Repository(저장소)를 생성한 후 작업을 진행한다.
git remote #현 폴더의 원격 저장소 확인
git remote add origin 깃허브저장소주소 #현 폴더의 원격저장소로 깃허브저장소를 'origin'이라는 이름으로 저장
git push -u origin master #현재까지 커밋된 내용들을 origin이라는 원격저장소에 master라는 브랜치명으로 업로드
Github에서 다루지 않을 파일 설정
- 다운받은 패키지나 코드 실행시 자동으로 생성되는 파일 등은 굳이 깃허브를 통해 관리할 필요가 없기 때문에 예외처리 할 수 있다.
- 적용 방법은, 현재 작업중인 폴더에서 .gitignore 파일을 생성해 준 뒤 다루지 않을 파일의 이름을 .gitignore 안에 넣어주면 된다.
Github로 파일 올리고 내려받기
- 깃허브 레파지토리에서 clone or download 버튼 클릭 후 나오는 링크를 사용
- push를 하려면 먼저 가장 최신 버전까지 pull을 해놓아야한다.
git clone 링크주소 #링크의 레파지토리 내용을 복제해서 내 컴퓨터의 폴더에 저장
git fetch #현재 연결된 레파지토리의 작업내역을 확인 (기록 업데이트)
git push #현재 버전의 파일 및 기록을 레파지토리에 업로드
git pull 원격명 브랜치명 #입력한 원격저장소의 브랜치에서 가장 최근의 버전으로 파일 가져오기 (파일 및 커밋내역까지 동기화)
브랜치 주고받기
git push 원격명 브랜치명 #입력한 원격저장소로 해당 브랜치 및 현재까지 작업파일 업로드
git branch -a #현재 브랜치내역 확인 (-a를 붙이면 로컬가 원격브랜치 모두 확인가능)
git checkout -b 브랜치명a 원격명/브랜치명b
#원격저장소의 브랜치b를 가져와 브랜치a에 저장하고 바로 해당 브랜치에서 작업(-b)
git push -d 원격명 브랜치명 #원격의 브랜치 삭제
충돌 해결하기
- 충돌: 같은 파일의 같은 라인을 수정한 두 파일을 하나의 브랜치로 merge 하거나 pull/push 하는 경우 발생
- pull이 안되어있는 경우 push가 안되기 때문에 우선 pull을 받으면 어느 부분에서 충돌이 일어났는지를 git이 표시해준다.
- 충돌부분을 어떻게 수정할 것인지 협업자와 논의한 후 서로 동의한 해결방안으로 코드를 수정한 뒤 push를 해주면 된다.
공부후기
사실 예전부터 git과 github에 대해서는 너무 많이 들었고, 개발관련회사의 채용공고를 보면 git은 거의 항상 기본조건으로 들어가 있기 때문에 언젠가는 꼭 공부를 해야겠다고 생각하면서도 막상 시작하기는 어려웠다. 뭔가 C나 파이썬 같은 프로그래밍 언어를 처음 마주쳤을 때랑은 또 다른 느낌으로 터미널을 사용해서 git 명령어를 치는 행동이 굉장이 어렵고 두렵게 느껴졌다고 해야하나?
그런데 막상 공부를 해보니 아직 매우 기초적인 부분만 다루기는 했지만 그렇게 어려운 개념은 아니었다는 것을 깨닫게 되었다. 오히려 깃을 배우기도 전에 너무 처음부터 깃허브 블로그를 다루기 위한 디렉토리를 변경작업이나 미러링 같은 부분들을 염두에 두면서 스스로 진입장벽을 높여놨던 것은 아닐까 싶다.
그리고 다른 사람들과의 프로젝트 진행을 경험하고 깃/깃허브 공부를 하면서 드는 생각은, 좋은 개발자가 되기 위해서는 개인적인 프로그래밍 능력도 중요하지만 협업능력도 정말 중요한 역량 중의 하나라는 것이다. 깃 자체를 능숙하게 다루는 것도 물론 중요하겠지만, 깃을 어떻게 협업을 위한 도구로 활용할 거고 얼마나 효율적으로 충돌을 관리하고 대처할 수 있는 개발자가 될 수 있을지 생각하며 공부를 해나가야겠다.
댓글남기기