Git이란?
Git(Global Information Tracker)은 개발자에게 있어서 필수적인 프로그램의 버전 관리, 백업, 협업을 위한 강력한 도구이다. Git이 없다면 수천수만 줄의 코드에서 작은 수정사항을 기록하고 백업하느라 엄청난 시간을 낭비할 것이다.
Git: https://git-scm.com/
Github란?
버전 관리 웹 저장소이다. Git은 기본적으로 지역 저장소에 저장되는데, 지역 저장소에 기록된 버전 관리를 Github에 업로드할 수 있다. Github을 통해 백업이나 협업을 네트워크 상에서 할 수 있고 개발에 필요한 무수한 라이브러리를 활용할 수도 있다. 비슷한 플랫폼으로 gitlab이나 bitbucket 등이 있다.
Github: https://github.com/
Git CLI 명령어
# 설치확인
git
설치된 경우 usage: git...로 시작되는 문서가 출력된다. 설치가 안되어 있다면 git 공식 사이트 참조.
# 초기화
git init <directory>
Git을 사용하기 위해 먼저 사용할 디렉터리에 초기화를 해줘야 한다. 명령이 성공하면 해당 디렉터리에. git 숨김 디렉터리가 생긴다.
# 상태 확인
git status
추가되거나 변경된 파일이 있는지 상태를 확인할 수 있다.
# 변경내용 확인
git diff
변경된 파일의 세부적인 변경 내용을 확인할 수 있다. +는 추가된 라인, -는 삭제된 라인을 나타낸다.
# 변경사항 스테이지에 추가
git add <filename>
- 파일 추가
git add .
- 현재 디렉토리 모든파일 추가
commit을 위한 변경사항을 준비하는 명령이다. 이를 통해 기록할 변경사항과 기록하지 않을 변경사항을 구분할 수 있다.
# 변경사항 커밋
git commit [-a | -m <msg>]
변경사항을 기록하는 명령어다. 주로 커밋한다라고 한다.
a 옵션은 add의 의미로 변경사항을 스테이지에 추가해준다는 의미이며 m 옵션은 해당 기록에 대한 message를 뜻한다. a와 m 옵션을 동시에 사용함으로써 변경사항을 스테이지에 추가함과 동시에 입력된 메시지와 함께 기록된다. a옵션만 사용할 경우 message를 입력할 텍스트 에디터가 실행되어 직접 입력하여야 하며, m 옵션만 사용할 경우 변경사항이 스테이지에 없다는 에러 메시지가 발생한다.
(에디터 변경 명령어: git config --global core.editor <에디터 이름(vi, nano 등)>)
단 새로 생성된 파일의 경우 git add 명령어가 선행되어야 한다.
# 최근 커밋 메시지 변경
git commit --amend
# 버전 관리 로그 보기
git log
- 현재 branch의 로그를 보여줌
git log --all
- 모든 branch의 로그를 보여줌
git log --oneline
- 각 commit를 한줄로 간략하게 보여줌
git log --graph
- 각 commit의 관계를 이미지화 하여 보여줌
git log --stat
- 각 commit의 파일단위 변경사항을 보여줌
git log -p
- 각 commit의 변경된 파일의 세부 변경사항을 보여줌
# branch 혹은 commit 된 작업으로 변경
git checkout <branch> 또는 <commit>
# 버전 되돌리기(reset)
git reset [--soft | --mixed | --hard] <commit>
입력된 commit에 해당하는 버전으로 되돌리는 명령어다. soft를 사용하면 파일의 변경사항 및 스테이지 여부까지 그대로 남는다. mixed를 사용하면 파일의 변경사항은 남지만 변경된 파일의 스테이지가 풀리게 된다. hard는 파일 변경내용 등 모두 지워지게 된다.
# 버전 되돌리기(revert)
git revert <commit>
입력된 commit에 해당하는 버전의 이전 commit으로 되돌리는 명령어다. reset은 입력된 commit으로 되돌아가며 입력된 commit 이후 기록은 제거되는 반면 revert는 입력된 commit 이전 기록을 새롭게 commit 한다.
# 현재 branch 확인
git branch
# 새로운 branch 생성
git branch <branchname>
# branch 병합
git checkout <branch to merge>
git merge <branch to be merged>
병합할 브런치에서 병합될 브런치를 향해 merge 명령어를 써주면 병합된다.
* conflict가 발생할 경우 해당 파일을 열어서 수정하면 된다.
"<<<<<<< HEAD"부터 "=======" 까지는 현재 branch에 해당하는 내용이고 이후부터 ">>>>>>> <branch to be merged>" 까지는 병합될 branch에 해당하는 내용이다. 즉, "======="의 경계선으로 위아래로 나뉘어 있으므로 원하는 내용으로 수정한 후 commit 하면 된다.
# 개별 commit의 작업 내용만을 병합
git cherry-pick <commit>
merge는 branch에 commit 된 모든 작업 리스트를 병합하는 반면 cherry-pick은 체리를 쏙 빼먹듯 한 commit만 골라서 해당 작업내용을 병합한다.
# branch의 base를 변경하여 다시 commit
git rebase <commit>
해당 commit을 base로 설정하여 다시 commit 한다. 두 갈래로 나누어져 있는 병렬 형식인 경우 선형으로 바뀌게 된다.
# 웹 원격 저장소에 연결 및 업로드(push)
git remote add <name> <url>
- url에 해당하는 원격 저장소에 연결. <name>은 주로 "origin"
git push [-u | --set-upstream] <name> <current local branchname>
- 연결된 원격 저장소에 로컬 저장소 내용을 업로드.
- 한번 업로드 된 이후에는 git push 명령어로 상기 같은 명령어의 기능을 수행함
# 지역 저장소에 원격 저장소 복제
git clone <repository>
repository는 원격 저장소의 url이다.
# 원격 저장소에서 변경된 파일 당겨오기
git pull
가져온 후 병합
git fetch
가져온 후 병합하지 않음
pull로 가져올 때 자동으로 병합하기 때문에 원격 저장소와 지역 저장소에서 같은 곳을 변경한 경우 conflict가 난다. 따라서 merge를 하기 전 확인을 먼저 하고 싶을 때 fetch를 사용할 수 있다.