git이란 소프트웨어 개발에서 사양되는 분산 버전 관리 시스템이다. git을 이용하면 코드의 버전관리를 쉽게할 수 있으며, 협업하기가 용이하다.
자주 사용하는 git 명령어를 정리하여 필요 시 참고하고자 한다.
1
2
3
4
5
| $ git status: git 상태 확인
$ git add *: 모든 파일 스테이징
$ git commit -a -m "message": message로 스테이징과 커밋을 한번에
$ git log --stat: log에 어떤 파일이 수정되었는지 보여줌
$ git commit --amend: 마지막에 commit한 comment 수정
|
1
2
3
4
5
6
| $ git branch: git branch 확인
$ git switch name: name으로 branch 이동
$ git switch -c name: name이라는 브랜치를 생성하고 이동
$ gir branch -D name: name이라는 브랜치를 강제삭제
$ git branch -m newname: branch 이름을 newname으로 변경(바꾸고자 하는 브랜치에서 실행)
$ git checkout -b newname: newname이라는 이름의 브랜치를 생성하고 이동
|
1
2
3
4
5
| $ git checkout HEAD~1: head 이전 1칸으로 checkout
$ git checkout -: checkout으로 넘오오기 바로 이전 commit으로 돌아감
$ git checkout 파일명: 파일명에서 작업했던 내용을 모두 다 삭제하고 싶을 때(즉, working directory 내용 삭제)
새로 작성한 것들이 다 사라지고 마지막 커밋으로 되돌림
같은 명령어는 git restore 파일명
|
1
2
3
4
5
6
| $ git diff: staging 되지 않은 working directory 파일과 commit된 것이랑 비교함
$ git diff: HEAD:마지막 commit 이후 변경된 모든 것을 보여줌
--> working directory, staging aerea 에있는 것을 모두 commit 된 것과 비교함
$ git diff --staged or git diff --cached: staging 영역과 commit 된 것을 비교
$ git diff branch1..branch2: branc1과 branch2와 비교. branch1 대비 branch2가 바뀐 것을 비교
$ git diff hash1..hash2: hash1 대비 hash2가 어떤 것이 바뀌었는지 비교
|
1
2
3
4
5
6
7
8
9
| $ git stash: 변경 사항을 임시로 저장
$ git stash pop: 가장 최근의 stash를 불러옴
$ git stash apply: 가장 최신의 stash를 불러옴
stash 영역에 해당 stash 파일이 남겨져 있음
--> pop과 apply의 차이점: pop 한 번만 가능, apply는 여러번 가능
$ git stash list: git stash 명령어를 여러번 사용한 경우, stash list를 볼 수 있음
$ git stash apply stash@{2}: stash list의 stash@{2}의 내용을 불러옴
$ git stash drop stash@{2}: stash list의 stash@{2}를 제거함
$ git stash clear: stash 내용 모두 삭제
|
1
2
3
4
5
6
7
8
| $ git reset HEAD^: 직전에 커밋한 것을 취소. (--mixed가 default option임)
$ git reset --hard <hash>: hash 까지 돌아가는데, 작업헀던 내용도 모두 사라짐
$ git reset --mixed <hash>: hash 까지 돌아가는데, 작업했던 내용 모두 살아있음(unstaging 상태)
$ git reset --soft <hash>: hash 까지 돌아가는데, 작업했던 내용 모두 살아있음(staging 상태)
$ git revert HEAD^: 직전에 커밋한 것을 취소. (--mixed가 default option임)
$ git revert --hard <hash>: hash 까지 돌아가는데, 작업헀던 내용도 모두 사라짐
$ git revert --mixed <hash>: hash 까지 돌아가는데, 작업했던 내용 모두 살아있음(unstaging 상태)
$ git revert --soft <hash>: hash 까지 돌아가는데, 작업했던 내용 모두 살아있음(staging 상태)
|
1
2
3
4
| $ git rebase master: master를 graph의 아래로 내리는 것
$ git rebase --abort: 충돌이 발생했을 떄, rebase를 취소할 수 있음
$ git rebase --continue: 충돌 발생했을 떄, 충돌 내용 수정하고 해당명령어를 입력하여 rebase를 계속 진행함
$ git rebase --quit: 리베이스 다하고 종료??? 이거 꼭 해야되나? 강의에ㅐ는 없음
|
1
2
3
4
5
6
7
| $ git tag tagname <특정commit>: 특정 커밋에 tagname을 붙임
$ git tag tagname <특정commit> -f: tagname을 특정 commit으로 이동시킴
$ git tag -d tagname: tagname을 삭제
$ git show tagname: tagname에 대한 정보를 볼 수 있음
$ git push origin mytag: origin 원격저장소에 mytag라는 것만 추가
$ git push origin --tags: origin 원격저장소에 내 모든 태그를 추가
==> 태그는 자동으로 푸쉬되지 않는다! 따로 푸쉬 해줘야됨
|
1
2
3
| s = status; --> status를 s 로 바꾸는것
l = log
cm = commit -m
|
1
2
3
4
5
6
7
8
9
10
11
| global git config
- 각각의 깃에는 local config 파일이 있음
- global로 설정할 수 있는 git은 C:/user/.gitconfig 안에 있음
--> 안에 들어가서 바꾸면 명령어로 바꾼것과 동일한 효과임
--> git config --global user.name 이런것들이 글로벌로 설정하는 것
git config user.name: user 이름 확인
git config --global user.name "name": name으로 유저이름 변경(또는 --local 명령어 사용 가능)
git config user.email: 유저 메일 확인
git config --global core.editor "code --wait": 에디터를 VSC로 변경
git log --oneline: 한줄로 로그 표ㅕ시
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| * reflog: reference log의 줄임말
.git/log 의 HEAD파일을 보면 HEAD의 이동이 저장되어 있음
local에서만 관리되고, 영구적이지 않고 지워짐(90일 까지만 저장)
git reflog show HEAD: 어떤 명령어를 입력했는지 보여줌.
--> 해당 명령어에 대한 hash까지 가지고 있음
-->
git reflog show branch명: 해당 branch에 대한 commit, merge 등의 변경사항을 알 수 있음
git reflog show HEAD@{10}: 헤더의 10번째 움직임 전부터의 움직임부터 보여줌(참고로 0이 최신)
gif diff HEAD@{0} HEAD@{5}: 지금과 5번째 움직임 전과의 어떤 차이가 있는지 보여줌
git diff HEAD HEAD@{yesterday}: 어제와의 차이( 딱히 유용하지는 않음)
git reflog show HEAD@{2.day.ago}: 과거부터~이틀 전까지의 모든 것을 보는것? (시간을 포함해서 보여줌)
git reflog show HEAD@{one.minute.ago} 과거부터~현재부터 1분전까지의 모든 것을 보여줌?
git checkout master@{1.week.ago}: 대충 1주일 전 커밋으로 checkout함
git reflog를 이용해서 삭제된 커밋의 hash를 얻을 수 있고, 그 해쉬를 통해 복구를 할 수 있음(
--> git log에서는 볼 수 없는 해쉬를 볼 수 있음
git reset --hard master@{1}: 해당 커밋이 복구됨(근데 reflog는 local에만 존재하니까 local 에서만 가능함!)
reflog에는 commit한 내역까지 모두 있기때문에 rebase 했어도 복구가 가능함
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| git remote -v: 연결되어 있는 저장소를 보여줌
git remote add <name> <URL>:
git remote rename <old> <new>
git remote remove <name>
git push <remote> <branch>: 특정 branch를 push
git push <remote> <local-branch>:<remote-branch>: local branch를 remote branch로 push. 각 branch의 이름이 다를 경우 사용
git push -u origian branch: branch를 upstream해서 local branch랑 remote branch랑 일치하게 해줌
git branch -M main: 현재 브랜치의 이름을 main으로 변경
git branch -r: 원격 브랜치 보기
git switch branch명: 이렇게 branch로 스위치하면, 로컬에서 해당 branch를 만들고 원격 브랜치에 자동으로 붙여줌
-> 즉, 원격 branch를 clone해 와서 작업할 때, 다른 branch가 보이지 않는다면 이렇게 이동해야됨
git fetch <remote> <branch>: remote repository에 있는 것을 local repository로 가져옴
git fetch:
-> 현재 작업중인 것은 만지지 않고, 최신 커밋을 가져오는 것
-> 내가 작업하던 것과 기존 branch와 분리가 됨
git pull: fetch과 merge를 한번에 수행한 것
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| .git안의 내용물들
- config는 설정을 위한 파일
- refs/heads는 각 브랜치의 해시값이 저장되어 있음
- HEAD: HEAD가 가리키는 위치정보가 들어있음
- objects: 아래 4 types의 정보가 저장되어 있음
(*깃에서는 SHA-1 hashing function을 사용하고 있음)
-주-> commit
--> tree
--> blob
--> annotated tag
echo "hi" | git hash-object --stdin -w: git objects 폴더에 해쉬를 만듬
git cat-file -p 해쉬: 해당 해쉬에 저장된 값을 읽음, 즉 해당 해쉬가 가리키고 있는 곳의 정보를 읽는 것?
(글자 크기에 관계없이 해쉬의 길이는 같음)
git hash-object 파일이름: 해당 파일에 대한 해쉬값이 나옴(내용물이 바뀌면 해쉬값이 바뀜)
git hash-object 파일이름 -w: 해당 파일에 대한 해쉬값이 나옴
git cat-file -p 해쉬: 해당 해쉬가 가리키고 있는 곳의 정보가 나옴
git cat-file -p 해쉬 > 파일이름: 파일이름에 해쉬가 가르키는 정보를 써 넣음. 즉, 복원할 수 있음
*blob(binary large objects) blob은 git이 파일의 내용물을 저장할 떄 사용하는 하나의 타입
* Trees: tree는 directory의 내용을 저장하는 git object임
git cat-file -p master^{tree}: 각 파일이 tree, blob인지 확인할 수 있음(폴더는 tree로 저장되는듯?)
git cat-file -p hash: 해당 캐쉬가 가리키는 값을 읽을 수 있음
git cat-file -t hash: 해당 해쉬가 tree인지 blob인지 알 수 있음
git restore --source HEAD~1 <파일명>: 헤더기준으로 1단게 이전 상태로 돌아가서 복원 진행
git restore --staged <파일명>: 해당 파일을 unstage 함
|