지옥에서 온 버전 관리자 Git
Git은 개발자 코드들을 효율적으로 관리하기 위해 개발된 분산형 버전 관리 시스템입니다. 특정 시점에 생성된 백업 복사본들을 스냅샷으로 만드는 commit 작업을 통해 이전 기록들에 대한 변경사항과 저장이 가능하게 됩니다. 어떤 부분이 변경되었고, 누가 이 작업을 했는지 프로젝트를 이끌어 가는 과정에서 상당히 큰 힘을 가지는 시스템입니다.
Github은 Git Repository에 저장된 소스코드들을 관리하고 추적할 수 있는 버전 관리 시스템입니다. 수많은 오픈소스 프로젝트들이 GitHub에서 호스팅되고 공유되고, 발전해나가고 있습니다. 프로젝트 개발과정에서 소스코드들을 공유하고 분산관리할 수 있는 Git은 마이크로소프트에 2018년 8천억원에 인수되었습니다.
Git Repository
Git Repository는 크게 Local Repository와 Remote Repository로 구분됩니다. 작업할 때는 Local에서 진행하고, 소스코드를 공유하고 프로젝트에 반영하기 위해서는 Remote Repository에서 진행할 수 있습니다. 또한 변경된 프로젝트 소스코드를 자신의 Local Repository에 가져올 수도 있습니다.
Git fork vs clone vs push vs pull
다른 사람의 Remote Repository에 있는 소스코드를 자신의 Remote Repository에 옮기는 작업을 fork라고 합니다. 자신의 원격저장소로 가져와서 작업해야 Contribution을 할 수 있게 됩니다.
Fork를 한 소스코드를 작업하기 위해서는 Local Repository로 가져와야 합니다. 이 과정을 Clone이라고 합니다.
Local Repository에 가져온 소스코드 작업이 완료 되었다면 다시 Remote Repository에 올리는 작업이 필요합니다. 이 과정을 Push라고 합니다. Push가 완료된 소스코드는 GitHub에서 Pull Request라는 명령을 통해 본인이 제안한 코드를 프로젝트에 반영해달라고 요청할 수 있습니다.
만약 Remote Repository에서 변경된 사항들을 내 Local Repository에 반영하기 위해서는 pull 명령어를 사용해야 합니다. Local의 변경사항을 Remote에 반영하기 위해 사용하는 push의 반대라고 생각하시면 됩니다.
Git Install
CLI 환경에서 아래 명령으로 간단하게 Git을 설치할 수 있습니다.
$ sudo apt install git
설치 후 버전확인을 통해 정상적으로 설치가 완료된 것을 확인할 수 있습니다.
$ git --version
Git을 처음 사용하기 위해서는 사용자 이름과 이메일을 등록해줘야 합니다. Git 커밋 내역에 기록하기 위한 최소한의 정보를 셋팅합니다. --global 옵션은 사용자 홈에 저장되기 때문에 최초 한번만 입력해주면 됩니다. 차후 사용자 정보를 변경하기 위해서는 다시 사용해줘야 합니다.
$ git config --global user.name
$ git config --global user.email
현재 등록되어 있는 Git 사용자 정보를 확인하기 위해서는 아래 명령어를 사용한다.
$ git config --list
SSH 생성 및 등록
Secure Shell(SSH)를 사용해서 Git과 CLI환경을 연결시킬 수 있습니다. SSH는 비대칭 암호방법이며 공개키와 비공개키로 구분됩니다. 공개키를 Git에 등록하고 소스코드를 Clone하거나 Push 하는 등 연결이 가능합니다. SSH는 아래 명령어로 생성이 가능합니다. SSH 암호키는 RSA방식으로 생성됩니다.
$ ssh-keygen
생성된 SSH 암호키는 (/home/[username]/.ssh/) 디렉토리에 저장됩니다. 생성된 공개키의 이름은 id_rsa.pub이며, id_rsa는 비밀키 입니다. 공개키는 Git에 등록해서 사용가능하지만 비밀키는 절대 노출되서는 안되는 암호키입니다. 공개키를 복사해서 Git Settings > SSH and GPG keys에서 등록이 가능합니다.
Git의 3가지 상태
Git의 3가지 상태는 Untracked Area, Tracked Area내의 Unmodified, Modified, Staged Area로 구분됩니다.
- Unmodified : 기존 파일을 수정하지 않은 상태
- Modified : 기존 Commit 했던 파일을 수정한 상태
- Staged : git add 명령으로 staged된 상태로 commit이 가능한 상태입니다.
전체적인 Git의 구조를 보면 크게 Local과 Remote로 구분이 되고, Local 내에서도 Unstaged와 Staged로 구분이 됩니다. 만약 git add와 git commit을 완료하게 되면 Local My Repository로 소스코드가 저장이 되며, 만약 되돌리기 위해서는 git restore 명령어를 통해 다시 work space로 가져올 수가 있습니다(commit 취소).
아직 Remote Repository에 업로드 되지 않은 소스코드라면 git reset HEAD^명령어로 commit 취소도 가능합니다. 가장 최근 commit 내역을 위해서는 ^, 세번째 commit을 취소하기 위해서는 HEAD^^^ 명령어를 사용해줄 수 있습니다. HEAD-1과 HEAD-3 등의 명령어로도 commit 내역을 취소할 수 있습니다. reset을 위한 hard, soft 등의 옵션이 추가로 준비되어 있습니다.
Git reset --hard vs --soft vs --mixed
commit을 하게 되면 브랜치와 HEAD가 움직이게 됩니다. HEAD는 현재 가장 최신의 commit을 가리키게 됩니다. 여기서 reset 명령어의 hard와 soft의 차이점이 나오게 됩니다.
git reset --soft 옵션은 브랜치는 이전 commit 내용을 가리키게 되지만, HEAD는 여전히 최신 commit을 가리키고 있게 됩니다. git status로 확인해보면 Stated Area에 해당 소스코드가 들어가 있습니다.
반면 git reset --hard 옵션은 HEAD와 브랜치 모두 이전 commit을 가리키게 합니다. 또한 워킹 디렉토리에서 변경사항을 모두 삭제하고 이전 commit으로 되돌려 버립니다. 이렇게 되면 수정사항을 모두 잃어버릴 수 있기 때문에 주의해야 할 부분입니다.
git reset --mixed는 기본 옵션입니다. HEAD와 브랜치 모두 이전 commit을 가리키게 되지만 워킹 디렉토리의 변경사항을 보존하게 됩니다.
Git log
Staged한 commit들을 확인하기 위해서는 git log 명령어를 사용할 수 있습니다. HEAD가 어떤 commit을 가리키고 있고, commit ID와 author, date, commit message 등을 확인할 수 있습니다.
Git Pull Request
Pull Request를 사용하기 위해서는 모든 소스코드가 Remote Repository에 올라가 있어야 합니다. 자신이 Push 한 내용들을 프로젝트에 반영해달라고 할 수 있습니다. 동료들의 리뷰를 받을 수도 있고, Merge 과정을 거칠 수 있습니다.
Git Repository 연결하기
Local에서 생성한 디렉토리와 Remote Repository를 연결하는 방법은 먼저 git init을 통해 Git 관리하에 디렉토리를 놓아주게 됩니다. Local과 Remote를 연결하기 위해서는 아래 명령을 통해 연결할 수 있습니다.
$ git remote add remote_repository_name <repository_url>
자신의 Remote Repository 뿐만 아니라 다른 사람의 Remote Repository와도 위와 같은 방식으로 연결이 가능합니다.
'Programming' 카테고리의 다른 글
애플 맥북 프로 M2 Pro Max 차이 (문제는 GPU야) (6) | 2023.02.16 |
---|---|
Ubuntu LTS 20.04에 Mac OS Theme icon 적용하는 방법 (0) | 2022.04.30 |
상대경로 vs 절대경로 (0) | 2022.04.30 |
Javascript Runtime 환경 구성하기 NVM node.js 우분투 설치 (0) | 2022.04.30 |
우분투 관리자 계정? (0) | 2022.04.30 |
리눅스 CLI 기본 명령 , 패키지 매니저 명령 모음 (0) | 2022.04.29 |
댓글