버전 관리 및 협업 도구
리누스 토르발즈 약 26년 동안 2천만줄이 넘는 소스 코드를 1만 명이 넘는 소프트웨어 엔지니어들과 함께 오픈 소스 방식으로 작성하며 Linux OS를 만들고 관리했다고 한다. 리누스 토르발즈는 이 과정에서 불편함을 느껴 Git을 만들었다고 한다. 2005년에 Git을 출시하면서 그는 Git을 ‘지옥에서 온 문서 관리자’라고 소개했는데, Linux OS를 만들고 관리하면서 경험했던 지옥을 해결하기 위해 버전 관리, 백업, 그리고 협업과 관련된 기능들을 담아 Git을 탄생시켰다.
Git - 소스 코드를 관리하고 추적할 수 있는 버전 관리 시스템
Github - Git Repository를 관리할 수 있는 클라우드 기반 서비스로, 내 PC에서 Git으로 관리하는 프로젝트를 올려두는 사이트
Git을 설치하고 가장 먼저 사용자 이름과 이메일 주소를 설정한다.
이 정보는 Git commit내역에 기록된다.
$ git config --global user.name "나의 사용자 이름"
$ git config --global user.email "내 이메일 주소"
SSH는 보안이 강화된 shell 접속을 말한다. CLI 환경(터미널)에서 다른 PC에 접속하거나 요청할 때, 사용자를 인증할 때 사용한다.
SSH 키 생성
아래 명령어를 터미널창에 입력하면 SSH 키 페어(쌍)을 생성할 수 있다.
ssh-keygen
ssh-keygen 는 경로 ~/.ssh./ 에 두 파일 id_rsa 와 id_rsa.pub 를 생성하는 명령어로, 이 두 파일은 SSH 키 페어라고 하며, 이 중 id_rsa.pub는 공개키라고 한다. 그리고 id_rsa는 나만 알고 보관해야 하는 키라고 하여 개인키 또는 비밀키(Secret Key) 라고 한다.
SSH 키 페어를 생성하였으므로, 생성된 키 페어 중 공개키를 복사하여 gitub에 등록한다.
아래 명령어를 입력하면 공개키를 출력한다. 출력결과인 공개키를 복사한다.
cat ~/.ssh/id_rsa.pub
Github 사이트에 접속해 내 프로필의 Settings으로 들어간다. 그 후 SSH and GPG keys를 선택한다. 그 후 표시된 화면에서 New SSH key버튼을 클릭한다.
등록한 SSH 공개키를 구분할 수 있도록 Title을 작성한다. 그리고 Key에는 복사해둔 공개키를 붙여 넣고, Add SSH Key 버튼을 클릭한다. Confirm access에서 Github 로그인 비밀번호를 입력해 SSH Key 등록을 승인한다.
Code의 Clone에서 SSH탭으로 갔을 때 나타나는 문자열(Github Repository 주소)을 복사한다.
터미널에 다음 명령어를 입력해 정상 동작하는지 확인한다.
git clone 복사한 주소
ls명령어를 입력해 폴더가 생성되었다면 정상 등록된 것이다.
내가 작업하는 파일이 Git으로 버전관리 받기 위해서는 나의 폴더가 Git의 Tracking을 받아야 한다. Git의 Tracking을 받는 폴더를 Git Repository라고 한다.
Git Repository는 Remote Repository와 Local Repository두 개의 저장소를 제공한다.
실제 작업할 때는 Local Repository에서 할 수 있고 Remote Repository에 올려 다른 사람과 공유할 수 있다.
fork (다른 사람 Remote Repository에서 수정할 프로젝트를 선택하고 내 Remote Repository로 가지고 오는 작업)
GitHub의 내 계정에 Fork를 해서 가져온 Github계정이름 / git-project는 내 Remote Repository (원격 저장소)이다.
clone (내 Remote Repository에 있는 코드를 내 local PC로 가져오는 작업)
소스 코드를 수정한다.(수정 후 add 명령어를 통해 staged상태로 올릴 수 있고 restore 명령어를 통해서 수정내용을 폐기할 수도 있다. commit되지 않은 Local Repository의 변경 사항을 폐기해 처음 clone받아왔던 상태로 만드는 것이다.)
수정을 완료했다면 Git이 트래킹하는 공간인 staging area로 파일을 추가해야 한다. 이때 사용하는 명령어가 git add <파일이름>이다. 올려야 할 파일이 많다면 git add . 명령어를 통해서 모든 파일을 한 번에 올릴 수 있다. (만약 add후에 파일을 다시 수정했다면 add를 다시 해줘야 한다.) - 파일의 현 상태를 확인하고 싶을 때는 git status 명령어를 사용한다.
add를 했다면 commit을 할 수 있는 상태가 된다. commit은 변경내용을 기록하고 버전으로 관리하기 위한 명령이다. git commit -m '메시지 작성' 명령어를 통해 commit할 수 있다.
Local Repository에만 commit해 놓은 기록이면 git reset HEAD^ 명령어로 가장 최신의 commit을 취소할 수 있고, git reset HEAD~3 명령어와 같이 3번 전 commit도 취소할 수 있다.
commit을 했다면 git push origin <브랜치이름> 명령어를 사용하여 수정내용을 내 Remote Repository에 올릴 수 있다. (git log를 통해 commit 기록을 확인 할 수 있다.)
내가 변경한 파일들을 contribute하기 위해서는 Pull Request를 해야 한다. Pull Request는 함께 작업하는 다른 사람들에게 내가 push해 놓은 변경 사항에 대해 알리는 것을 말한다. Github의 Remote Repository에서 Compare & pull request버튼을 클릭해서 내가 push해 놓은 내용을 요약해서 동료들에게 알려준다. 동료들은 요약 내용을 보고 변경 사항을 쉽게 파악할 수 있다.
내 컴퓨터에서 생성한 디렉토리를 Git의 관리를 받는 Git Repository로 만들어 주는 명령어는 git init 이다.
(기존 프로젝트를 Git Repository로 변환하거나 새로운 Repository를 초기화하는 데에 사용할 수 있다.)
나중에 협업할 때 편리하도록 Local Repository를 Github에서 원격으로도 관리하도록 Local Repository를 Remote Repository와 연결한다.(git remote add origin Repository 주소)
페어와 함께 작업 시
pair의 변경 사항과 나의 변경 사항을 Remote Repository를 통해서 공유한다.
상대방의 Repository의 이름은 편의상 pair라고 한다면, git remote add pair 페어의 Repository주소 명령어를 입력해 상대방의 Repository와 연결한다.
git remote -v 명령어를 통해 현재의 Local Repository와 연결된 모든 Remote Repository 목록을 확인할 수 있다.
페어의 작업 받아오기
'git pull pair 페어의 브랜치' 명령어를 통해 페어의 Remote Repository에 있는 작업 내용을 받아올 수 있고 이때 내용이 자동으로 병합(merge)되는데, 병합과정에서 충돌(Conflict)가 발생할 수 있다.
충돌(Conflict)이란, 같은 파일의 같은 코드 라인을 페어와 내가 동시에 수정했을 때 병합(merge)을 못 하는 상황이다.
이때, git status 명령어를 통해 어떤 파일이 충돌하고 있는지 확인할 수 있다.
충돌이 발생한 파일을 열어 보면 어떤 부분에서 충돌이 발생한 것인지 확인할 수 있다. 그리고 충돌이 일어난 부분은 하나하나 직접 확인 후 수정이 필요하다.
Accept Current Change를 클릭해서 내가 수정한 내용으로 파일에 반영할 수 있다.
Accept Incoming Change를 클릭해서 Remote Repository의 내용으로 파일에 반영할 수도 있다.
Accept Both Changes는 변경 사항 모두를 반영한다.
수정을 마치면 병합 커밋(merge commit)을 생성해 주기 위해서 파일을 staging area로 추가해야 한다.
Merge commit은 자동으로 Commit 메시지가 생성된다. (물론 메시지를 수정할 수도 있다.)
git commit 명령어로 자동으로 생성된 commit 메시지를 남길 수 있다.
그리고 Remote Repository에 Push 하면 Merge branch ‘브랜치이름’ of 라는 commit 메시지가 기록되며, Remote Repository로 push가 완료된다.
$git clone <Repository URL>
$git remote add pair <Repo URL for pairs fork>
$git remote -v #연결상태 확인
$git add <change file> #수정한 파일명
$git commit -m '메시지' #commit 메시지 기록
$git push origin <branch name>
$git pull pair <branch name>