정의
- git : 버전관리 프로그램.
- gitHub : 깃으로 관리하는 프로젝트를 올려둘 수 있는 원격 저장소 서비스.
구성
- working directory : 내가 작업중인 디렉토리
- staging area : 새로운 커밋에 변경사항을 저장할 파일들을 담아주는 곳.
- local repository : git이 관리하고있는 파일들이 보관되어있는 로컬 저장소.
- remote repository : local repository에서 push하면 remote repository에 저장된다.
깃으로 관리되는 파일의 상태
- untracked 상태 : git이 변동사항을 추적하고있지 않은 상태.
- tracked 상태 : 파일이 git에 의해 변동사항이 추적되고 있는 상태.
- staged 상태 : 파일 내용이 수정된 후, stageing area 에 올라와있는 상태.
- unmodified상태 : 최신 커밋 모습과 비교했을 때 전혀 바뀐게 없는 상태.
- modified상태 : 최신 커밋 모습과 비교했을 때 조금이라도 바뀐게 있는 상태.
용어
* branch
하나의 코드 관리 흐름이라고 볼 수 있는데, 커밋 하나를 가리키는 포인터이다.
* head
어떤 하나의 커밋 또는 하나의 브랜치를 가리킨다.
head가 branch를 통해 간접적으로 가리키는 커밋에 따라 working directory가 구성된다.
* tacking
로컬레포지토리의 한 브랜치가 리모트 레포지토리의 한 브랜치와 연결되어 그것을 계속 바라보는 상태가 되는 것.
("git push -u origin main" 커맨드를 사용할 때, "-u" 부분이 tracking connection을 하는 부분임)
* upstream branch
로컬레포지토리의 A브랜치와 리모트 레포지토리의 B브랜치가 있을 때,
tracking connection이 맺어진 후, B브랜치를 A브랜치의 upstream branch 라고 부른다.
첫 push까지 해야할 일
- 작업할 폴더 생성.
- git init
- git config user.name 'kanglocal'
- git config user.email 'kanglocal@gmail.com'
- git add .
- git commit -m "커밋 메세지"
- git remote add origin [깃허브 주소]
- git branch -M main (생략가능)
- git push -u origin main
커맨드들
git init
현재 디렉토리를 Git이 관리하는 working directory로 설정하여, 그 안에 레포지토리(.git디렉토리)를 생성한다.
git status
git이 현재 인식하고 있는 프로젝트 관련 내용들을 출력한다.
git help [커맨드 이름]
git 커맨드의 공식 매뉴얼 내용 출력.
* staging area 관련
git add [파일 이름]
수정사항이 있는 파일을 staging area에 올린다.
git add [디렉토리명]
해당 디렉토리 내에서 수정사항이 있는 모든 파일을 staging area에 올린다.
git add .
working directory 내의 수정사항이 있는 모든 파일들을 staging area에 올린다.
git reset [파일이름]
staging area에 올렸던 파일을 내린다.
* commit history 관련
git log
커밋 히스토리를 출력한다.
git log --pretty=oneline
커밋 히스토리를 한 줄로 예쁘게 가져온다.
git reflog
HEAD가 그동안 가리켜왔던 모든 커밋들의 로그 출력.
과거시점으로 reset을 한다음, 과거~현재 사이의 시점으로 이동을 원할 때 커밋아이디를 참조할 수 있다.
git log --all --graph
모든 브랜치의 커밋 히스토리를 커밋간의 관계가 잘 보이는 그래프 형식으로 출력.
git log --pretty=oneline --all --graph
모든 브랜치의 커밋 히스토리를 에쁘게 그래프형식으로 볼 수 있다.
git show [커밋아이디]
해당 커밋의 변경사항을 확인한다.
커밋아이디는 앞 4자리정도만 적어줘도 대체로 된다.
git show [태그명]
해당 태그와 관련된 커밋을 볼 수 있다.
git diff [커밋 a아이디] [커밋 b아이디]
두 커밋의 차이 비교.
git show 커맨드와 같은 내용을 볼 수 있다.
git tag [태그 이름] [커밋 아이디]
특정 커밋에 태그를 붙인다.
git tag -d [태그명]
해당 태그 삭제
git blame
특정 파일의 내용 한줄한줄이 어떤 커밋에 의해 생긴 것인지 출력
* commit 관련
git commit -m "[커밋 메세지]"
현재 staging area에 있는 것들을 커밋으로 남긴다.
git commit
mac기준 vim이 열려서 커밋로그를 작성할 수 있다.
더 복잡하고 긴 커밋메세지를 쉽게 저장 가능.
git commit --amend
가장 최근의 커밋을 수정해서 새로운 커밋으로 만든다.
'커밋메시지를 수정하거나 코드를 좀 더 수정한 후 커밋했어야했는데..' 할 때 사용.
git revert
특정 커밋에서 이루어진 작업을 되돌리는 커밋을 새로 생성한다.
git revert [대과거 커밋아이디].[과거 커밋아이디]
대과거를 제외한 대과거~과거 사이의 커밋들이 모두 revert된다.
git reset [옵션] [커밋아이디]
옵션에 따라 해당 커밋을 head를 이동시킨다. 커밋아이디 대신 HEAD위치를 기준으로 [HEAD^, HEAD~3] 으로 표기 가능하다.
--soft : HEAD를 특정 커밋으로 이동시킨다.
--mixed : HEAD를 특정 커밋으로 이동 + staging area도 특정 커밋으로 리셋.
-- hard : HEAD를 특정 커밋으로 이동 + staging area도 특정 커밋으로 리셋 + working directory도 리셋.
git cherriy-pick [커밋아이디]
특정 커밋의 내용을 현재 커밋에 반영.
* remote repository 관련
git push -u origin main
로컬 레포지토리의 내용을 처음으로 리모트 레포지토리에 올릴 때 사용.
git push --set-upstream origin main 의 축약형.
현재 로컬레포지토리 main에 있는 브랜치의 내용(브랜치와 관계된 모든 커밋들)을 origin 이라는 리모트 레포지토리로 보낸다는 의미.
이 때 같은 이름의 브랜치로 전송하는데, 만약 origin이라는 리모트 레포지토리에 main브랜치가 없다면 main브랜치를 새로 생성한 후 push한다.
git push
로컬 레포지토리의 내용을 리모트 레포지토리로 올린다.
git pull
리모트 레포지토리 -> 로컬레포지토리.
fetch + merge 해준다.
git clone [github 프로젝트 주소]
해당 프로젝트를 내 컴퓨터로 가져온다.
git fetch
로컬 레포지토리에서 현재 HEAD가 가리키는 브랜치의 upstream브랜치로부터 최신 커밋을 가져온다.
머지는 안해줌.
* branch 관련
git branch [새 브랜치 이름]
새로운 브랜치를 생성한다.
git checkout -b [새 브랜치 이름]
새로운 브랜치를 생성하고 그 브랜치로 이동한다.
"git branch [새 브랜치 이름] + git checkout [새 브랜치 이름]" 한 것과 같음 .
git branch
현재 프로젝트의 브랜치 목록 조회.
git branch -d [기존 브랜치 이름]
브랜치 삭제.
git checkout [기존 브랜치 이름]
해당 브랜치로 이동.
git merge [기존 브랜치 이름]
현재 브랜치에 다른 브랜치를 머지한다.
git merge --abort
git merge 커맨드 입력 후 conflict가 발생했을 경우, 머지를 취소하고 이전상태로 돌아갈 수 있다.
git rebase [브랜치 이름]
merge 와 비슷.
A, B 브랜치가 있고 현재 HEAD는 A 일 때, git rebase B 를 실행하면 A,B 브랜치가 분기하는 시작점의 커밋 이후로 존재하는 A브랜치상의 커밋들이 그대로 B브랜치의 커밋 이후에 이어붙여진다.
merge는 분기했다가 머지된 커밋로그가 남지만, rebase는 히스토리가 한 줄로 깔끔하게 보인다.
git rebase --continue
커늘릭트가 발생해서 제대로 진행되지 못한 rebase를 계속 진행시킨다.
* 임시저장
git stash
현재 작업 내용을 스택에 저장.
최근 커밋 이후 작업했던 내용을 모두 stack으로 옮기고, 워킹디렉토리 내부는 다시 최근 커밋의 상태로 초기화시킨다.
git stash list
stack에 쌓인 작업내용의 목록을 조회한다.
git stash apply [커밋 아이디]
스택 영역에 저장된 가장 최근의 또는 특정한 작업 내용을 working directory에 적용
커밋아이디 뿐아니라 "stash@{0}" 과 같은 형태의 번호로 적용할 수도 있다.(git stash list 커맨드를 통해 확인 가능)
git stash drop [커밋 아이디]
스택 영역에 저장된 가장 최근의 또는 특정한 작업 내용을 삭제
git stash pop [커밋 아이디]
스택 영역에 저장된 가장 최근의 또는 특정한 작업 내용을 working directory에 적용 후 스택에서 삭제
* config 관련
git config user.name '[사용자 이름]'
현재 사용자의 아이디를 설정한다.
git config user.email '[사용자 이메일]'
현재 사용자의 이메일 주소를 설정한다.
git config alias.[별명] [커맨드]
길이가 긴 커맨드에 alias를 줘서 다음번에 사용 시 alias로 사용 가능하다.
ex) git config alias.history 'log --pretty=oneline'
git config --unset alias.[별명]
해당 alias 삭제.
예시 문제 해결 방안
* 잘못된 브랜치에서 작업을 했을 때
A브랜치에서 작업을 했어야했는데, B브랜치에서 작업을 해버렸다면,
- 현재 작업을 git stash를 통해 저정
- A브랜치로 이동
- git stash apply
* 같은 이유로 커밋을 여러번 한 경우 히스토리를 정리하고 싶을 때
A함수를 생성 후 커밋했다가, 주석을 추가하며 다시 커밋했다. 그런데 히스토리를 하나로 남기고 싶다.
- git reset --soft 또는 git reset --mixed 를 사용해서 A함수를 만들기 전 커밋으로 리셋시킨다.
- 다시 커밋한다.
* reset을 했는데 reset 전으로 되돌리고 싶을 때
- git reflog를 통해서 reset전의 커밋아이디를 찾는다.
- git reset [reset전의 커밋아이디] 커맨드를 실행한다.
커밋 가이드
* 커밋 메세지 작성 가이드
- 제목과 상세설명 사이 한 줄을 비운다.
- 제목뒤에는 마침표를 찍지 않는다.
- 제목의 첫 번째 알파벳은 대문자로 작성한다.
- 커밋메세지의 제목은 명령조로( ex- fix it )
- 상세내용에는 왜 커밋을 했는지, 어떤 문제가 있었는지, 적용한 해결책이 어떤 효과를 가지는지 적는다.
- 다른 사람들이 자신의 코드를 바로 이해할 수 있다고 가정하지 말고 최대한 친절하게 작성하기.
* 커밋 가이드라인
- 하나의 커밋에 하나의 수정사항(하나의 이슈)를 해결한 내용을 담는다. 여러가지를 수정하고 한번에 커밋하는 것은 좋지 않다.
- 커밋으로 보관된 특정 시점의 전체코드는 항상 문제없이 실행되는 상태여야한다. 따라서 커밋 전에 프로그램이 정상 실행되는지 꼭 점검하고 커밋하도록 하자.
'Git' 카테고리의 다른 글
Git/GitHub Flow 브랜치 전략 (1) | 2023.09.15 |
---|---|
Git - branch merge 방법 (1) | 2023.09.14 |
크라켄, 이클립스 관련 (0) | 2023.03.13 |
Git/ Github (0) | 2023.03.13 |