Git, 분산버전 관리 시스템
Git을 사용하는 사람들을 위한 웹기반 호스팅 서비스로 저장소, 협업 공간을 제공한다. git 명령어를 사용하여 Github가 제공하는 원격저장소에 연결하고 관리한다.
본 내용은 저자의 저장용 자료이므로 시중에 나와있는 더 퀄리티 있고 조리있게 설명된 자료를 보세요..
들어가기에 앞서
사용자명과 이메일을 셋팅하여준다.
그 후 사용하고자 하는 디렉토리로 간 후 git init "저장소이름"을 통해 로컬에 저장소를 생성한다.
ls -al로 모든 파일을 볼경우 .git 디렉토리가 생성되어 있는것을 볼 수 있다. 이 파일이 모든 내용의 핵심이다.
Working Directory는 현재 에디터의 상태
Staging Area(index)는 stage를
Repository는 저장소를 말해준다(.git)
remote(=github,bitbucket)
기본시작
status
현재 git의 상태를 알려준다.
stage에 올라온 파일 올라오지 않은 파일 그리고 현재 작업중인
브랜치에 대한 설명이 나오게
log
커밋한 기록을 알려준다.
p and b
-f는 다음 log를 조회하고 -b는 이전 log를 조회한다.
화면에서 빠져나올 땐 log 키를 누른다.
log --stat
커밋의 대한 통계를 볼 수 있다.
얼마나 많은 파일이 얼마나 많은 라인이 변경되었는지
알 수 있다.
log --pretty=format
나만의 포맷으로 결과를 출력하고 싶을 때 사용된다
차이점을 그래프로 볼 수 있음
log --pretty=oneline
한줄씩 확인
log --since=2.weeks
지난 2주간만
git log --online
커밋내역이 한줄씩만 나옴
git log --online --graph = branch
상속관계가 별표로 함께나옴
git log --online --graph --decorate
브랜치가 어떤 커밋을 가리키는지도 확인
git log --online --graph --decorate --all
repo 안에서 모든 브랜치의 history 조회가능
옵션
인자 | 설명 |
---|---|
-(n) | 최근 n개의 커밋만 조회한다. |
--since, --after | 명시한 날짜 이후의 커밋만 검색한다. |
--until, --before | 명시한 날짜 이전의 커밋만 조회한다. |
--author | 입력한 저자의 커밋만 보여준다. |
--committer | 입력한 커미터의 커밋만 보여준다. |
--grep | 커밋 메시지 안의 텍스트를 검색한다. |
-S | 커밋 변경 내용안의 텍스트를 검색한다. |
init
현재 폴더를 git을 이용하여 저장소를 생성한다.
add
모든 파일을 스테이지에 올린다.
commit
커밋을 하는 명령어(스테이지에 올라있는 내용을 저장소로 옮긴다)
ls-files
현재 working dir에 올라가 있는 파일들을 조회할 수 있다.
untacking 되어 있는이 있을경우 함께 표시된다.
diff
차이점을 볼 수 있다.
git diff
untracked 파일의 변경사항까지 볼 수 있다.
git diff --cached
tracked 되어 있는 파일만 볼 수 있다
git diff HEAD
HEAD(가장최신 커밋)과의 비교를 할 수 있다.
rm
파일을 untrack 하고 삭제한다.
해당 명령어를 작성하여도 커밋하기 전까지는 남아있게된다.
git add -u를 하여야 삭제가 stage에 반영된다.
--cached 옵션을 사용할 경우 untack만 하고 실제 워킹디렉토리에는 남겨둘 수 있다. 대용량 로그파일등을 실수로 커밋했을 때 유용함
checkout
실수로 파일등을 삭제했을 때 chkecout을 사용하여
복구할 수 있다.
mv
git mv를 사용할 경우 바뀐 파일명이 자동으로 stage에
올라가게 된다.
gitingore
기본정의
아무것도 없는 라인이나, #로 시작하는 라인은 무시한다.
슬래시(/)로 시작하면 하위 디렉토리에 적용되지 않는다.
디렉토리는 슬래시(/)를 끝에 사용하는 것으로 표현한다.
느낌표(!)로 시작하는 패턴의 파일은 무시하지 않는다.
예시
.*.swp - vim이 생성한 임시파일인 .swp 파일은 무시한다.
*.a - 확장자가 .a인 파일은 무시한다.
!lib.a - 윗 줄에서 확장자가 .a인 파일은 무시하게 했지만 lib.a는 무시하지 않는다.
/TODO - 루트 디렉토리에 있는 TODO 파일은 무시하고 subdir/TODO처럼 하위 디렉토리에 있는 파일은 무시하지 않는다.
build/ - build/ 디렉토리에 있는 모든 파일은 무시한다.
doc/*.txt - 'doc/notes.txt' 같은 파일은 무시하고 doc/server/arch.txt 같은 파일은 무시하지 않는다.
doc/**/.pdf - doc 디렉토리 아래의 모든 .pdf 파일을 무시
아래 사이트를 참조하자
gitignore generator
alias
custom command
git hist = log --online --graph --decorate -all
git config --global --list
모든 alias를 볼 수 있다.
--unset
lg명령어 삭제
심화학습
fast-forward 병합
위와 뒤의 master가 앞의 브랜치에 합쳐지는걸 fast-forward병합
즉 브랜치를 마스터 삼아 진행
non-fast-forward
위와 같이 브랜치가 마스터에 병합으로 합쳐지는걸 non-fast
branch
git checkout -b 브랜치명
= 브랜치를 바꾸고 head의 포인터를 바꾼다.
git diff branch1 branch2
브랜치 간의 차이를 볼 수 있음
git merge branch1
브랜치 병합
git branch -d branch1
branch1과 병합 한번 merge 하고나면 해당 브랜치는 필요가 없어지므로
git branch -d 브랜치 명을 통해 브랜치를 삭제하자
브랜치를 삭제하여도 내용음 남아있고 단지 라벨만 삭제되는 것
branch 충돌
브랜치가 충돌이 날 경우 충돌의 원인이 되는 파일들이 뜨게 되는데
이경우 수동으로 전부 확인을 해주어야 한다.
git difftool을 통해 볼경우 화면이 4개가 출력된다
기존내용 브랜치내용 수정할내용 그리고 맨아래 적절한 브랜치 수정내용이
출력된다.
적절히 수정을 거친 후 git commit을 할경우 .orig 파일이 생성되는데
original version의 파일이다.
tag
git tag 태그명
태그를 붙일 수 있다.
git tag --list를 할경우 태그의 리스트를 볼 수 있으며
git hist를 했을 때 태그가 출력된다.
git tad -d 태그명 을할경우 태그가 삭제되며
commit을할 때 git tag -a 태그이름 -m "커밋메세지"
를 할경우 자동 태그 추가
stash
현재 작업을 저장한채로 checkout 상태로 돌아가기 위해 사용된다
git stash를 할 경우 전부 저장이 되고 last commit 상태로 남게된다.
git stash list를 할 경우 stash된 내용들이 나타나게 되며
git stash pop을 할경우 stash 상태로 돌아감
reset
--mxied
--hard
--soft
cherry-pick
특정 브랜치 내용을 커밋
-n을 넣을경우 내용을 가져오지만 commit은 하지 않는다
과거의 commit과 합칠경우는 rebase를 쓴다.
rebase
rebase로 커밋을 직접적으로 수정할경우 다른 모든 사람들의 커밋과의
충돌이 생길 수 있으므로 협업에서는 자제하자
과거의 커밋과 합치고 싶을경우 git rebase -i HEAD~~를 쓰자
그러면 텍스트 에디터가 열리고 다음과 같이 뜬다
이때 두번째 줄의 pick 문자를 squash로 변경하고 저장 종료하면
해당 squash 내용이 병합된다.
콘솔이 열렸을 때 edit으로 변경 저장 종료할경우 커밋한 내용이 뜨게 되는데
요기서 수정을 하여준다.
기존내용과의 충돌이 있는경우 충돌 내용을 수정한 후 git add를 해준다
그 후 git commit -amend로 커밋을 한 후 마지막으로 git rebase --continue
로 마무리 지어준다.
중간에 rebase 작업을 중지하고자 한다면 git rebase --abort
rebase 이후에도 ORIG_HEAD라는 이름으로 커밋이 남아있으며 rebase이전
상태로 복구하고싶다면 git reset --hard ORIG_HEAD
--reset
git reset file.txt = git reset --mixed HEAD file.txt
file.txt 파일 복구
--soft
HEAD 포인터만 바꾼다
--mixed
Stage 내용까지만 바꾼다.
--hard
현재 디렉토리 내용까지 전부 바꾼다.
되돌리기 위해선 reflog를 통해 복구되어야 한다(커밋한 내용이
아니라면 복구 불가)
reflog를 통해 커밋내용을 확인 후 git rest --hard id값
reset과 checkout
reset mixed은 워킹디렉토리는 보존하지만 checokut은 전체를 바꾼다.
원격저장소
git remote add origin 주소
git remove -v 하면 정보 조회가능
fetch
remote가 변경되고 로컬도 변경되었을 때
로컬에선 remote가 체인지된지 모르기에 push를 하게되면
push가 되질 않는다. 이럴땐 fetch를 쓴다.
fetch를 쓸경우 commit까지는 되지 않는다. commit 되지 않으면서
원격 저장소 최신의 내용을 확인 가능하다
fetch를 수행할 경우
origin master의 최신 내용은 FETCH_HEAD이다
FETCH_HEAD 라는 브랜치로 merge하거나 다시 pull 할 수 있다.
(PULL은 FETCH and MEGE 이다)
pull
아무이상 없을경우 자동적으로 병학이 되지만
충돌사항이 있을 경우에는 전부 수정을 해 준 후 commit을 해야한다.
위와같이 원본과 나의 디렉토리에 충돌이 발생한다
이럴경우 새 commit을 해주자