이번 포스트에서는 git에 대해서 공부한 내용을 정리해보려고 한다.
Git
- Git이란 코드 버전 관리 프로그램을 말한다.
- 버전 관리는 파일의 변화를 시간에 따라 기록해두고, 나중에 특정 시점의 버전을 꺼내올 수 있는 시스템
- 버전 관리의 장점
- 지난 과정을 확인할 수 있다.
- 이전 버전으로 돌아갈 수 있다.
- 여러 개발자가 협업할 수 있게 도와주는 기능도 있다.
- 즉, Git은 버전 관리와 동시 협업을 가능하게 해주는 툴이라고 할 수 있다.
Git vs Github
- 버전을 관리하는 프로그램이 Git, Git으로 관리하는 프로그램을 올려둘 수 있는 사이트가 Github
- Github를 통해 작업물을 다른 컴퓨터에 저장할 수 있다. Github는 원격 저장소를 대신 제공해준다.
Git 핵심 개념
- 레포지토리
- 프로젝트와 관련된 파일 정보를 기록하는 곳
- .git 디렉토리 그 자체가 레포지토리.
- 커밋
- 커밋을 하면 커밋하는 당시의 프로젝트 디렉토리의 모습이 사진처럼 레포지토리에 저장됨
- 이때의 결과물 자체를 커밋이라고 함.
- 프로젝트 디렉토리의 특정 모습을 하나의 버전으로 남기는 행위도 커밋이라고 함.
- Working directory, Staging area, Repositroy
- Working directory : 사용자가 작업을 하고 있는 프로젝트의 디렉토리
- Staging area : git add를 한 파일들이 존재하는 영역. 커밋을 하면 staging area
에 있는 파일들만 커밋에 반영됨.
- Repositroy : working directory의 커밋들이 저장되는 영역.
- working directory에서 뭔가 작업을 하고,
- 작업한 파일들을 git add 해주고,
- 커밋을 하면 staging area에 있던 파일들의 모습이 마치 영화의 한 장면, 스냅샷(snapshot)처럼 이 repository에 저장된다.
Git 명령어
- git init : 현재 디렉토리를 Git이 관리하는 프로젝트 디렉토리(=working directory)로 설정하고 그 안에 레포지토리(.git 디렉토리) 생성
- git config user.name 'name' : 현재 사용자의 아이디를 'name'으로 설정(커밋할 때 필요한 정보)
- git config user.email 'aaa@bb.com' : 현재 사용자의 이메일 주소를 'aaa@bb.com'로 설정(커밋할 때 필요한 정보)
- git add [파일 이름] : 수정사항이 있는 특정 파일을 staging area에 올리기
- git add [디렉토리명] : 해당 디렉토리 내에서 수정사항이 있는 모든 파일들을 staging area에 올리기
- git add . : working directory 내의 수정사항이 있는 모든 파일들을 staging area에 올리기
- git reset [파일 이름] : staging area에 올렸던 파일 다시 내리기
-
--soft [커밋 아이디]
(1) HEAD가 특정 커밋을 가리키도록 함
(2) staging area는 건드리지 않고 이전 상태 그대로 둠
(3) working directory는 건드리지 않고 git reset 하기 이전 상태 그대로 둠
-
--mixed [커밋 아이디]
(1) HEAD가 특정 커밋을 가리키도록 함
(2) staging area를 특정 커밋의 모습처럼 리셋함
(3) working directory는 건드리지 않고 git reset 하기 이전 상태 그대로 둠
-
--hard [커밋 아이디]
(1) HEAD가 특정 커밋을 가리키도록 함
(2) staging area도 특정 커밋의 모습처럼 리셋함
(3) working directory도 특정 커밋의 모습처럼 리셋함
- git status : Git이 현재 인식하고 있는 프로젝트 관련 내용들 출력(문제 상황이 발생했을 때 현재 상태를 파악하기 위해 활용하면 좋음)
- git commit -m "커밋 메시지" : 현재 staging area에 있는 것들 커밋으로 남기기
- git commit :
커밋 메세지를 길게 입력할 수 있음
- git commit --amend :
최근의 커밋을 수정하고 커밋
- git help [커맨드 이름] : 사용법이 궁금한 Git 커맨드의 공식 메뉴얼 내용 출력
- git push -u origin master : 로컬 레포지토리의 내용을 처음으로 리모트 레포지토리에 올릴 때 사용
- git push : 로컬 레포지토리의 내용을 리모트 레포지토리에 보내기
- git pull : 리모트 레포지토리의 내용을 로컬 레포지토리로 가져오기
- git fetch : 로컬 레포지토리에서 현재 HEAD가 가리키는 브랜치의 업스트림(upstream) 브랜치로부터 최신 커밋들을 가져옴(가져오기만 한다는 점에서, 가져와서 머지까지 하는 git pull과는 차이가 있음)
- git clone [프로젝트의 GitHub 상 주소] : GitHub에 있는 프로젝트를 내 컴퓨터로 가져오기
- git show [커밋 아이디] :
특정 커밋에서 어떤 변경사항이 있었는지를 볼 수 있다.
- git log --pretty=oneline : 커밋 히스토리를 볼 때
커밋 하나당 한 줄씩 출력
- git log :
커밋 히스토리를 보는 명령어
- git config alias.history 'log --pretty=oneline' :
git history를 입력하면 git log --pretty=oneline이 입력되도록 설정
- git diff [커밋 A의 아이디][커밋 B의 아이디] : 커밋 A와 커밋 B의 차이를 비교
- git tag [태그 이름][커밋 아이디] : 커밋 아이디에 태그를 붙임
- git branch [새 브랜치 이름] : 새로운 브랜치를 생성
- git branch -d [기존 브랜치 이름] : 브랜치 삭제
- git checkout [기존 브랜치 이름] : 입력한 브랜치로 이동
- git checkout -b [새 브랜치 이름] : 새로운 브랜치를 생성하고 그 브랜치로 바로 이동
- git merge [기존 브랜치 이름] : 현재 브랜치에 다른 브랜치를 머지. 머지한다는 것은 A 브랜치의 내용과 B 브랜치의 내용을 합쳐 새로운 커밋을 만드는 것과 같다.
- git merge --abort : 머지를 하다가 conflict가 발생했을 때, 일단은 머지 작업을 취소하고 이전 상태로 돌아감
- git blame : 특정 파일의 내용 한줄한줄이 어떤 커밋에 의해 생긴 것인지 출력
- git revert : 특정 커밋에서 이루어진 작업을 되돌리는(취소하는) 커밋을 새로 생성
- git reflog : HEAD가 그동안 가리켜왔던 커밋들의 기록을 출력
- git log --all --graph : 모든 브랜치의 커밋 히스토리를, 커밋 간의 관계가 잘 드러나도록 그래프 형식으로 출력
- git rebase [브랜치 이름] : A, B 브랜치가 있는 상태에서 지금 HEAD가 A 브랜치를 가리킬 때, git rebase B를 실행하면 A, B 브랜치가 분기하는 시작점이 된 공통 커밋 이후로부터 존재하는 A 브랜치 상의 커밋들이 그대로 B 브랜치의 최신 커밋 이후로 이어붙여짐(git merge와 같은 효과를 가지지만 커밋 히스토리가 한 줄로 깔끔하게 된다는 차이점이 있음)
- git stash : 현재 작업 내용을 스택 영역에 저장
- git stash apply [커밋 아이디] : 스택 영역에 저장된 가장 최근의(혹은 특정) 작업 내용을 working directory에 적용
- git stash drop [커밋 아이디] : 스택 영역에 저장된 가장 최근의(혹은 특정) 작업 내용을 스택에서 삭제
- git stash pop [커밋 아이디] : 스택 영역에 저장된 가장 최근의(혹은 특정) 작업 내용을 working directory에 적용하면서 스택에서 삭제
- git cherry-pick [커밋 아이디] : 특정 커밋의 내용을 현재 커밋에 반영
Git reset vs Git checkout
일반적으로 HEAD는 브랜치를 가리키고, 브랜치는 커밋을 가리킨다.
- HEAD가 가리키던 브랜치가 다른 커밋을 가리키도록 한다.
- HEAD도 결국 간접적으로 다른 커밋을 가리키게되는 효과가 생긴다.
- HEAD 자체가 다른 커밋이나 브랜치를 가리키도록 한다.
- 브랜치를 통하지 않고, 커밋을 직접적으로 가리키는 HEAD를 Detached HEAD라고 한다.