본문 바로가기

프로그래밍/Git

[Git 요약] 2. Git 기초 사용법

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