2. Git 기초 사용법
1) Git 저장소 생성
- 로컬 디렉토리를 Git 저장소로 만드는 방법과 기존 저장소를 Clone하는 방법이 있다.
- init: 해당 디렉토리 내에서 'git init' 명령어를 실행해서 Git 저장소를 생성할 수 있다. 디렉토리 내에 .git이라는 하위 디렉토리를 생성한다.
- clone: 'git clone <url>' 명령어를 통해 저장소를 복제할 수 있다. 히스토리까지 전부 받아온 후 최신 버전을 Checkout한다. 명령어 뒤에 인자를 추가해서 폴더 이름을 지정할 수 있다.
2) 파일의 상태
- add, edit, stage, remove, commit 등의 동작을 통해 파일의 상태가 변화한다.
- Tracked: 이미 스냅샷에 포함되어 있던 관리 대상 파일을 의미하며 modified, unmodified 상태로 구분된다.
- Untracked: 워킹 디렉토리에 있는 파일 중 스냅샷에도 Staging Area에도 포함되지 않은 파일을 의미한다.
- 상태 확인: 'git status' 명령어를 사용해서 파일의 상태를 확인할 수 있다. '-s' 혹은 '--short' 옵션을 추가해서 요약된 상태를 확인할 수도 있다.
3) .gitignore
- 관리할 필요가 없는 파일을 무시하기 위해 '.gitignore' 파일을 생성해서 대상 패턴을 명시할 수 있다.
- 규칙
빈 라인이나 #을 통해 주석처리된 라인은 무시한다
표준 Glob 패턴을 사용한다.
슬래시(/)로 시작하면 하위 디렉토리에 적용되지 않는다.
디렉토리는 슬래시(/)를 끝에 사용하는 것으로 표현한다.
느낌표(!)로 시작하는 패턴의 파일은 무시하지 않는다.
- Glob 패턴: 간단한 정규식과 유사하며 보통 셸에서 많이 사용한다.
*: 문자가 하나도 없거나 하나 이상을 의미
**: 하위 디렉토리까지 포함
[abc]: 중괄호 안에 있는 abc 중 하나
[0-9]: 두 캐릭터(0, 9) 사이의 문자 중 하나
ex.
*.a : 확장자가 a인 파일 무시
!lib.a : a 확장자가 무시되었더라도 lib.a 파일은 무시하지 않음
/TODO : 현재 디렉토리의 TODO 파일만 무시
build/ : build 디렉토리의 모든 파일 무시
doc/*.txt : doc 디렉토리의 txt 파일을 무시(하위 폴더는 포함되지 않음)
doc/**/*.pdf : doc 디렉토리의 모든 pdf 파일 무시(하위 폴더 포함)
*https://www.gitignore.io/ 의 서비스를 통해 쉽게 파일을 작성할 수 있다.
4) diff 명령어
- 'git diff' 명령어를 사용해서 변경된 내용을 확인할 수 있다.
- diff 명령어는 워킹 디렉토리와 Staging Area를 비교하며 Unstaged 상태의 파일만 출력한다.
- Staged 상태의 파일을 확인하려면 --staged 혹은 --cached 옵션을 사용한다.
5) add 명령어
- 'git add <파일명>' 명령어를 사용해서 파일을 관리대상으로 추가할 수 있다.
- 해당 파일은 자동으로 staged 상태가 되며 파일 수정시 다시 add를 입력해서 staged 상태로 만들어주어야 한다.
- Merge 중 충돌된 상태의 파일을 Resolve 상태로 만들 때도 사용한다.
6) commit 명령어
- 'git commit' 명령어를 사용해서 staged 상태의 변경된 파일을 커밋할 수 있다.
- 커밋하기 전에 status 명령어를 사용해서 모든 파일이 staged 상태인지 확인할 수 있다.
- 별도의 옵션을 지정하지 않으면 설정된 편집기가 실행되어 커밋 메시지를 입력받는다.
- '-v' 옵션: 편집기에 diff 메시지가 추가된다
- '-m' 옵션: 메시지를 인라인으로 첨부할 수 있다.
- '-a' 옵션: add를 생략하고 Tracked 상태의 파일을 자동으로 Staging Area에 추가한다.
- '--amend' 옵션: 완료한 커밋 수정시 사용하는 옵션으로 이전 커밋을 덮어쓴다.
7) rm 명령어
- 'git rm <대상>' 명령어를 사용해서 Tracked 파일을 삭제할 수 있다.
- 워킹 디렉토리에 있는 실제 파일도 함께 삭제된다.
- Git 명령어를 사용하지 않고 파일을 삭제하면 삭제된 파일에 대한 정보도 Unstaged 상태로 남아있다.
- 여러개의 파일이나 디렉토리 삭제시 file-glob 패턴을 사용한다.(ex. git rm log/\*.log)
- '--cached' 옵션: Staging Area에서만 제거하고 워킹 디렉토리에서는 남겨둘 수 있기 때문에 실수로 추가된 파일을 삭제할 때 사용한다.
8) mv 명령어
- 'git mv <대상> <변경할이름>' 명령어를 통해 파일 이름을 변경할 수 있다.
- 다른 도구로 파일명을 변경하게되면 rm/add 명령어를 반드시 실행해야 한다.
9) log 명령어
- 'git log' 명령어를 통해 커밋 히스토리를 조회할 수 있다.
- 별도의 옵션이 없으면히스토리를 시간순으로 출력한다.
- '-p' 옵션: 각 커밋의 diff 결과를 출력한다.
- '-<n>' 옵션: n개의 해당하는 결과만 출력한다.
- '--stat' 옵션: 각 커밋의 통계 정보를 확인할 수 있다. 요약된 정보는 가장 뒷편에서 출력된다.
- '--pretty' 옵션: 출력 옵션을 설정할 수 있다. oneline, short, full, fuller, format 옵션이 있으며 'git log --pretty=출력옵션' 의 형태로 설정한다. format 옵션의 경우 출력 포맷을 커스터마이징 할 수 있다.
- '--graph' 옵션: 브랜치와 머지 히스토리를 보여주는 아스키 그래프를 출력한다.
- 그 외에도 --shortstat, --name-only, --name-status, --abbrev-commit, --relative-date 옵션이 있다.
- 조회 범위 제한 옵션: -<n> 과 같이 조회의 범위를 제한하는 옵션으로 --since, --after, --until, --before, --author, --committer, --grep, -S 옵션이 있다.
10) reset 명령어
- 'git reset <파일명>' 명령어로 staged 상태의 파일을 unstaged 상태로 변경할 수 있으며 Staging Area의 파일만 변경된다.
- '--hard' 옵션: 워킹 디렉토리의 파일까지 수정한다.
11) checkout 명령어
- 'git checkout -- <파일명>' 명령어를 통해 수정된 파일을 되돌릴 수 있다.
- 수정한 내용이 전부 사라지기 때문에 데이터를 잃을 수 있다. stash와 branch를 사용하면 데이터 손실 없이 되돌릴 수 있다.
12) remote 명령어
- 리모트 저장소란 네트워크에 존재하는 저장소를 뜻하며 다수의 작업자가 저장소를 함께 사용할 수 있다.
- 저장소를 clone할 경우 origin이란 이름으로 리모트 저장소가 추가된다.
- 'git remote' 명령어를 통해 등록된 리모트 저장소를 확인할 수 있다.
- 'git remote show <리모트 저장소 이름>' 명령어를 통해 구체적인 정보를 확인할 수 있다.
- 'git remote rename <리모트 저장소 이름> <변경할 이름>' 명령어를 통해 리모트 저장소의 이름을 변경할 수 있다.
- '-v' 옵션: 단축 이름과 URL을 함께 확인할 수 있는 옵션
- 'git remote add <리모트 저장소 이름> <url> 명령을 통해 새 리모트 저장소를 추가할 수 있다.
13) fetch, pull, push 명령어
- 'git fetch <리모트 저장소 이름>' 명령어를 통해 데이터를 동기화할 수 있다.
- 'git pull' 명령어를 통해 자동으로 로컬 브랜치와 merge시킬 수 있다.
- 'git push <리모트 저장소 이름> <브랜치 이름>' 명령어를 통해 upstream 저장소에 동기화시킬 수 있다. 단 쓰기 권한이 있고 아무도 push한 이력이 없을 때만 가능하다.
14) tag 명령어
- Git에서 태그를 지원하며 보통 릴리스에 사용한다.
- push 명령어는 자동으로 리모트 저장소에 태그를 전송하지 않기 때문에 'git push <리모트 저장소 이름> <태그 이름>' 의 형태로 별도 push 과정이 필요하다. '--tags' 옵션을 통해 여러개의 태그를 한 번에 전송할 수도 있다.
- Lightweight 태그와 Annotated 태그로 구분되며 Lightweight 태그는 특정 커밋에 대한 포인터로만 사용하고 Annotated 태그는 관련 정보를 함께 저장한다.
- 태그는 브랜치와 달리 대상 커밋을 바꿀 수 없기 때문에 checkout이 불가능하다.
- 'git tag' 명령어를 통해 이미 만들어진 태그를 확인할 수 있다.
- '-l' 옵션: "git tag -l '패턴'" 명령어를 통해 패턴에 맞는 태그만 검색할 수 있다.
- '-a' 옵션: Annotated 태그를 생성한다. 마지막에 커밋 체크섬(일부만 명시해도 무관함)을 명시할 경우 해당 커밋에 태그할 수 있다.(ex. 'git tag -a v1.2 9fceb02')
- '-m' 옵션: Annotated 태그 생성시 함께 사용해서 인라인으로 메시지를 추가할 수 있다. '-m' 태그를 사용하지 않으면 편집기가 실행된다.
15) Alias
- 자주 사용하는 명령어에 별명을 만들어서 쉽게 사용할 수 있다.
- "git config --global alias.<별명> '<명령어>'"의 형태로 명령어를 Alias를 지정한다.
- 예시
> git config --global alias.unstage 'reset HEAD --'
> git unstage <파일>
'프로그래밍 > Git' 카테고리의 다른 글
[Git 요약] 1. Git 기본 이론 (0) | 2019.06.15 |
---|