GIT 용어 및 명령어 정리
GIT 이란?
코딩 이력 관리, 형상 관리 도구, 분산 버전 관리 시스템 등등 다양한 설명들이 존재한다.
위키피디아의 설명으로 이해하면
Git is a distributed version-control system for tracking changes in any set of files, originally designed for coordinating work among programmers cooperating on source code during software development. |
(1) 파일들의 변화를 트래킹하고
(2) 여러 명의 개발자들이 작업파일(소스코드)들에 협업하는 과정을 조율한다
GIT 을 이용하면 잘못 수정한 내용을 되돌릴 수도 있고,
다른 사람의 작업내용을 나의 로컬환경으로 끌어올 수 있으며,
공동의 작업환경에 자신의 작업내용을 구별된 형태로 업로드할 수 있습니다.
GIT 용어정리
GIT 은 remote repository(원격 저장소)로 나의 작업환경을 올리기까지 여러 임시 저장소를 두고 있습니다.
working directory 는 내가 작업하고 있는 나의 로컬 환경을 일컫습니다.
working directory 에서 수정한 내용을 Index 에 add 하고 commit 하여 local repo (원격 저장소) 에 저장할 수 있습니다.
여러개를 수정하게 되면 내가 한 단위의 수정이라고 판단되는 만큼 add 하여 Index 에 저장하고,
그 후 commit 하면 픽스한 상태로 로컬 저장소에 저장됩니다.
마지막으로 push 하면 다른 협업개발자들이 볼 수 있는 remote repo 로 올라가게 됩니다.
(working directory : 실제 파일이 위치한 나의 디렉토리)
- add -> - commit -> - push ->
------------------------------------------------------------------------------
| working_directory | Index | local repo | remote repo |
------------------------------------------------------------------------------
<- checkout - <- fetch -
- Index : 확정할 준비가 된 변경사항들을 보관한 곳 = Staging area 라고 한다 Staging 변경사항들을 확정할 준비를 한다. = 커밋시킬 내용을 묶는다.
- HEAD : 작업중인(=체크아웃된) 브랜치의 선두를 가리키는 포인터 = 가장 최근 커밋을 가리킴 : git 의 명령어들은 보통 HEAD 를 변경하는 것으로 시작한다
- local repo : 컴퓨터 내 로컬 저장소
- remote repo : 호스팅 서비스(i.e. github, gitlab, bitbucket) 와 같은 원격 저장소
명령어에서 확인되는 용어들
- HEAD^ : 헤드의 직전위치
- origin : = remote repo = original repository's url 를 지칭하는 alias = 원격저장소
- master : = local branch를 가리키는 포인터 ( in my computer)
- origin/master : = remote branch를 가리키는 포인터 (remote repo name)/(branch name) 형식.
GIT 명령어 정리
git add
- git add 작업파일 : Index(Staging area) 에 저장한다
- git add -p : 파일의 변경사항을 파일 단위(hunk)로 나뉘어 add&commit 이 가능해진다
git commit
- git commit : Staging 된 수정 사항들을 하나의 커밋으로 묶어 local repo 에 저장한다
git checkout
= HEAD(작업위치를 가리키는 포인터) 의 위치를 변경
- git checkout BRANCH_NAME : 특정 브랜치로 이동한다
- git checkout -b NEW_BRANCH_NAME : 현재 브랜치의 HEAD에서 새 브랜치를 생성한다
- git checkout . : 현재 브랜치의 HEAD로 이동한다 = HEAD는 로컬에 남아있는 수정사항들을 가리키지 않는다. 현재 브랜치에서 마지막으로 커밋된 내용을 가리키고 있다. = 커밋되지 않은 내용들을 리셋시킨다
git fetch
- git fetch origin : origin(=원격저장소) 로 fetch 한다
- remote repo 의 변경사항(커밋들)을 local repo 로 가져온다
- origin/master(=remote branch pointer)를 최신 위치(remote repo)로 업데이트 한다
git merge
-
작업중인 브랜치와 다른 브랜치의 커밋들을 병합한다
-
git merge BRANCH_NAME
-
두 브랜치가 같은 파일을 수정중이면 쉽게 Conflict (충돌)이 발생할 수 있는데, 충돌난 파일로 가보면 충돌된 내용을 표시되어 있다. 충돌을 풀어서 git add 로 저장한 다음 merge 를 이어가면 된다.
<<<<<<< HEAD:test.go
fmt.Println("test data to be merged")
=======
fmt.Println("test out-of-date data")
>>>>>>> sdf9g4h:commit test
git pull
- git fetch + git merge
- fetch 로 원격 저장소의 커밋내용들을 로컬 저장소로 가져와 해당 내용으로 로컬 저장소의 커밋들과 병합한다
- git pull origin BRANCH_NAME
git log
- git log -p : 각 커밋의 diff 결과를 보여준다
- git log --stat : 커밋의 통계 정보를 조회
- git log --oneline --graph --decorate --all : 모든 커밋정보들을 tree 형태로 볼 수 있다
git branch
- git branch -d BRANCH_NAME : git branch 삭제
- git branch -r : 원격 branch 확인하기
- git branch -a : 모든 branch 확인하기
git reflog
- git 이력을 확인
- commit_id(hash_id) head command option 순으로 확인 가능하다
- commit_id 를 확인하여 삭제된 커밋, 브랜치를 복구할 수 있다
git reset
- HEAD 를 특정 커밋으로 옮긴다. 단, git revert 와 달리 커밋 히스토리를 남기지 않는다.
- 과거 버전으로 돌아가기, 잘못된 병합 취소 등을 수행할 수 있다
- --mixed : 헤드와 인덱스만 변경 (default)
- --soft : 헤드만 변경
- --hard : 작업 디렉토리, 헤드, 인덱스 모두 변경
git rebase
- 작업중인 브랜치의 HEAD 위치를 재배치한다
- git rebase origin/master : 현재 작업하고 있는 브랜치가 origin/master(=원격 저장소의 master branch) 를 가리키도록 한다.
- git rebase --continue : confilct 발생 시 코드 고치고 해당 명령어로 진행
- git rebase --abort : confilct 발생 시 rebase 취소
- git rebase -i HEAD~5 : i 옵션으로 interactive 하게 커밋 내용들을 수정할 수 있다.
git stash
- commit 되지 않은 working directory의 수정사항들을 임시 저장한다.
- 필요할때 꺼내 쓸 수 있다. 다만 stack 처럼 작동하여 선입후출. 가장 최근에 stash 된 내용부터 꺼낼 수 있다.
- git stash : working dir 에 있는 변경사항들을 임시 스택에 저장한다
- git stash pop : git stash 스택에 들어있는 내용을 가장 최신부터 꺼내 적용한다
git push
- 원격 저장소로 해당 브랜치를 올린다
- git push -f origin NEW_BRANCH
- git push —delete origin DEL_BRANCH : 원격 저장소에 올라간 브랜치를 지울 수도 있다
git cherry-pick
- 다른 브랜치에서 작업한 커밋들을 복사해서 현재의 브랜치로 붙여넣는다
- git cherry-pick 커밋ID : 여러개의 연속된 커밋들을 가져올 수도 있다